java - 比较时如何接受大致正确的字符串?

标签 java android sqlite

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

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

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

最佳答案

模糊字符串比较算法

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

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

自定义模糊比较方法:

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

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

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

相关文章:

java - Spark Java API 中 Scala some 和 none 的等价物

java/安卓 : editing an object after clone/duplicate also edits the original

java - 迁移到 JBoss EAP 7 后找不到通过注释选择 CDI 实例

android - flutter image_cropper 崩溃

java - SQLite 扩展 SQLiteOpenHelper 的奇怪错误

java - 如何从适配器类处理/扩充多个 recycleview Activity

android - 这是什么意思 ls = new LocalServerSocket ("mycomputer")?

android - 正确实现/初始化大量新变量,取自 RadioGroups 和 Spinners

r - SQLite 和 R 交互

python - django 找不到新的 sqlite 版本? (需要 SQLite 3.8.3 或更高版本(发现 3.7.17))