我有一个预填充的 sqlite 数据库导入到 assets 文件夹中,我用它来为我的按钮设置一些文本,并将用户的输入与我在该数据库中的正确答案进行比较。但是我有两个问题我不知道如何解决。
例如,我有一个答案是“迈克尔乔丹”或其他两个词。我有一个用户输入迈克尔乔丹,我很高兴,但如果他输入乔丹迈克尔,我就有麻烦了。它会弹出一个错误的答案警报。有没有办法接受这些词洗牌?
另外,如果我有一个答案“Balls”并且用户输入“ball”,这将是错误的回答。如何确保所有单数和复数都被接受?
下面的自定义蛮力方法提供了单词交换,让您完全控制元音/辅音分数阈值,但增加了比较的总数。
您还需要检查此线程中描述的Apache Lucene等方法: Java 中的模糊字符串搜索库
自定义模糊比较配方:
String.toLower()
在比较之前对数据库中的每个项目使用 a。显然,预处理数据库中的列表将显着提高性能。String
比较功能将比较每个字符并根据字母的接近程度分配自定义分数,其中最低分数表示最佳匹配。例如,相同的字符将添加零分。每个不匹配的辅音对将在分数上加 2。每个不匹配的元音将加 1。混合的不匹配将加 3。按字符数归一化分数。应用一个简单的阈值来确定可接受的匹配。在上面的例子中,threshold=0.2
每 5 个字符大约允许出现一个小错误(这可以解决简单的拼写错误,但不会丢失字符。请参见下面的步骤 4)。对于超过 2 个单词的长条目,此方法将导致每个数据库条目进行 10 次或更多的比较,因此肯定会影响性能。
这是一个很好的问题。我认为,实际上你需要一本“有效”单词的字典。然而,字典本身并不能解决你的问题。您还需要一组基于您的字典的启发式方法来确定有效条目的构成。
我很想在这里尝试“尝试”,因为您可以比替代方法更好地封装富文本库。尝试,在这种情况下,将提供与说字典等类似的性能。使用尝试的额外好处是向您的应用程序添加新单词/短语是相当简单的。不利的一面是,尝试使用大量内存。也就是说,有一些技术可以用来压缩数据。