我有两个单词列表,
列表1:未来的证明 清单2:经过foo bar的房子
我想计算列表1的每个单词与列表2的每个单词之间的语义距离。 Fasttext有一个很好的功能来显示最近的邻居,但是如果有一种方法可以读出两个已定义单词之间的语义距离,那也很好。 有人可以帮忙吗?
谢谢
答案 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)