替代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)包含搜索字符串的两个词( AlabamaUniversity )。

我也尝试过使用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

上一篇: Alternative to Levenshtein and Trigram

下一篇: iPhone Address Bar blocks HTML Page Header Buttons?