【问题标题】:word co-occurrence matrix from gensim来自gensim的单词共现矩阵
【发布时间】:2018-09-01 01:04:45
【问题描述】:

在构建 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,并且速度/代码的简单性对我的用例很重要。

【问题讨论】:

    标签: python nlp gensim


    【解决方案1】:

    给定一个由单词列表组成的语料库,您要做的是创建一个 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)
    

    【讨论】:

    • 谢谢@Syncrossus!这很棒。我意识到我已经在 gensim 管道中走得太远了,你的回答证实了这一点。转换结果证明是更棘手的部分(我在发布时没有预料到)。您的答案适用于我的示例,因为我只有 1 和 0,但没有更高的数字。不过似乎是在正确的方向。
    • 我尝试查看 API,但没有找到此功能...索引保存在哪里? (即每个索引与什么词相关联)
    【解决方案2】:

    doc-word 到 word-word 的转换结果比我最初想象的要复杂(至少对我来说)。 np.dot() 是其解决方案的关键,但我需要先应用蒙版。我创建了一个更复杂的测试示例...

    想象一个 doc-word 矩阵

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

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

    #       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]])
    

    这个问题我想了很久......

    【讨论】:

      猜你喜欢
      • 2017-08-06
      • 2016-06-30
      • 1970-01-01
      • 2020-12-15
      • 2017-02-01
      • 2016-06-04
      • 1970-01-01
      • 2023-03-19
      相关资源
      最近更新 更多