我有两个相同数据(公司)的信息来源,我可以通过一个唯一的ID(合同号)加入到一起。第二个不同来源的存在是由于这两个来源是独立手动更新的事实。我所拥有的是2个表中的 ID 和公司名称。
我需要提出一个算法来比较2个表中名称的相同 ID ,并订购所有公司通过一个变量来表示字符串的不同(突出显示最不同的字符串,放在列表的顶部)。
我查看了简单的Levenshtein距离计算算法,但是它处于字母级别,所以我仍然在寻找更好的东西。
Levenshtein没有真正做到这一点的原因是:公司有一个名称,前缀或后缀为组织形式(LTD,JSC,co。等)。所以我们可能会有很多JSC "Foo"
与Foo JSC.
有很大不同,但我在数据库中寻找的是一对不同的字符串,如SomeLongCompanyName JSC
和{{1} }。
有什么好办法吗? (我真的不喜欢使用正则表达式来分隔每个字符串中的单词,然后使用Levenshtein距离找到另一个字符串中每个单词的匹配,所以我正在寻找其他想法)
答案 0 :(得分:2)
你可以过滤掉(删除)那些“常用词”(类似于删除全文索引的停用词)然后搜索吗?如果没有,你可以在比较之前按字母顺序对单词进行排序吗?
作为Levenshtein距离的替代或补充,您可以使用Soundex。它不是非常好,但它可以用来索引数据(这在使用Levenshtein时是不可能的。)
答案 1 :(得分:2)
怎么样:
1.用空格替换所有标点符号
2.将字符串分成以空格分隔的单词
3.将所有< = 4个字符的单词移到最后,按字母顺序排序
莱文斯坦。
答案 2 :(得分:0)
谢谢你们的想法。 我使用了4个指数,这些指数是levenshtein距离除以以下两个词的长度之和(相对距离):
这些中的每一个都是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,分享这个图书馆以防其他人需要它。