验证正确的名称(使用Perl)

时间:2015-01-31 16:18:55

标签: regex perl names

我有一个150k姓氏的人口普查清单,并试图用它来验证现有数据库中人名的拼写。

显然,我的数据库中有许多种族名称与人口普查列表不匹配,但显然没有拼写错误(意大利名称如“Petroni”,瑞典名称如“Magnusdotter”)。

我想创建一个函数(在Perl中)来检测数据库中名称与人口普查列表中其他非常流行的名称之间的轻微变化(即可能是错误拼写)(频率编号)可用)。

我可以想象这个算法,但在我深入研究之前 - 有任何建议以可靠的方式做到这一点 - 即一个不会产生太多误报的建议吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

基本上,你正在编写一个拼写检查程序。您可能希望查看一个开源,多语言的拼写检查程序,例如Aspell,并查看它们的作用。您甚至可以将您想要的内容实现为aspell字典。

执行approximate string matching的算法很多。单词之间的Levenshtein distance是一种算法,有several Perl modules to calculate it,但Text::Fuzzy看起来很不错。

这对于比较几个单词很有用,但你必须在150k之间做出选择。你可以看看它是否足够快。您可以尝试缓存结果。但它仍然是一种O(n)算法。相反(或另外)您可以使用phonetic matching algorithm创建索引。通常,这些索引词听起来像是允许在拼写错误的单词上进行匹配。一旦为每个单词生成了索引,就可以非常快速地将新单词与索引匹配。显然,这取决于什么词听起来的文化观念,这就是为什么有许多算法每个都有不同的优化。您可以使用不同的算法创建多个索引并全部尝试。

你甚至可以将两者结合起来,并在语音索引上进行近似字符串匹配。