关键词提取一:构造共现矩阵

因为TFIDF算法的提取关键词的准确性很差,tfidf提取出的关键词很难看出文本的主旨,于是考虑结合文本语义对词汇的权重(IDF)重新分配,于是想要借鉴SKE算法,即将词语语义特征融入关键词提取过程中,构建词语语义相似度网络并利用居间度密度度量词语语义关键度。

因为构造词语网络需要先构造关键词共现图,关键词共现图需要先构造关键词共现矩阵,所以第一步就是构造关键词共现矩阵。

构造关键词共现矩阵的思路是构造一个空的矩阵,将矩阵的首行和首列用关键词填满

[['' 'f' 'd' 'c' 'a' 'b']
 ['f' '' '' '' '' '']
 ['d' '' '' '' '' '']
 ['c' '' '' '' '' '']
 ['a' '' '' '' '' '']
 ['b' '' '' '' '' '']]
然后计算每个关键词组中关键词22之间共同出现的频率。比如abf这个关键词组中,ab共同出现的频率是1,bf共同出现的频率是1,af共同出现的频率是1.

[['' 'f' 'd' 'c' 'a' 'b']
 ['f' '' '' '' '1' '1']
 ['d' '' '' '' '' '']
 ['c' '' '' '' '' '']
 ['a' '1' '' '' '' '1']
 ['b' '1' '' '' '1' '']]
代码中主要计算量集中在计算关键词共现的次数上,因为要不断递归计算,如果使用普通的for循环,几千的关键词量就需要几个小时,借用 张同学的思路,将关键词一一比对改成将每个关键词出现的位置存入一个字典,{‘关键词’:[1,3,5,29,45,89]}的格式,然后将两个需要比对的关键词从字典中取出其对应的位置列表(list),将列表强转城set,再利用两个set之间求交集set()&set()的方法,求出两关键词的共现频率。

#coding:utf-8
from imports.reader import readtxt,writetxt,wryxls
from imports import mysqlConn
import time
import openpyxl
def quchong(key_list):
	new_key_list = set(key_list)
	return new_key_list

def get_set_key(data):
	'''构建一个关键词集合,用于作为共现矩阵的首行和首列'''
	key_list = []
	for word in data:
		word = word.replace('\r\n','')
		key_list.append(word)
	set_key_list = quchong(key_list)
	key_list = list(set_key_list)
	print(len(key_list))
	return key_list
	#set_key_list = list()

def format_data():
	'''格式化待处理数据'''
	formated_data = []
	totalwords = mysqlConn.selByCol('fangtianxiadb','content_cixing','totalword')
	for format_words in totalwords:
		sub_formated = format_words[0].strip().split(' ')
		#print('sub_formated:',sub_formated)
		formated_data.append(sub_formated)
	return formated_data

def build_matrix(key_list):
	'''建立矩阵,矩阵高度和宽度为关键词集合的长度'''
	edge = len(key_list)+1
	matrix = [['' for j in range(edge)] for i in range(edge)]
	return matrix

def init_matrix(key_list,matrix):
	'''初始化矩阵,将关键词集合赋值给第一列和第一行'''
	matrix[0][1:] = key_list
	for i in range(1,len(matrix)):
		matrix[i][0] = key_list[i-1]
	return matrix

def count_matrix(matrix,formated_data):
	'''计算各个关键词出现的次数'''
	#构造一个关键词出现位置的字典
	keyword_location = {}
	keywordlist = matrix[0][1:]
	for word in keywordlist:
		keyword_location[word] = []
		i=1
		for each_line in formated_data:
			if word in each_line:
				keyword_location[word].append(i)
			i+=1		
	print('构造一个关键词出现位置的字典')		
	#按行遍历,跳过下标为0的元素
	for raw in range(1,len(matrix)):
		#按列遍历,跳过下标为0的元素
		for col in range(1,len(matrix)):
			counter = 0
			if col >= raw:
				if raw==col:
					matrix[raw][col] = counter
				else:
					counter = len(set(keyword_location[matrix[raw][0]])&set(keyword_location[matrix[0][col]]))
					matrix[raw][col]=counter
			else:
				matrix[raw][col] = matrix[col][raw]
	print('完成!')
	return matrix

def write_xlsx(path,data):
	wb = openpyxl.Workbook()
	sheet = wb.active
	sheet.title = '2007测试表'

	for i in range(len(data)):
		for j in range(len(data[i])):
			sheet.cell(row=i+1,column=j+1,value=str(data[i][j]))

	wb.save(path)
	print('写入xlsx成功!')

def getMatrix():
	data = readtxt('E:/data/wordbag.txt','utf-8')
	key_list = get_set_key(data)
	formated_data = format_data()
	#formated_data = [['过户','税率'],['花瓣','微距','出点'],['精彩图片','小狗','日子']]
	#print(set_key)
	ini_matrix = build_matrix(key_list)
	matrix = init_matrix(key_list,ini_matrix)
	#print(matrix)
	result_matrix = count_matrix(matrix,formated_data)
	#print(writetxt('E:/data/matrix/matrix.txt',result_matrix,'utf-8'))
	write_xlsx('E:/data/matrix/matrix.xlsx',result_matrix)

if __name__ == '__main__':
	getMatrix()
代码中给出了两种存储方式,一种txt,一种xlsx,因为xls的表容量限制在256,关键词量大的情况需要存成xlsx。

其中import的有自己写的代码,以及博主liuruilun写的文件读写包。


你可能感兴趣的:(NLP)