两个词之间的相似性


15

我正在寻找一个Python库,该库可以帮助我识别两个单词或句子之间的相似性。

我将进行音频到文本的转换,这将导致英语词典或非词典单词(这可能是个人或公司名称)。此后,我需要将其与已知单词进行比较。

例:

1)文本到音频结果:感谢您致电America Expansion, 将其与American Express进行比较。

两个句子在某种程度上相似但不相同。

看来我可能需要研究他们共享多少个字符。任何想法都会很棒。看起来像Google搜索的“您是不是要”功能。

Answers:


14

最接近的就像Jan提到的,Levenstein的距离(也通常称为编辑距离)。

在信息论和计算机科学中,Levenshtein距离是用于度量两个序列之间差异的字符串量度。非正式地,两个单词之间的Levenshtein距离是将一个单词转换为另一个单词所需的最小单字符编辑(即,插入,删除或替换)次数。

这是用于识别相似单词的非常常用的度量。Nltk已经有一个用于编辑距离度量的实现,可以通过以下方式调用它:

import nltk
nltk.edit_distance("humpty", "dumpty")

上面的代码将返回1,因为两个单词之间只有一个字母不同。


1
如果要使用NLP,则Lavenshtien的距离是最糟糕的算法。如果2个同义词具有不同的字符集,则LD在这些情况下的性能将非常差。
这是一个陷阱

8

除了此处的良好响应之外,您还可以尝试使用difflib python库中的SequenceMatcher。

https://docs.python.org/2/library/difflib.html

import difflib

a = 'Thanks for calling America Expansion'
b = 'Thanks for calling American Express'

seq = difflib.SequenceMatcher(None,a,b)
d = seq.ratio()*100
print(d) 
### OUTPUT: 87.323943

现在考虑以下代码:

a = 'Thanks for calling American Expansion'
b = 'Thanks for calling American Express'

seq = difflib.SequenceMatcher(None,a,b)
d = seq.ratio()*100
print(d)
### OUTPUT: 88.88888

现在,您可以比较d值以评估相似性。


1
如果您觉得seq.ratio()速度慢,可以使用seq.quick_ratio()
Nabin

6

如果字典不太大,通常的方法是采用Levenshtein距离,该距离基本上是计算从一个单词到另一个单词必须进行的更改。更改包括更改字符,删除字符或添加字符。维基百科的一个例子:

lev(小猫,坐着)= 3

  • ķ伊顿- > 小号伊顿
  • sitt ë N - > sitt Ñ
  • 坐在- >坐在

是Wikibooks上的一些Python工具。

但是,计算这些距离的算法并不便宜。如果您需要大规模执行此操作,则有多种方法可以在二元语法向量上使用余弦相似度,如果您需要一次查找大量单词的匹配项,则可以更快,更轻松地进行分布。但是,它们仅是该距离的近似值。


(+1)为列弗。距离度量。nltk带有现成的实现。余弦相似度不是一个很好的字符串相似度度量恕我直言:)
Dawny33

我同意这远比Levenshtein距离差,但是如果您需要2个百万个数据集之间的模糊匹配,由于需要一些技巧和矩阵乘法,它实际上可以在合理的时间内做到这一点
Jan van der Vegt

1
@ Dawny33我不同意。鉴于我使用了正确的n-gram,不仅余弦相似度对我来说非常快速,而且非常精确。
Mohit Motwani

3

Soundex算法是一种古老而著名的比较技术。这个想法不是比较单词本身,而是比较它们的发音方式。这在多大程度上提高了我所不知道的结果的质量。

但是,将类似Soundex的东西应用于语音到文本识别引擎的结果有点奇怪。首先,您丢弃有关单词发音的信息,然后尝试再次将其添加回去。最好将这两个阶段结合起来。

因此,我希望该领域的技术水平能够做到这一点,并且可以采用某种形式的自适应分类,例如基于神经网络。Google确实返回了有关使用神经网络进行语音识别的最新研究。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.