3

我有一个具有 (user_id, name) 的 SQLite 数据库。我想通过名称检测用户是否已经在系统中。问题在于该名称来自用户,这意味着他可能拼错该名称,或者它可能是该名称的替代版本:“Tim”与“Timothy”。所以我想要一个函数,它可以找到与输入最接近的匹配项,并给出相似度的置信度来确定是否存在匹配项。置信度应该在 0 到 1 之间(这样我就可以设置一个有意义的截止值)。

桌子:

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 中编写一个查询来执行此操作,那将是最好的,但如果那不可能,我也会采用 ac 解决方案。

4

1 回答 1

1

有几种解决模糊字符串匹配的尝试。谷歌告诉你很多,维基百科也是如此。最受欢迎的是Levenshtein。其他有趣的方法是Jaro-Winler和Trigram匹配

我的个人经验表明,您必须使用现有的算法。我在匹配“FirstName LastName”与“LastName,FirstName”时遇到了问题,唯一适合我需要的算法是我从提供的链接开发的修改后的 Trigram。

根据您的需要,您还应该保留一个名称缩写字典,以便您可以将每个简短形式转换为其基本名称,然后进行模糊比较。然而,这很可能会失败,例如“Tin Taylor”,其中“Tin”拼写错误“Tim”不会导致“Timothy Taylor”。

为了涵盖这一点,您将需要一个可以“学习”的查找,即由某些人编辑。

于 2012-11-26T22:05:52.723 回答