【问题标题】:word similarity query with fasttext使用 fasttext 进行单词相似度查询
【发布时间】:2020-06-27 18:06:01
【问题描述】:

我有两个单词列表,比如说,

清单 1:未来证明 清单 2:过去 foo bar 的房子

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

谢谢

【问题讨论】:

  • 如果你有词向量,你可以简单地使用余弦相似度。
  • 谢谢。排序! Gensim 可以解决问题!

标签: python nltk distance fasttext


【解决方案1】:

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

虽然并不详尽,但这里有一个预训练词嵌入列表,可用于找出词向量的余弦相似度: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)

【讨论】:

    猜你喜欢
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 2020-03-29
    • 1970-01-01
    相关资源
    最近更新 更多