字符串比较算法,相关性,2个字符串是多少“相似”

时间:2010-09-16 12:01:45

标签: algorithm string comparison

我有两个相同数据(公司)的信息来源,我可以通过一个唯一的ID(合同号)加入到一起。第二个不同来源的存在是由于这两个来源是独立手动更新的事实。我所拥有的是2个表中的 ID 和公司名称

我需要提出一个算法来比较2个表中名称的相同 ID ,并订购所有公司通过一个变量来表示字符串的不同(突出显示最不同的字符串,放在列表的顶部)。

我查看了简单的Levenshtein距离计算算法,但是它处于字母级别,所以我仍然在寻找更好的东西。

Levenshtein没有真正做到这一点的原因是:公司有一个名称,前缀或后缀为组织形式(LTD,JSC,co。等)。所以我们可能会有很多JSC "Foo"Foo JSC.有很大不同,但我在数据库中寻找的是一对不同的字符串,如SomeLongCompanyName JSC和{{1} }。

有什么好办法吗? (我真的不喜欢使用正则表达式来分隔每个字符串中的单词,然后使用Levenshtein距离找到另一个字符串中每个单词的匹配,所以我正在寻找其他想法)

3 个答案:

答案 0 :(得分:2)

你可以过滤掉(删除)那些“常用词”(类似于删除全文索引的停用词)然后搜索吗?如果没有,你可以在比较之前按字母顺序对单词进行排序吗?

作为Levenshtein距离的替代或补充,您可以使用Soundex。它不是非常好,但它可以用来索引数据(这在使用Levenshtein时是不可能的。)

答案 1 :(得分:2)

怎么样:
1.用空格替换所有标点符号 2.将字符串分成以空格分隔的单词 3.将所有< = 4个字符的单词移到最后,按字母顺序排序 莱文斯坦。

答案 2 :(得分:0)

谢谢你们的想法。 我使用了4个指数,这些指数是levenshtein距离除以以下两个词的长度之和(相对距离):

  • 只是2个字符串
  • 由分隔单词序列后的结果组成的字符串,消除非单词字符,排序升序和空格连接作为分隔符。
  • 引号之间包含的字符串(如果不存在此类字符串,则采用原始字符串)
  • 由每个单词按字母顺序排列的第一个字符组成的字符串。

这些中的每一个都是1到1000之间的整数值。结果值是以下乘积:
X1^E1 * X2^E2 * X3^E3 * X4^E4
其中X1..X4是索引,而E1..E4是用户提供的有价值(重要)的偏好是每个索引。为了将结果保持在1..1000的合理值内,矢量(E1..E4)被归一化。

结果令人印象深刻。整个过程比我预期的要快得多(在C#for Microsoft SQL Server 2008中将其构建为CLR程序集)。正确选择E1..E4后,整个数据库中非空值的最大索引(最大差异)为765.直到大约300,几乎没有匹配的公司名称。大约有200家公司有类似的名字,有些是相同的名字,但用不同的方式写,有缩写,附加的单词等。当它降到100以下时 - 实际上所有的记录都包含了名字。同样但写得略有差异,到30时,只有订单或标点符号可能不同 完全有效,结果比我预期的要好。

我写了a post on my blog,分享这个图书馆以防其他人需要它。