3

我有一个预填充的 sqlite 数据库导入到 assets 文件夹中,我用它来为我的按钮设置一些文本,并将用户的输入与我在该数据库中的正确答案进行比较。但是我有两个问题我不知道如何解决。

  1. 例如,我有一个答案是“迈克尔乔丹”或其他两个词。我有一个用户输入迈克尔乔丹,我很高兴,但如果他输入乔丹迈克尔,我就有麻烦了。它会弹出一个错误的答案警报。有没有办法接受这些词洗牌?

  2. 另外,如果我有一个答案“Balls”并且用户输入“ball”,这将是错误的回答。如何确保所有单数和复数都被接受?

4

2 回答 2

3

模糊字符串比较算法

下面的自定义蛮力方法提供了单词交换,让您完全控制元音/辅音分数阈值,但增加了比较的总数。

您还需要检查此线程中描述的Apache Lucene等方法: Java 中的模糊字符串搜索库

自定义模糊比较配方

  1. 小写:所有比较都将使用小写文本。要么确保参考数据库中的所有单词都是小写,要么String.toLower()在比较之前对数据库中的每个项目使用 a。显然,预处理数据库中的列表将显着提高性能。
  2. 删除空格和标点符号:您必须创建一个函数,从任何短语中删除所有空格和其他标点符号。您的参考资料中应该有一个单独的列,其中包含预先计算的此信息以提高性能。
  3. 自定义比较功能:您的String比较功能将比较每个字符并根据字母的接近程度分配自定义分数,其中最低分数表示最佳匹配。例如,相同的字符将添加零分。每个不匹配的辅音对将在分数上加 2。每个不匹配的元音将加 1。混合的不匹配将加 3。按字符数归一化分数。应用一个简单的阈值来确定可接受的匹配。在上面的例子中,threshold=0.2每 5 个字符大约允许出现一个小错误(这可以解决简单的拼写错误,但不会丢失字符。请参见下面的步骤 4)。
  4. 额外或缺失字符:在每个比较中循环每个字符位置的额外时间。一次在那个位置没有角色,一次在那个位置有一个额外的角色。报告所有循环的最小分数。将该分数与阈值进行比较。如果分数低于阈值,则跳出循环并停止比较,从而表示匹配。这将捕获拼写错误,例如“collage”的“colage”。
  5. Swap Words:在步骤#4的循环之后,如果分数仍然高于阈值,则循环输入短语的每个单词并与其最近邻的相邻单词交换。并重新运行比较套件。显然,您将不得不查看原始原始用户短语来查找单词边界,而不是第 2 步中没有空格和标点符号的已处理短语。这将满足您允许“Jordan Michael”替换“Michael Jordan”的要求。

对于超过 2 个单词的长条目,此方法将导致每个数据库条目进行 10 次或更多的比较,因此肯定会影响性能。

于 2013-04-05T00:05:15.520 回答
0

这是一个很好的问题。我认为,实际上你需要一本“有效”单词的字典。然而,字典本身并不能解决你的问题。您还需要一组基于您的字典的启发式方法来确定有效条目的构成。

我很想在这里尝试“尝试”,因为您可以比替代方法更好地封装富文本库。尝试,在这种情况下,将提供与说字典等类似的性能。使用尝试的额外好处是向您的应用程序添加新单词/短语是相当简单的。不利的一面是,尝试使用大量内存。也就是说,有一些技术可以用来压缩数据。

于 2013-04-04T22:50:38.310 回答