背景
最近搞到了一些论文的关键词数据,要对这些关键词进行一个统计,显示不同关键词之间的关联程度。看看哪几个经常一起出现。干这个活,共现矩阵熟悉。于是就考虑把共现矩阵的实现代码写一下。
定义
共现矩阵是个什么玩意儿呢?
没能找到官方定义(菜),我挑了一个比较好理解的,如下。
共现矩阵定义:是文本中,单词对共现次数的统计表。
直观点说,共现矩阵是用来显示不同词在语料中,共同出现次数的一个矩阵。一般来说如果一个语料有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),得到下表(未包括.)
这就是上面三句话语料库所构成的共现矩阵。
任务需求
将关键词之间的共现情况做一个统计
可以看到,我需要实现任务的相对简单,并不涉及对句子的分词,只需读取即可。同时我也不需要考虑每次的取词范围为多少。
代码实现
读取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))
运行结果
计算出了在这些文献里,那些关键词经常出现,给出了一个统计矩阵,可以清楚地逮到哪几个是一伙的。
存在的问题
仅仅统计出了各个词之间的共现次数矩阵,没有给出排序等描述信息,有待改进;
统计矩阵的实现为后面文本信息的处理奠定了基础。