Levenstein的算法基于字符串中插入,删除和替换的次数。
不幸的是,它没有考虑常见的拼写错误,即2个字符的转换(例如,令人敬畏的vs令人敬畏的)。因此,我希望使用更鲁棒的Damerau-Levenstein算法。
我认为将距离应用到整个弦上不是一个好主意,因为时间会随着弦的长度而突然增加。但是更糟糕的是,当删除ZIP之类的地址组成部分时,完全不同的地址可能会更好地匹配(使用在线Levenshtein计算器衡量):
1 someawesome street, anytown, F100 211 (reference)
1 someawesome st.,anytown (difference of 15, same address)
1 otherplaces street,anytown,F100211 (difference of 13, different ddress)
1 sameawesome street, othertown, CA98200 (difference of 13, different ddress)
anytown, 1 someawesome street (28 different same address)
anytown, F100 211, 1 someawesome street (37 different same address)
对于较短的街道名称,这些影响趋于恶化。
因此,您最好使用更智能的算法。例如,Arthur Ratz在CodeProject上发布了一种用于智能文本比较的算法。该算法不会打印出距离(当然可以相应地进行丰富),但是它可以识别一些困难的事情,例如移动文本块(例如,第一个示例和最后一个示例之间的城镇和街道之间的交换)。
如果这种算法对于您的情况而言过于笼统,则应按组件实际工作,并仅比较可比较的组件。如果要解析世界上的任何地址格式,这都不容易。但是美国说,如果目标更加具体,那肯定是可行的。例如,“街道”,“街”,“地方”,“广场”及其通常的拼写错误可能会揭示地址的街道部分,原则上,其前导部分将是数字。邮政编码可以帮助您定位城镇,或者它可能是地址的最后一个元素,或者,如果您不喜欢猜测,则可以查找城市名称列表(例如,下载免费的邮政编码数据库)。然后,您可以仅在相关组件上应用Damerau-Levenshtein。