gensim的词协同出现矩阵

2024-10-02 02:43:59 发布

您现在位置:Python中文网/ 问答频道 /正文

在构建python gensim word2vecmodel时,有没有方法可以查看doc-to-word矩阵?在

使用sentences = [['first', 'sentence'], ['second', 'sentence']]的输入,我会看到类似于*:

      first  second  sentence
doc0    1       0        1
doc1    0       1        1

*我已经演示了“人类可读”,但我正在寻找一个scipy(或其他)矩阵,索引到model.wv.index2word。在

而且,它能被转换成一个字到字的矩阵(以查看同时发生的情况)?比如:

^{pr2}$

我已经用CountVectorizer实现了类似word-word co-occurrence matrix的东西。效果很好。然而,我已经在我的管道中使用gensim,对于我的用例来说,速度/代码的简单性很重要。在


Tags: to方法docdoc1sentences矩阵人类sentence
2条回答

事实证明,doc单词到单词的转换(至少对我来说)比我原先想象的要复杂。np.dot()是其解决方案的关键,但我需要先应用一个掩码。我创建了一个更复杂的例子来测试。。。在

想象一个doc单词矩阵

#       word1  word2  word3
# doc0    3      4      2
# doc1    6      1      0
# doc3    8      0      4 
  • 在文档中,word2出现,word1出现9次
  • 在文档中,如果word2出现,word2出现5次
  • 在文档中,word2出现,word3出现2次

所以,当我们完成后,我们应该像下面这样结束(或者它是相反的)。按列阅读时,单词矩阵变成:

^{pr2}$

一个直的np.dot()产物产生:

import numpy as np
doc2word = np.array([[3,4,2],[6,1,0],[8,0,4]])
np.dot(doc2word,doc2word.T)
# array([[29, 22, 32],
#        [22, 37, 48],
#        [32, 48, 80]])

这意味着word1自身出现了29次。在

但是,如果我不把doc2word乘以它本身,而是先构建一个掩码,我就更接近了。然后我需要颠倒论点的顺序:

import numpy as np
doc2word = np.array([[3,4,2],[6,1,0],[8,0,4]])
# a mask where all values greater than 0 are true
# so when this is multiplied by the orig matrix, True = 1 and False = 0
doc2word_mask = doc2word > 0  

np.dot(doc2word.T, doc2word_mask)
# array([[17,  9, 11],
#        [ 5,  5,  4],
#        [ 6,  2,  6]])

我想这个太久了。。。。在

给定一个单词列表的语料库,你要做的就是创建一个Gensim字典,把你的语料库改成单词包,然后创建你的矩阵:

from gensim.matutils import corpus2csc
from gensim.corpora import Dictionary

# somehow create your corpus

dct = Dictionary(corpus)
bow_corpus = [dct.doc2bow(line) for line in corpus]
term_doc_mat = corpus2csc(bow_corpus)

您的term_doc_mat是一个Numpy压缩稀疏矩阵。如果你想要一个术语矩阵,你可以用它的转置来乘以它,即:

^{pr2}$

相关问题 更多 >

    热门问题