两个词之间的相似度

数据挖掘 nlp nltk
2021-09-27 00:42:44

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

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

例子:

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

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

看起来我可能需要查看他们共享多少个字符。任何想法都会很棒。看起来像谷歌搜索“你的意思是”功能的功能。

4个回答

最接近的是 Jan 在他的回答中提到的Levenstein 距离(也通常称为编辑距离)。

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

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

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

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

除了这里得到很好的响应外,您还可以尝试 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 值来评估相似度。

如果您的字典不是太大,一种常见的方法是采用 Levenshtein 距离,它基本上计算了从一个单词到另一个单词需要进行多少更改。更改包括更改字符、删除字符或添加字符。来自维基百科的一个例子

lev(小猫,坐着)= 3

  • k itten -> s itten
  • 坐下- >坐下_
  • 坐 ->

以下是 Wikibooks 上的一些 Python 实现。

然而,计算这些距离的算法并不便宜。如果您需要大规模地执行此操作,则有一些方法可以在二元向量上使用余弦相似度,如果您需要一次找到大量单词的匹配项,这些方法会更快且易于分发。然而,它们只是这个距离的近似值。

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

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

因此,我希望该领域的最先进技术能够做到这一点,并且是某种形式的自适应分类,例如基于神经网络。谷歌确实返回了最近关于神经网络语音识别的研究