我有一个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解决方案。
答案 0 :(得分:1)
有几种尝试来解决模糊字符串匹配问题。谷歌告诉你很多,wikipedia也是如此。最受欢迎的是Levenshtein。其他有趣的方法是Jaro-Winler和Trigram matching。
我个人的经验表明,你必须使用现有的算法。我有一个问题要匹配“FirstName LastName”和“LastName,FirstName”,唯一适合我需要的算法是修改后的Trigram,我是根据提供的链接开发的。
根据您的需要,您还应该保留名称缩写词典,以便您可以将每个简短形式转换为其基本名称,然后进行模糊比较。但是,这很可能会失败,例如“Tin Taylor”,其中'Tin'拼写错误'Tim'不会导致'Timothy Taylor'。
为了涵盖这一点,你需要一个可以“学习”的查找,即由一些人编辑。