有了 Gensim,在我训练了自己的模型之后,我可以使用model.wv.most_similar('cat', topn=5)
并获取最接近的 5 个单词的列表cat
在向量空间中。例如:
from gensim.models import Word2Vec
model = Word2Vec.load('mymodel.model')
In: model.wv.most_similar('cat', topn=5)
Out: ('kitten', .99)
('dog', .98)
...
使用 spaCy,根据文档 https://spacy.io/usage/vectors-similarity, 我可以:
import spacy
nlp = spacy.load('en_core_web_md')
tokens = nlp(u'dog cat banana')
for token1 in tokens:
for token2 in tokens:
print(token1.text, token2.text, token1.similarity(token2))
它给出了指定字符串中标记的相似性。但梳理文档和搜索,我无法弄清楚是否有一种 gensim 类型的方法可以列出预加载模型的所有相似单词nlp = spacy.load('en_core_web_lg')
or nlp = spacy.load('en_vectors_web_lg')
。有没有办法做到这一点?
我使用了安迪的回应,它工作正常但缓慢。为了解决这个问题,我采取了以下方法。
SpaCy 在后端使用余弦相似度来计算.similarity
。因此,我决定更换word.similarity(w)
及其优化的对应物。我使用的优化方法是cosine_similarity_numba(w.vector, word.vector)
如下所示,它使用 Numba 库来加速计算。您应该将most_similar 方法中的第12 行替换为以下行。
by_similarity = sorted(queries, key=lambda w: cosine_similarity_numba(w.vector, word.vector), reverse=True)
该方法速度提高了 2-3 倍这对我来说至关重要。
from numba import jit
@jit(nopython=True)
def cosine_similarity_numba(u:np.ndarray, v:np.ndarray):
assert(u.shape[0] == v.shape[0])
uv = 0
uu = 0
vv = 0
for i in range(u.shape[0]):
uv += u[i]*v[i]
uu += u[i]*u[i]
vv += v[i]*v[i]
cos_theta = 1
if uu != 0 and vv != 0:
cos_theta = uv/np.sqrt(uu*vv)
return cos_theta
我在这篇文章中更详细地解释了它:如何在 SpaCy 中构建快速“最相似词”方法 https://towardsdatascience.com/how-to-build-a-fast-most-similar-words-method-in-spacy-32ed104fe498
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)