我想用word2vectors计算两个句子之间的相似度,我试图得到句子的向量,这样我就可以计算句子向量的平均值来找到余弦相似度。我试过这个代码,但它没有用。它给出了带有一个句子向量的输出。我想在sentence_1_avg_vector&中找到句子的实际向量。 sentence_2_avg_vector。
代码:
#DataSet#
sent1=[['What', 'step', 'step', 'guide', 'invest', 'share', 'market', 'india'],['What', 'story', 'Kohinoor', 'KohiNoor', 'Diamond']]
sent2=[['What', 'step', 'step', 'guide', 'invest', 'share', 'market'],['What', 'would', 'happen', 'Indian', 'government', 'stole', 'Kohinoor', 'KohiNoor', 'diamond', 'back']]
sentences=sent1+sent2
#''''Applying Word2vec''''#
word2vec_model=gensim.models.Word2Vec(sentences, size=100, min_count=5)
bin_file="vecmodel.csv"
word2vec_model.wv.save_word2vec_format(bin_file,binary=False)
#''''Making Sentence Vectors''''#
def avg_feature_vector(words, model, num_features, index2word_set):
#function to average all words vectors in a given paragraph
featureVec = np.ones((num_features,), dtype="float32")
#print(featureVec)
nwords = 0
#list containing names of words in the vocabulary
index2word_set = set(model.wv.index2word)# this is moved as input param for performance reasons
for word in words:
if word in index2word_set:
nwords = nwords+1
featureVec = np.add(featureVec, model[word])
print(featureVec)
if(nwords>0):
featureVec = np.divide(featureVec, nwords)
return featureVec
i=0
while i<len(sent1):
sentence_1_avg_vector = avg_feature_vector(mylist1, model=word2vec_model, num_features=300, index2word_set=set(word2vec_model.wv.index2word))
print(sentence_1_avg_vector)
sentence_2_avg_vector = avg_feature_vector(mylist2, model=word2vec_model, num_features=300, index2word_set=set(word2vec_model.wv.index2word))
print(sentence_2_avg_vector)
sen1_sen2_similarity = 1 - spatial.distance.cosine(sentence_1_avg_vector,sentence_2_avg_vector)
print(sen1_sen2_similarity)
i+=1
此代码给出的输出:
[ 1. 1. .... 1. 1.]
[ 1. 1. .... 1. 1.]
0.999999898245
[ 1. 1. .... 1. 1.]
[ 1. 1. .... 1. 1.]
0.999999898245
答案 0 :(得分:0)
我认为您要实现的目标如下:
虽然2和3的代码看起来一般对我来说很好(虽然没有经过测试),但问题可能在第1步。你在代码中做了什么
word2vec_model=gensim.models.Word2Vec(sentences, size=100, min_count=5)
是初始化一个新的word2vec模型。如果你打电话给word2vec_model.train()
,gensim会在你的句子上训练一个新的模型,这样你就可以使用每个单词的结果向量。但是,为了获得捕捉相似性等有用的单词向量,你通常需要在很多数据上训练word2vec模型 - model provided by Google训练了1000亿个单词。
您可能想要做的是使用预训练的word2vec模型并在代码中使用gensim。根据{{3}},可以使用KeyedVectors.load_word2vec_format
方法完成此操作。
答案 1 :(得分:0)
您的第二部分(将文本转换为特征向量)是错误的。 您必须替换:
featureVec = np.ones((num_features,), dtype="float32")
使用
featureVec = np.zeros((num_features,), dtype="float32")
。
如果在词典(index2word_set)中未找到任何单词,则应将其全为零。 那解决了我的问题。 ?