2012-11-26 162 views
3

我有一个SQLite数据库(user_id,name)。我想通过名称来检测用户是否已经在系统中。问题在于名称来自用户,意思是他可以拼错名字,或者可能是名称的替代版本:“Tim”和“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中编写查询来做到这一点,但如果这是不可能的,我也会采取AC解决方案。

+0

在最后一个例子中,为什么与'Foo Taylor'最匹配的是'Tim Best'而不是'Roger Thomas'? (“泰勒”和“托马斯”开始用相同的字母,并具有相同的长度,这似乎不是什么“蒂姆最佳”显然率更好的匹配。) –

+0

@TedHopp你是正确的,对不起 – chacham15

回答

1

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

我个人的经验表明,你必须玩弄存在的算法。我遇到了一个匹配“FirstName LastName”与“LastName,FirstName”的问题,唯一适合我需求的算法是我从所提供的链接开发的修改后的Trigram。

为了你的需求,你也应保持名称缩略语的字典,这样就可以每个短形式转换为它的基本名称,然后做一个比较模糊。但是,这很可能会失败,例如, “Tin Taylor”,其中'Tin'拼写错误'Tim'不会导致'Timothy Taylor'。

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

+0

这些都不给我尽管有意义的信心值 – chacham15