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

  • 例如,我的答案是“Michael Jordan”或另外两个单词。如果用户输入Michael Jordan,我会很高兴,但是如果他输入Jordan,Michael就会麻烦。它将弹出错误的答案警报。有没有办法接受这些单词打乱?
  • 另外,如果我的答案是“Balls”,并且用户键入“ball”,这将是错误的查询。如何确保所有单数和复数都被接受?
  • 最佳答案

    模糊字符串比较算法

    下面的自定义暴力破解方法提供了单词交换功能,使您可以完全控制元音/辅音得分阈值,但可以增加比较的总数。

    您还将需要检查此线程中描述的方法,例如Apache Lucene:Fuzzy string search library in Java

    自定义模糊比较配方:

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

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

    关于java - 比较时,如何接受近似正确的字符串?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15822937/

    10-12 00:29
    查看更多