我可以获取Word2Vec和Doc2Vec矩阵来计算余弦相似度吗?

时间:2019-07-10 18:50:07

标签: python gensim word2vec doc2vec

我正在处理文本数据,此刻,我已将数据放入术语文档矩阵中,并计算了TF,术语频率和TF-IDF(术语频率与文档频率成反比)。从这里我的矩阵看起来像:

列=文档名称

行名=单词

填写了他们的TF和TF-IDF分数。

在当前的大部分分析中,我一直使用tm中的R包,但为了进一步分析,我开始使用Python中的gensim库。

我还不清楚我是否有TF和TF-IDF中的嵌入词。我希望使用Word2Vec / Doc2Vec并获得与我目前拥有的矩阵相似的矩阵,然后计算文档之间的余弦相似度。这是模型的输出之一吗?

我基本上有大约6000个文档,我想计算它们之间的余弦相似度,然后对这些余弦相似度评分进行排名。

2 个答案:

答案 0 :(得分:1)

Documentation说,它返回新文档的推断段落向量。请注意,对该函数的后续调用可能会推断同一文档的不同表示形式(您可以通过对种子model.random.seed(0)进行硬编码来确定性)。

使用sklearn进行tfidf和余弦相似度比较常见

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

corpus = [
     'This is the first document',
     'This is the second second document',
     'And the third one',
]

vectorizer = TfidfVectorizer()
tfidf = vectorizer.fit_transform(corpus)
words = vectorizer.get_feature_names()
similarity_matrix = cosine_similarity(tfidf)

Doc2Vec在后台使用了余弦相似性,因此我相信您可以将这些向量用于此目的。

import gensim  

model = gensim.models.Doc2Vec.load('saved_doc2vec_model')  
new_sentence = "This is a sample document".split(" ")  
model.docvecs.most_similar([model.infer_vector(new_sentence)])

这将返回最相似文档的元组(label,cosine_similarity_score)

希望这会有所帮助。

答案 1 :(得分:1)

是的,您可以在文本上训练Word2VecDoc2Vec模型。 (尽管,对于这些算法,您的数据有点小。)

然后,使用Word2Vec模型(或Doc2Vec的某些模式),您将获得文本中所有单词的单词向量。然后为较长文本创建矢量的一种简单方法是将文本各个单词的所有矢量平均在一起。然后,使用每个文本的向量,可以通过计算向量的余弦相似度来比较文本。

或者,使用Doc2Vec模型,您可以(a)查找训练集中文本的学习文档向量;或(b)使用infer_vector()输入新文本,该文本应与训练数据以相同的方式标记,并为该新文本获取模型兼容的向量。