因为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写的文件读写包。