验证专有名称(使用 Perl)

Validate Proper Names (with Perl)

我有一个包含 15 万个姓氏的人口普查列表,并试图用它来验证现有数据库中人名的拼写。

显然我的数据库中有许多民族名字与人口普查名单不符,但显然没有拼错(意大利名字如 "Petroni",瑞典名字如 "Magnusdotter")。

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

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

谢谢!!

本质上,您是在编写拼写检查程序。您可能想研究一个开放源代码的多语言拼写检查器,例如 Aspell,看看它们能做什么。您甚至可以将您想要的实现为 aspell 字典。

有很多算法可以做到approximate string matching. The Levenshtein distance between words is one algorithm, and there are several Perl modules to calculate it, but Text::Fuzzy看起来不错。

比较几个字还是不错的,不过你得在150k之间取舍。你可以看看它是否足够快。您可以尝试缓存结果。但它仍然是一个 O(n) 算法。相反(或另外),您可以使用 phonetic matching algorithm 创建索引。通常,这些索引词根据它们的发音来匹配拼写错误的词。为每个词生成索引后,您可以非常快速地将新词与索引匹配。显然,这取决于单词听起来像什么的文化观念,这就是为什么有许多算法,每个算法都有不同的优化。您可以使用不同的算法创建多个索引并全部尝试。

您甚至可以将两者结合起来,对拼音索引进行近似字符串匹配。