我有一个大城市数据库,它是从许多不同来源编译而来的。我正试图找到一种方法,可以根据城市名称轻松发现重复项。天真的答案是使用levenshtein距离。然而,城市的问题在于它们通常具有前缀和后缀,这些前缀和后缀对于他们所在的国家而言是通用的。
例如:
Boulleville对阵Boscherville
这些几乎肯定是不同的城市。然而,因为它们都以“ville”结尾(并且都以“Bo”开头),所以它们具有相当小的Levenstein距离。
* 我正在寻找一种字符串距离算法,该算法考虑到字符的位置,通过将单词中间的字母加权高于单词末尾的字母来最小化前缀和后缀的影响。 *
我本可以自己写一些东西,但我觉得很难相信没有人发表过合适的算法。
答案 0 :(得分:3)
这类似于自然语言编程中的stemming。
在该字段中,在进行进一步分析之前找到一个单词的词干,例如
run => run
running => run
runs => run
(当然像ran
之类的东西并不是run
。因为那个人可以使用一个引理器。但我离题了......)。尽管在NLP中干预很不完美,但它的效果非常好。
在您的情况下,在应用Levenstein之前,使用特定于城市名称的规则来阻止城市可能会很好。我不知道城市的干扰器实现,但规则表面上看起来相当简单。
您可以从前缀列表和后缀列表(包括任何常见的变体/拼写错误拼写)开始,只需在检查Levenstein距离之前删除这样的前缀/后缀。
另一方面,如果您有其他地址信息(例如街道地址或邮政编码),则会有许多国家/地区的地址规范化软件,这些软件会根据特定于地址的算法找到最佳匹配。
答案 1 :(得分:2)
一种非常简单的方法是在进行距离计算之前删除公共前缀和后缀。结果字符串之间的绝对距离与完整字符串的绝对距离相同,但是当考虑较短的长度时,距离看起来要大得多。
另请注意,一般即使是明显的拼写错误也会让第一个字母正确。那么Cowville
和Bowville
很可能是不同的城市,即使他们的L.距离只有1。
如果两个单词以不同的字母开头,至少在开始时,你可以更轻松地完成工作。他们可能会有所不同。首先集中精力去除以相同字母开头的单词重复。如果在此之后,您仍然有大量潜在的重复项,您可以优化距离阈值,以更仔细地检查以不同字母开头的单词。