Python - 计算共生矩阵

时间:2017-01-15 13:46:49

标签: python matrix machine-learning nlp

我正在研究NLP任务,我需要计算文档上的共现矩阵。基本配方如下:

这里我有一个形状为(n, length)的矩阵,其中每一行代表一个由length个单词组成的句子。所以总共n个句子长度相同。然后使用定义的上下文大小,例如window_size = 5,我想计算共生矩阵D,其中cth行和wth列中的条目为{ {1}},表示上下文字#(w,c)出现在c上下文中的次数。

这里可以参考一个例子。 How to calculate the co-occurrence between two words in a window of text?

我知道它可以通过堆叠循环来计算,但我想知道是否存在简单的方法或简单的函数?我找到了一些答案,但是他们无法使用滑过句子的窗口。例如:word-word co-occurrence matrix

所以有人可以告诉我,Python中是否有任何功能可以简洁地处理这个问题?因为我认为这个任务在NLP中很常见。

2 个答案:

答案 0 :(得分:7)

我认为这并不复杂。为什么不为自己做一个功能? 首先根据本教程得到共生矩阵 X http://scikit-learn.org/stable/modules/feature_extraction.html#common-vectorizer-usage 然后,对于每个句子,计算共现并将它们添加到汇总变量。

m = np.zeros([length,length]) # n is the count of all words
def cal_occ(sentence,m):
    for i,word in enumerate(sentence):
        for j in range(max(i-window,0),min(i+window,length)):
             m[word,sentence[j]]+=1
for sentence in X:
    cal_occ(sentence, m)

答案 1 :(得分:0)

我已经计算了窗口大小= 2的共现矩阵

  1. 首先编写一个给出正确邻域词的函数(在这里我使用了get上下文)

  2. 创建矩阵,如果邻居罩中存在特定值,只需加1。

这是python代码:

import numpy as np
CORPUS=["abc def ijk pqr", "pqr klm opq", "lmn pqr xyz abc def pqr abc"]


top2000 = [ "abc","pqr","def"]#list(set((' '.join(ctxs)).split(' ')))
a = np.zeros((3,3), np.int32)
for  sentence in CORPUS:
    for index,word in enumerate(sentence.split(' ')):
       if word in top2000 : 
           print(word)
           context=GetContext(sentence,index)
           print(context)
           for word2 in context:
             if word2 in top2000:
                 a[top2000.index(word)][top2000.index(word2)]+=1
print(a)

获取上下文函数

def GetContext(sentence, index):
words = sentence.split(' ')
ret=[]
for word in words:

        if index==0:
            ret.append(words[index+1])
            ret.append(words[index+2])
        elif index==1:
            ret.append(words[index-1])
            ret.append(words[index+1])
        if len(words)>3:
                ret.append(words[index+2])
        elif index==(len(words)-1):
            ret.append(words[index-2])
            ret.append(words[index-1])
        elif index==(len(words)-2):
            ret.append(words[index-2])
            ret.append(words[index-1])
            ret.append(words[index+1])
        else:
            ret.append(words[index-2])
            ret.append(words[index-1])
            ret.append(words[index+1])
            ret.append(words[index+2])
        return ret     

结果如下:

array([[0, 3, 3],
   [3, 0, 2],
   [3, 2, 0]])