通过模糊匹配检测重复的名称

时间:2012-11-26 18:34:46

标签: c algorithm sqlite search fuzzy-search

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

表:

1 | Tim Best
2 | Roger Thomas
3 | Roper Bar
  • 如果用户输入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解决方案。

1 个答案:

答案 0 :(得分:1)

有几种尝试来解决模糊字符串匹配问题。谷歌告诉你很多,wikipedia也是如此。最受欢迎的是Levenshtein。其他有趣的方法是Jaro-WinlerTrigram matching

我个人的经验表明,你必须使用现有的算法。我有一个问题要匹配“FirstName LastName”和“LastName,FirstName”,唯一适合我需要的算法是修改后的Trigram,我是根据提供的链接开发的。

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

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