如何在Python中计算两个单词之间的含义距离

5
我想知道是否可以在Python中计算两个相关词(如“fraud”和“steal”)之间的距离/相似度。这两个词本身不是同义词,但它们显然是相关的。在NLP中是否有任何概念/算法可以用数字显示这种关系?也许通过NLTK实现?
我不需要Levenshtein距离,因为那涉及到组成单词的各个字符,我需要的是意义上的关联程度。
非常感谢您提供的帮助。

5
请尝试使用gensim包,如此处所示:https://radimrehurek.com/gensim/models/word2vec.html。例如:>>> model.wv.similarity('woman', 'man') 0.73723527。 - jose_bacoy
1
使用WordNet - 参见此处(http://wn-similarity.sourceforge.net/)或查看类似的帖子:https://dev59.com/Kozda4cB1Zd3GeqPprCU?rq=1 - user3639557
3个回答

3

我的建议如下:

  • 将每个单词通过同义词词典,获取一组同义词列表。
  • 获取两个单词相似同义词集的大小。
  • 这是衡量这两个单词相似性的一个度量。

如果您想进行更彻底的分析:

  • 同时获得每个单词的反义词。
  • 获取两个单词反义词集的交集大小。

如果您想要更进一步!...

  • 将每个单词通过同义词词典,获取一组同义词列表。
  • 使用查询结果中前n(=5, 或其他数字)个单词开始新的查询。
  • 重复上述步骤至您认为足够深度。
  • 从重复的同义词查询中收集同义词列表。
  • 获取来自两个同义词集合的相似同义词集的大小。
  • 这是衡量这两个单词相似性的一个度量。

0

正如@jose_bacoy上面建议的那样,Gensim库可以使用word2vec技术提供单词之间的相似度度量。下面的示例修改自this blog post。您可以在Google Colab中运行它。

Google Colab已安装了Gensim包。我们可以导入所需的部分:

from gensim.models import KeyedVectors

我们将从谷歌新闻下载训练数据,并加载它。
!wget -P /root/input/ -c "https://s3.amazonaws.com/dl4j-distribution/GoogleNews-vectors-negative300.bin.gz"
word_vectors = KeyedVectors.load_word2vec_format('/root/input/GoogleNews-vectors-negative300.bin.gz', binary=True)

这为我们提供了任意两个单词之间相似度的度量。以您的例子为例:

word_vectors.similarity('fraud', 'steal')
>>> 0.19978741

如果你认为这些单词相似,那么二十%的相似度可能会让你感到惊讶。但请考虑一下,fraud是一个名词,而steal通常是一个动词。这将使它们在word2vec中被视为非常不同的关联。

如果你将名词修改为动词,它们就会变得更加相似:

word_vectors.similarity('defraud', 'steal')
>>> 0.43293646

0
NLTK的WordNet是您想要使用的工具。首先,使用以下命令获取每个单词的所有意义集合:
synonymSet = wordnet.synsets(word)

然后循环遍历每个单词的每个可能意义,并在嵌套循环中将它们相互比较:

similarity = synonym1.res_similarity(synonym2,semcor_ic)

你可以将那个值取平均或者使用你找到的最大值,由你决定。

这个例子使用了一个单词相似度比较,它使用“IC”或信息内容。如果单词更具体或包含更多信息,则相似度得分会更高,因此通常更接近我们在思考单词相似性时的意思。

要使用这些内容,您需要导入和变量:

import nltk    
from nltk.corpus import wordnet
from nltk.corpus import wordnet_ic
semcor_ic = wordnet_ic.ic('ic-semcor.dat')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接