【问题标题】:Smart string comparison智能字符串比较
【发布时间】:2013-05-18 18:36:37
【问题描述】:

我正在寻找一个允许智能比较两个字符串的库/类。充其量它会给出两个字符串相似程度的百分比。我正在比较公司名称,记录在不同存储库中的地址,因此名称中有许多拼写错误或不一致。

要比较的示例字符串:

 "Good Company Ltd." vs. "GoodCompany" 
 "Baker Street 2" vs. "Baker Str. 2" 

如果我得到相似百分比的结果,那么这可以作为此类数据智能合并的输入。

你知道任何允许这种智能字符串比较的好库吗?

【问题讨论】:

  • 你能告诉我们你希望这两个字符串比较返回的百分比是多少吗?
  • "GreatOrgansiation" 是否与"GoodCompany" 有任何“相似之处”?你想比较意义吗? "accept""except" 听起来相似但含义不同,它们有多相似? "country fair""equal and fair""four candles""fork handles" 怎么样?是否有 NLP 的元素或者这是一个更简单的算法?您想要“意思相似”、“听起来相似”还是“看起来相似”?
  • @Jodrell:我想用“看起来相似”的术语进行比较。公司名称或地址是通用名称,因此不会有不同的含义。差异可能是由于:拼写错误、快捷方式、省略的结尾(如 Ltd)、省略的空格等。

标签: c# string string-comparison


【解决方案1】:

Levenshtein 在这种情况下不合适。 “Good Company Ltd”和“GoodCompany”如果修剪后的距离 = 3,而“Good Company Ltd”和“Food Company Ltd”的距离为 1,但含义完全不同。我建议Metaphone or Double Metaphone 算法。

使用online metaphone comparer 的结果是:

Good Company Ltd = KTKMPNLTT
GoodCompany = KTKMPN
Food Company Ltd = FTKMPNLTT
GoodCompanyLLC = KTKMPNLK

通过这种方式,您知道GoodCompanyGood Company LtdGoodCompanyLLC 是相似的,而Food Company 拼写错误或完全不相关(KTKMPN 包含在KTKMPNLTTKTKMPNLK 中,但不是在FTKMPNLTT)。

查看here 进行其他算法比较。

【讨论】:

  • 不错的链接!上次我听说语音比较只适用于带有拉丁字母的语言。
【解决方案2】:

您可能想寻找Levenshtein Distance 的实现。它显示了使两个字符串相等需要多少个字符插入/删除和替换。

这是一篇关于在 C# 中实现 Levenshtein Distance 和其他文本比较算法的库的帖子:.NET library for text algorithms?

但是我认为您必须使用一些方法组合,因为使用 Levenshtein 会告诉您“Good Company Ltd.”。更类似于“Bad Company Ltd.”而不是“GoodCompany”。

也许您必须通过扩展“str”来进行一些预处理。到“街道”并删除“有限公司”在字符串比较方面作为“无意义”的词。

更新 1

Francesco De Lisi suggests 使用语音算法。看起来它们更适合比较拼写错误的名称。您仍然需要将地址拆分为拼音/非拼音部分(如建筑物编号)并分别进行比较。

更新 2

至于地址比较,此帖suggests to use Google Maps API 用于此目的,另一帖讨论address parsing。我猜谷歌可以产生可靠的结果,因为他们有一个街道地址数据库,他们可以在其中找到最正确的街道名称拼写。如果没有正确的街道/公司名称列表,您可能会遇到一些不正确的奇怪名称,但是许多不同的正确名称会与之相似。

【讨论】:

  • Levenshtein 不太合适。 Metaphone 或 Double Metaphone 能够以更好的方式检查相似之处。
  • 感谢您推荐 Google Maps API,它们适合地址校对。
【解决方案3】:

您要查找的是Levenshtein distance (Wikipedia):

...Levenshtein 距离是一个字符串度量,用于测量两个序列之间的差异。通俗地说,两个词之间的 Levenshtein 距离是指将一个词变为另一个词所需的最小单字符编辑(插入、删除、替换)次数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    相关资源
    最近更新 更多