替代Levenshtein和Trigram
假设我的数据库中有以下两个字符串:
(1) 'Levi Watkins Learning Center - Alabama State University'
(2) 'ETH Library'
我的软件接收来自数据源的自由文本输入,并且应该将这些自由文本与数据库中预定义的字符串(上面的那些)进行匹配。
例如,如果软件得到字符串'Alabama University'
,它应该认识到这与(1)
相比更像(2)
。
起初,我想过使用像Levenshtein-Damerau或Trigrams这样广为人知的字符串度量 ,但这会导致不希望的结果,正如您在此处看到的那样:
http://fuzzy-string.com/Compare/Transform.aspx?r=Levi+Watkins+Learning+Center+-+Alabama+State+University&q=Alabama+University
http://fuzzy-string.com/Compare/Transform.aspx?r=ETH+Library&q=Alabama+University
Difference to (1): 37
Difference to (2): 14
(2)
因为比(1)
短得多而获胜,尽管(1)
包含搜索字符串的两个词( Alabama
和University
)。
我也尝试过使用Trigrams(使用Javascript库fuzzySet),但是我在那里得到了类似的结果。
是否有一个字符串度量可以识别搜索字符串与(1)
的相似性?
您可以尝试使用Word Mover的距离https://github.com/mkusner/wmd。 这种算法的一个显着优势是,它在计算文档中的单词之间的差异时结合了隐含的含义。 这篇文章可以在这里找到
你可以尝试使用规范化的levenshtein距离:
李玉建,刘波,“归一化Levenshtein距离度量”,IEEE模式分析与机器智能汇刊,vol。 29,没有。 6,第1091-1095页,2007年6月,doi:10.1109 / TPAMI.2007.1078 http://www.computer.org/csdl/trans/tp/2007/06/i1091-abs.html
他们建议规范levenshtein距离。 通过这样做,当比较长度为10的序列时,两个权重较长的序列中的一个字符的差异大于相同的差异。
你应该改变你的方法:
levenshtein距离很擅长计算单位的相似性,无论是“人物”还是“单词”。
从概念上讲,你正在考虑将阿拉巴马州和大学(2个词)作为2个单位,并且你想计算levenshtein距离应该表示阿拉巴马州和大学之间应该有1个单词的单词之间的距离。
但是,您正试图应用levenshtein算法,该算法是针对单词中的字符实施的。 这个实现只适用于匹配单个单词NOT句子。
它更好,你应该实现你自己的levenshtein算法(使用BK-Tree)作为顶部和每个匹配中的'单词',你再次使用levenshtein为'characters'匹配每个单词。
(1)的结果应该与该算法的距离1匹配,并且不匹配(2)。
链接地址: http://www.djcxy.com/p/75719.html