快速文本词相似度查询

时间:2020-06-27 18:06:01

标签: python nltk distance fasttext

我有两个单词列表,

列表1:未来的证明 清单2:经过foo bar的房子

我想计算列表1的每个单词与列表2的每个单词之间的语义距离。 Fasttext有一个很好的功能来显示最近的邻居,但是如果有一种方法可以读出两个已定义单词之间的语义距离,那也很好。 有人可以帮忙吗?

谢谢

1 个答案:

答案 0 :(得分:0)

不幸的是,尽管NLTK中通过WordNet API支持同义词集相似性,但NLTK中没有直接使用单词相似性函数。

尽管并不详尽,但是这里有一个预训练的词嵌入列表,可用于找出词向量的余弦相似度:https://github.com/alvations/vegetables

要使用,下面是使用HLBL嵌入示例(来自Turian等,2011)https://www.kaggle.com/alvations/vegetables-hlbl-embeddings(向下滚动到数据浏览器并直接下载目录,数据集页面上的顶部下载按钮似乎导致数据损坏)。

下载后,您可以使用numpy加载嵌入内容:

>>> import pickle 
>>> import numpy as np

>>> embeddings = np.load('hlbl.rcv1.original.50d.npy')
>>> tokens = [line.strip() for line in open('hlbl.rcv1.original.50d.txt')]
>>> embeddings[tokens.index('hello')]
array([-0.21167406, -0.04189226,  0.22745571, -0.09330438,  0.13239339,
        0.25136262, -0.01908735, -0.02557277,  0.0029353 , -0.06194451,
       -0.22384156,  0.04584747,  0.03227248, -0.13708033,  0.17901117,
       -0.01664691,  0.09400477,  0.06688628, -0.09019949, -0.06918809,
        0.08437972, -0.01485273, -0.12062263,  0.05024147, -0.00416972,
        0.04466985, -0.05316647,  0.00998635, -0.03696947,  0.10502578,
       -0.00190554,  0.03435732, -0.05715087, -0.06777468, -0.11803425,
        0.17845355,  0.18688948, -0.07509124, -0.16089943,  0.0396672 ,
       -0.05162677, -0.12486628, -0.03870481,  0.0928738 ,  0.06197058,
       -0.14603543,  0.04026282,  0.14052328,  0.1085517 , -0.15121481])

要计算两个numpy数组的相似性,可以尝试Cosine Similarity between 2 Number Lists

import numpy as np

cos_similarity = lambda a, b: np.dot(a, b)/(np.linalg.norm(a)*np.linalg.norm(b))

x, y = np.array([1,2,3]), np.array([2,2,1])
cos_similarity(x,y)