如何在比较两个地址字符串时获得百分比准确匹配?

6

我试图比较两个姓名和地址列表,以查找独特的数据。我可以轻松地提取出在两个列表中完全相同的字符串,然后剩下的是不同的姓名和地址,但可能是同一个人。

例如:

列表1中的条目 Smith J Ph234567 34 Smith st

列表2中的条目 Smith John Ph234567 34 Smith st

或者

列表1中的条目 Smith J Ph234567 34 Smith Rd

列表2中的条目 Smith J Ph234567 34 Smith Road

我想为看起来相似的条目添加标签,如80%匹配。

嵌套的foreach循环不起作用,因为它们会将每个单词或字母(根据您在字符串中的写法)与其他单词或字母进行匹配。

for循环不起作用,因为一次更改J和John就会导致更改后的每个条目出现错误。

我正在使用vb.net编写它,但也可以从C#进行翻译。

1个回答

16
这种问题通常通过计算字符串之间的编辑距离来解决。例如,可以从Levenshtein距离开始。
这将给出一个分数(将一个字符串转换为另一个字符串所需的“编辑操作”数量)。要将其转换为百分比标识,您需要通过较大字符串的长度对其进行归一化处理(类似于percent =(largerString.Length-editDistance)/ largerString.Length)。

1
谢谢,这正是我需要的 :-) 我甚至找到了一个链接 http://www.dotnetperls.com/levenshtein-vbnet - netchicken
如果你要比较很多项,它可能会很好,但速度相对较慢。这看起来很有趣:http://stevehanov.ca/blog/index.php?id=114 - spender
1
@spender,有高效的实现方案,但最终你将无法达到O(nm)以下的运行时间。这是可以证明的渐近最优解。当你将“相同”的参考对象与大量实例进行比较时,索引数据结构才开始变得有意义。 - Konrad Rudolph
我可以问一下,你从哪里得到那个公式的? - Triet Doan
@Forte_201092 我没有从任何地方得到它,是我自己推导出来的。这并不是很难。 - Konrad Rudolph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接