来自gensim的单词共生矩阵

时间:2018-03-22 14:29:52

标签: python nlp gensim

在构建python gensim word2vec model时,有没有办法看到doc-to-word矩阵?

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

的内容
      first  second  sentence
doc0    1       0        1
doc1    0       1        1

*我已经说明了'人类可读',但我正在寻找一个scipy(或其他)矩阵,索引为model.wv.index2word

并且,可以将其转换为单词到单词矩阵(以查看共同出现)吗?类似的东西:

          first  second  sentence
first       1       0        1
second      0       1        1  
sentence    1       1        2   

我已经使用CountVectorizer实现了word-word co-occurrence matrix之类的功能。它运作良好。但是,我已经在我的管道中使用gensim,速度/代码简单性对我的用例来说很重要。

2 个答案:

答案 0 :(得分:0)

鉴于语料库是单词列表的列表,您要做的是创建一个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压缩稀疏矩阵。如果你想要一个术语矩阵,你总是可以乘以它的转置,即:

import numpy as np
term_term_mat = np.dot(term_doc_mat, term_doc_mat.T)

答案 1 :(得分:0)

文字 - 单词 - 单词转换对我来说比我原先想象的更复杂(至少对我而言)。 np.dot()是解决方案的关键,但我需要先应用一个掩码。我已经为测试创建了一个更复杂的例子......

想象一下doc-word矩阵

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

所以,当我们完成时,我们应该得到类似下面的东西(或者它是相反的)。在列中读取,单词矩阵变为:

#       word1  word2  word3
# word1  17      9     11
# word2   5      5      4
# word3   6      2      6

直的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]])

我一直在考虑这个问题......