【发布时间】:2017-03-28 18:27:12
【问题描述】:
我下载了 stackoverflow 转储(这是一个 10GB 文件)并在转储上运行 word2vec 以获得编程术语的矢量表示(我正在做的项目需要它)。以下是代码:
from gensim.models import Word2Vec
from xml.dom.minidom import parse, parseString
titles, bodies = [], []
xmldoc = parse('test.xml') //this is the dump
reflist = xmldoc.getElementsByTagName('row')
for i in range(len(reflist)):
bitref = reflist[i]
if 'Title' in bitref.attributes.keys():
title = bitref.attributes['Title'].value
titles.append([i for i in title.split()])
if 'Body' in bitref.attributes.keys():
body = bitref.attributes['Body'].value
bodies.append([i for i in body.split()])
dimension = 8
sentences = titles + bodies
model = Word2Vec(sentences, size=dimension, iter=100)
model.save('snippet_1.model')
现在,为了计算一对句子之间的余弦相似度,我执行以下操作:
from gensim.models import Word2Vec
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
model = Word2Vec.load('snippet_1.model')
dimension = 8
snippet = 'some text'
snippet_vector = np.zeros((1, dimension))
for word in snippet:
if word in model.wv.vocab:
vecvalue = model[word].reshape(1, dimension)
snippet_vector = np.add(snippet_vector, vecvalue)
link_text = 'some other text'
link_vector = np.zeros((1, dimension))
for word in link_text:
if word in model.wv.vocab:
vecvalue = model[word].reshape(1, dimension)
link_vector = np.add(link_vector, vecvalue)
print(cosine_similarity(snippet_vector, link_vector))
我正在计算句子中每个单词的词嵌入总和,以获得整个句子的一些表示。我对两个句子都这样做,然后计算它们之间的余弦相似度。
现在,问题是我给出的任何一对句子的余弦相似度都在 0.99 左右。有什么我做错了吗?有什么更好的方法建议吗?
【问题讨论】:
-
使用这个问题中讨论的 Word2Vec 模型对象的 n_similarity 可能会更好:stackoverflow.com/questions/26010645/…
-
可能为时已晚,但是当使用相似度进行比较时,几乎所有单词的 word2vec 都得到了相同的结果。然后我注意到用于训练 word2vec 的语料库的大小对于学习下划线向量权重的模型来说太小了。当我增加语料库的大小时,模型开始获得更好的结果。我猜想 word2vec 需要最少数量的文档才能开始表现良好。
标签: word2vec cosine-similarity