我想知道是否可以在Python中计算两个相关词(如“fraud”和“steal”)之间的距离/相似度。这两个词本身不是同义词,但它们显然是相关的。在NLP中是否有任何概念/算法可以用数字显示这种关系?也许通过NLTK实现?
我不需要Levenshtein距离,因为那涉及到组成单词的各个字符,我需要的是意义上的关联程度。
非常感谢您提供的帮助。
我不需要Levenshtein距离,因为那涉及到组成单词的各个字符,我需要的是意义上的关联程度。
非常感谢您提供的帮助。
我的建议如下:
如果您想进行更彻底的分析:
如果您想要更进一步!...
正如@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
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')