python構建共現矩陣


數據預處理部分可以參考之前的那篇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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM