你们几个是一伙的是吧?——共现矩阵

1,700 阅读3分钟

背景

最近搞到了一些论文的关键词数据,要对这些关键词进行一个统计,显示不同关键词之间的关联程度。看看哪几个经常一起出现。干这个活,共现矩阵熟悉。于是就考虑把共现矩阵的实现代码写一下。

定义

共现矩阵是个什么玩意儿呢?

没能找到官方定义(菜),我挑了一个比较好理解的,如下。

共现矩阵定义:是文本中,单词对共现次数的统计表。

直观点说,共现矩阵是用来显示不同词在语料中,共同出现次数的一个矩阵。一般来说如果一个语料有n个词,那共现矩阵应该是一个n*n的矩阵。

经典举例:

I like deep learning.

I like NLP.

I enjoy flying.

可以构成词表:I、like、enjoy、deep、Learning、NLP、flying

假定我们的取词范围为2

以 like 为例,我们可以计算到与它相连的词共现次数:

I like deep learning.
I like deep learning.

第一句话中含like的两个词的组合是I、deep;

I like NLP.

I like NLP.

第二句话中含like的两个词的组合是I、NLP;

I enjoy flying.

第三句话则没有like。

我们得到 like = I(2次),deep(1次),NLP(1次)

综上,我们可以生成所有词的相关组合(取词范围为2),得到下表(未包括.)

image.png

这就是上面三句话语料库所构成的共现矩阵。

任务需求

将关键词之间的共现情况做一个统计

1652256072(1).png

可以看到,我需要实现任务的相对简单,并不涉及对句子的分词,只需读取即可。同时我也不需要考虑每次的取词范围为多少。

代码实现

读取excel文件

import pandas as pd
import datetime

start_time=datetime.datetime.now() # 记录代码运行时间
key_word_arr=[]
key_word_arr1=[]
key_word=pd.read_excel('材料1.xlsx',usecols=['关键词'])
# print(key_word)
for i in key_word.values:
#    print(i)
    for j in i:
        key_word_arr.append(j)
a=''
for i in key_word_arr:
    a=a+str(i)+'/'
    key_word_arr1.append(i)
#将excel中的数据读取为一个字符串a 和一个列表key_word_arry1,为后期使用做准备;
#print(a)
#print(key_word_arr1)

key_word_arr=a.split('/')
while '' in key_word_arr:
    key_word_arr.remove('') # 去除列表中的空数据
key_word_arr=list(set(key_word_arr))
key_word_arr=sorted(key_word_arr)
#print(key_word_arr) 对关键词数据进行整理、排序

构建共现矩阵

edge=len(key_word_arr)+1 #矩阵的(0,0)这个格是不放数据的,因此长度要加一
x = [['' for j in range(edge)] for i in range(edge)] #生产一个矩阵(列表形式)
for i in range(len(key_word_arr)+1):
    for j in range(len(key_word_arr)+1):
        count=0
        if j==0 and i ==0:
            x[i][j]=' '
        elif i !=0 and j==0 :
            x[i][j]=key_word_arr[i-1]
        elif i==0 and j!=0:
            x[i][j]=key_word_arr[j-1]
        elif i == j != 0 :
            count=0
            x[i][j]=count
        else:
            for y in key_word_arr1: 
                if str(key_word_arr[i-1]) in y and str(key_word_arr[j-1]) in y:
                    count=count+1
            x[i][j]=count
#构造共现矩阵

生成csv文档同时记录用时

date1=pd.DataFrame(x)
date1.to_csv('data.csv',index=0,columns=None, encoding='utf_8_sig')
#生成一个csv文档

end_time=datetime.datetime.now()
time_cost=end_time-start_time
print(str(time_cost))

运行结果

1652256719(1).png

计算出了在这些文献里,那些关键词经常出现,给出了一个统计矩阵,可以清楚地逮到哪几个是一伙的。

存在的问题

仅仅统计出了各个词之间的共现次数矩阵,没有给出排序等描述信息,有待改进;

统计矩阵的实现为后面文本信息的处理奠定了基础。