对于相同的数据(公司),我有两个信息源,我可以通过一个唯一的ID (合同号)将它们连接在一起。第二个不同来源的存在是因为这两个源是手动、独立地更新的。因此,我在两个表中有一个ID和一个公司名称。
我需要提出一个算法来比较两个表中相同的ID的名称,并通过一个变量对所有公司进行排序,该变量指示字符串有多不同(突出显示最不同的字符串,将其放在列表的顶部)。
我看了简单的Levenshtein距离计算算法,但它在字母级别,所以我仍然在寻找更好的东西。
Levenshtein没有真正做这个工作的原因是:公司有一个名字,前缀或职位由组织形式(LTD,JSC,co. )决定。等)。因此,我们可能有很多JSC "Foo"
,这将与Foo JSC.
有很大的不同,但我在数据库中真正要寻找的是像SomeLongCompanyName JSC
和JSC OtherName
这样的不同字符串对。
有什么好办法吗?(我不太喜欢使用regex来分隔每个字符串中的单词,然后使用Levenshtein距离为另一个字符串中的每个单词寻找匹配,所以我正在寻找其他的想法)
发布于 2010-09-19 13:43:03
不如:
发布于 2010-09-16 04:20:08
你能过滤掉(删除)那些“普通单词”(类似于删除全文索引的停止词)然后搜索吗?如果没有,你能在比较之前按字母顺序排列单词吗?
除了Levenshtein距离之外,您还可以使用Soundex。它不是很好,但它可以用来索引数据(这在使用Levenshtein时不可能)。
发布于 2010-09-18 04:48:45
谢谢你们的想法。我使用了4个索引,它们是levenshtein距离除以以下两个单词的长度(相对距离)之和:
这些值中的每一个都是介于1到1000之间的整数值。由此产生的价值是:
X1^E1 * X2^E2 * X3^E3 * X4^E4
其中X1..X4是索引,而E1..E4是用户提供的有价值(重要)的首选项是每个索引。为了将结果保持在1.1000的合理范围内,对向量(E1..E4)进行了规范化。
结果令人印象深刻。整个过程比我预期的要快得多(在2008的C#中将其构建为CLR程序集)。正确选择E1..E4后,整个数据库中非空值的最大索引(最大差异)为765。直到大约300个,几乎没有匹配的公司名称。大约有200家公司有类似的名字,有些公司的名字是相同的,但写的方式非常不同,包括缩略语、附加词等等。当它降到100甚至更少的时候--几乎所有的记录都包含相同的名字,但写得略有不同。到了30岁时,只有顺序或标点符号可能有所不同。
完全有效,结果比我预期的要好。
我编写了我博客上的一篇文章,以共享这个库,以防其他人需要它。
https://stackoverflow.com/questions/3726432
复制相似问题