赞
踩
因为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写的文件读写包。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。