任意两个句子之间的余弦相似度始终为0.99

时间:2017-03-21 13:31:51

标签: word2vec cosine-similarity

我下载了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。我有什么不对的吗?有关更好方法的任何建议吗?

1 个答案:

答案 0 :(得分:0)

在计算余弦相似度之前,您是否检查了snippet_vectorlink_vector是否是有意义的向量?

我怀疑它们只是零向量,或类似的非多样化,因为您的for word in snippet:for word in link_text:循环不会对文本进行标记。因此,它们只会循环遍历每个字符串中的字符,这些字符串将不会作为单词出现在您的模型中,或者可用的少数字符可能与您的文本之间完全匹配。 (即使使用标记化,文本的求和向量也只会因为一个不同的单词'other'的向量值而不同。)