我下载了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。我有什么不对的吗?有关更好方法的任何建议吗?
答案 0 :(得分:0)
在计算余弦相似度之前,您是否检查了snippet_vector
和link_vector
是否是有意义的向量?
我怀疑它们只是零向量,或类似的非多样化,因为您的for word in snippet:
和for word in link_text:
循环不会对文本进行标记。因此,它们只会循环遍历每个字符串中的字符,这些字符串将不会作为单词出现在您的模型中,或者可用的少数字符可能与您的文本之间完全匹配。 (即使使用标记化,文本的求和向量也只会因为一个不同的单词'other'
的向量值而不同。)