我正在寻找一个允许智能比较两个字符串的库/类。充其量它会给出两个字符串相似程度的百分比。我正在比较公司名称,记录在不同存储库中的地址,因此名称中有许多拼写错误或不一致。
要比较的示例字符串:
"Good Company Ltd." vs. "GoodCompany"
"Baker Street 2" vs. "Baker Str. 2"
如果我得到相似百分比的结果,那么这可以作为此类数据智能合并的输入。
你知道任何允许这种智能字符串比较的好库吗?
我正在寻找一个允许智能比较两个字符串的库/类。充其量它会给出两个字符串相似程度的百分比。我正在比较公司名称,记录在不同存储库中的地址,因此名称中有许多拼写错误或不一致。
要比较的示例字符串:
"Good Company Ltd." vs. "GoodCompany"
"Baker Street 2" vs. "Baker Str. 2"
如果我得到相似百分比的结果,那么这可以作为此类数据智能合并的输入。
你知道任何允许这种智能字符串比较的好库吗?
Levenshtein 在这种情况下不合适。“Good Company Ltd”和“GoodCompany”如果修剪后的距离 = 3,而“Good Company Ltd”和“Food Company Ltd”的距离为 1,但含义完全不同。我建议Metaphone 或 Double Metaphone算法。
使用在线变音比较器的结果是:
Good Company Ltd = KTKMPNLTT GoodCompany = KTKMPN Food Company Ltd = FTKMPNLTT GoodCompanyLLC = KTKMPNLK
通过这种方式,您知道GoodCompany
,Good Company Ltd
和GoodCompanyLLC
相似,而 whileFood Company
拼写错误或完全不相关(KTKMPN
包含在KTKMPNLTT
和KTKMPNLK
但不包含在 中FTKMPNLTT
)。
在此处查看其他算法比较。
您可能想寻找Levenshtein Distance实现。它显示了使两个字符串相等需要多少字符插入/删除和替换。
这是一篇关于实现 Levenshtein Distance 和其他文本比较算法的 C# 库的帖子:.NET library for text algorithms?.
但是我认为您必须使用一些方法组合,因为使用 Levenshtein 会告诉您“Good Company Ltd.”。更类似于“Bad Company Ltd.” 而不是'GoodCompany'。
也许您必须通过扩展“str”来进行一些预处理。到“街道”并删除“有限公司” 在字符串比较方面作为“无意义”的词。
更新 1
Francesco De Lisi建议使用语音算法。看起来它们更适合比较拼写错误的名称。您仍然需要将地址拆分为语音/非语音部分(如建筑物编号)并分别进行比较。
更新 2
至于地址比较,这篇文章建议为此目的使用 Google Maps API ,另一篇文章讨论了地址解析。我猜谷歌可以产生可靠的结果,因为他们有一个街道地址数据库,他们可以在其中找到最正确的街道名称拼写。如果没有正确的街道/公司名称列表,您可能会遇到一些不正确的奇怪名称,但是许多不同的正确名称会与之相似。
您正在寻找的是Levenshtein 距离(维基百科):
... Levenshtein 距离是用于测量两个序列之间差异的字符串度量。通俗地说,两个单词之间的 Levenshtein 距离是将一个单词更改为另一个单词所需的最小单字符编辑(插入、删除、替换)次数