我有一个sqlite数据库,它有(用户id,名称)。我想检测一个用户名是否已经在系统中。问题是,这个名字来自一个用户,这意味着他可能拼错了名字,也可能是名字的另一个版本:“tim”vs“timothy”。所以我想要一个函数,它能找到与输入最接近的匹配,并给出相似度的置信度来确定是否存在匹配。置信度应该在0到1之间(这样我就可以设置一个有意义的截止值)。
表格:
蒂姆·贝斯特
2罗杰·托马斯
3 |钢筋
如果用户输入Timothy Bert
,则函数应返回1 | Tim Best | 0.8
(0.8是置信度,如果这是它发生的情况)。
如果用户输入Roper Thomas
函数将返回2 | Roger Thomas | 0.6
如果用户输入Tim Taylor
函数将返回1 | Tim Best | 0.3
如果用户输入Foo Taylor
函数将返回2 | Roper Thomas | 0.0
理想情况下,最好能用SQLite编写一个查询来完成这项工作,但如果这不可能,我也会使用c解决方案。
最佳答案
有几次尝试解决模糊字符串匹配。谷歌告诉你很多,而且wikipedia。最受欢迎的是Levenshtein其他有趣的方法是Jaro-Winler和Trigram matching。
我个人的经验说,你必须绕过现有的算法。我在匹配“FirstName LastName”和“LastName,FirstName”时遇到了一个问题,唯一适合我需要的算法是一个修改过的三元组,我是从提供的链接中开发出来的。
为了您的需要,您还应该保留一个名称缩写字典,以便您可以将每个短格式转换为其基本名称,然后进行模糊比较。然而,这很可能会失败,例如“tin taylor”中“tin”拼写错误的“tim”不会导致“timothy taylor”。
为了涵盖这一点,您需要一个可以“学习”的查找,即由某些人编辑。