數據預處理部分可以參考之前的那篇LDA模型
讀取數據
import numpy as np import pandas as pd from pprint import pprint import xlrd #讀取excel數據 import re import jieba #使用結巴進行中文分詞 path = r"D:\01研\01大四\2020.3.13-國家突發衛生事件\20201008\lda.xlsx" #修改路徑 data = xlrd.open_workbook(path) sheet_1_by_index = data.sheet_by_index(0) #讀取表一 title = sheet_1_by_index.col_values(1) #第二列 n_of_rows = sheet_1_by_index.nrows doc_set = [] #空列表 for i in range(1,n_of_rows): #逐行讀取 doc_set.append(title[i])
數據預處理+存儲
#從文件導入停用詞表 def stopwordslist(filepath): stopwords=[line.strip() for line in open(filepath,'r',encoding='utf-8').readlines()] return stopwords stopwords=stopwordslist(r"D:\01研\01大四\2020.3.13-國家突發衛生事件\20201008\stopwords.txt") texts = []#每篇文章關鍵詞 word_set = []#每篇文章關鍵詞不重復 set_word = []#所有關鍵詞的集合 stpwrdlst2 = ['和', '等', '對', '的', '不','與', '一','化','三要','二要']#去停用詞2自編,這里是我自己覺得需要去掉的詞 for doc in doc_set: #只保留中文 cleaned_doc = ''.join(re.findall(r'[\u4e00-\u9fa5]', doc)) #分詞 doc_cut = jieba.lcut(cleaned_doc) #去停用詞 text_list0 = [word for word in doc_cut if word not in stopwords and len(word)>1] text_list1 = [word for word in text_list0 if word not in stpwrdlst2] #最終處理好的結果存放於text[]中 texts.append(text_list1) for word in texts: word_new = list(set(word))#去除一維數組中相同的詞 word_set.append(word_new) for subword in word_set: for word in subword: if word not in set_word: set_word.append(word)#統計所有出現的詞
構建共現矩陣
# 初始化矩陣 def build_matirx(set_word): edge = len(set_word) + 1 # 建立矩陣,矩陣的高度和寬度為關鍵詞集合的長度+1 '''matrix = np.zeros((edge, edge), dtype=str)''' # 另一種初始化方法 matrix = [['' for j in range(edge)] for i in range(edge)] # 初始化矩陣 matrix[0][1:] = np.array(set_word) matrix = list(map(list, zip(*matrix))) matrix[0][1:] = np.array(set_word) # 賦值矩陣的第一行與第一列 return matrix
# 計算各個關鍵詞的共現次數 def count_matrix(matrix, texts): for row in range(1, len(matrix)): # 遍歷矩陣第一行,跳過下標為0的元素 for col in range(1, len(matrix)): # 遍歷矩陣第一列,跳過下標為0的元素 # 實際上就是為了跳過matrix中下標為[0][0]的元素,因為[0][0]為空,不為關鍵詞 if matrix[0][row] == matrix[col][0]: # 如果取出的行關鍵詞和取出的列關鍵詞相同,則其對應的共現次數為0,即矩陣對角線為0 matrix[col][row] = str(0) else: counter = 0 # 初始化計數器 for ech in texts: # 遍歷格式化后的原始數據,讓取出的行關鍵詞和取出的列關鍵詞進行組合, # 再放到每條原始數據中查詢 if matrix[0][row] in ech and matrix[col][0] in ech: counter += 1 else: continue matrix[col][row] = str(counter) return matrix
def main(): #print(set_word) #print(texts) matrix = build_matirx(set_word) matrix = count_matrix(matrix, texts) data1 = pd.DataFrame(matrix) data1.to_csv('D:/02-1python/2020.08.11-lda/1008-covid/chuli/data.csv', index=0, columns=None, encoding='utf_8_sig') main()
參考:https://www.cnblogs.com/DragonLin/p/12902420.html