日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python构建关键词共现矩阵

發布時間:2023/12/9 python 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python构建关键词共现矩阵 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文僅僅提供了實現思路,如果對算法速度有追求的請移步python構建關鍵詞共現矩陣速度優化(在此非常感謝這位同學的優化)

非常感謝南京大學的張同學發現我代碼中的bug,現文中的代碼均已經更新請放心使用,并且代碼放棄使用numpy進行矩陣的構建,因此可以對中文進行構建關鍵詞共現矩陣了。同時,有很多同學對我在blog中總是提到的“import自己的代碼“的代碼感興趣,現在已將代碼git至GITHUB中,需要的同學請自行clone,其中包括了filewalker.py(文件夾遍歷)、reader.py(txt、excel文件的讀寫操作)、buildfile.py(新建文件夾等),具體用法,請參考我的另一篇博文《import自己寫的.py》

這篇博文中為了方便矩陣構建和變換,我使用了numpy,但是numpy不支持讀取和寫入中文字符,僅僅支持英文(或者拉丁文?),因此希望做中文的關鍵詞共現實驗的同學,可以使用博文最下方的代碼,給大家造成不便,十分抱歉!

中科院的小伙伴Leo Wood已經用pandas實現了共現計算,傳送門:Python Pandas 構建共現矩陣

共現分析在數據分析中經常使用到,這里的關鍵詞可以指的是文獻中的關鍵詞、作者、作者機構等等。在其他領域中,如電影電視劇也可以用來研究演員共現矩陣等等。在得出共現矩陣后,可以使用UCINET、NETDRAW或者Gephi來進行共現圖譜的繪制,達到數據可視化的效果。

首先看看原始數據:

從圖中可以看出,a和b共現2次,和c共現2次,其余以此類推。

*下面的代碼中,存在import reader,reader是我自己寫的.py文件,以方便我每次讀取數據。這樣就不用每次讀取數據的時候都要再寫一遍with open了,具體怎么使用請看我另一篇博文python中import自己寫的.py
代碼如下:

# -*- coding: utf-8 -*- # @Date : 2017-04-05 09:30:04 # @Author : Alan Lau (rlalan@outlook.com) import numpy as np import reader import time from pprint import pprint as pdef log(func):def wrapper(*args, **kwargs):now_time = str(time.strftime('%Y-%m-%d %X', time.localtime()))print('------------------------------------------------')print('%s %s called' % (now_time, func.__name__))print('Document:%s' % func.__doc__)print('%s returns:' % func.__name__)re = func(*args, **kwargs)p(re)return rereturn wrapper@log def get_set_key(data):'''構建一個關鍵詞集合,用于作為共現矩陣的首行和首列'''all_key = '/'.join(data)key_list = all_key.split('/')set_key_list = list(filter(lambda x: x != '', key_list))return list(set(set_key_list))@log def format_data(data):'''格式化需要計算的數據,將原始數據格式轉換成二維數組'''formated_data = []for ech in data:ech_line = ech.split('/')formated_data.append(ech_line)return formated_data@log def build_matirx(set_key_list):'''建立矩陣,矩陣的高度和寬度為關鍵詞集合的長度+1'''edge = len(set_key_list)+1# matrix = np.zeros((edge, edge), dtype=str)matrix = [['' for j in range(edge)] for i in range(edge)]return matrix@log def init_matrix(set_key_list, matrix):'''初始化矩陣,將關鍵詞集合賦值給第一列和第二列'''matrix[0][1:] = np.array(set_key_list)matrix = list(map(list, zip(*matrix)))matrix[0][1:] = np.array(set_key_list)return matrix@log def count_matrix(matrix, formated_data):'''計算各個關鍵詞共現次數'''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,即矩陣對角線為0matrix[col][row] = str(0)else:counter = 0# 初始化計數器for ech in formated_data:# 遍歷格式化后的原始數據,讓取出的行關鍵詞和取出的列關鍵詞進行組合,# 再放到每條原始數據中查詢if matrix[0][row] in ech and matrix[col][0] in ech:counter += 1else:continuematrix[col][row] = str(counter)return matrixdef main():keyword_path = r'test.xlsx'output_path = r'2.txt'data = reader.readxls_col(keyword_path)[0]set_key_list = get_set_key(data)formated_data = format_data(data)matrix = build_matirx(set_key_list)matrix = init_matrix(set_key_list, matrix)result_matrix = count_matrix(matrix, formated_data)np.savetxt(output_path, result_matrix, fmt=('%s,'*len(matrix))[:-1])if __name__ == '__main__':main()

為方便理解,我把每個函數返回的結果打印出來:

------------------------------------------------ 2017-04-05 15:30:48 get_set_key called Document:構建一個關鍵詞集合,用于作為共現矩陣的首行和首列 get_set_key returns: ['f', 'd', 'c', 'a', 'b'] ------------------------------------------------ 2017-04-05 15:30:48 format_data called Document:格式化需要計算的數據,將原始數據格式轉換成二維數組 format_data returns: [['a', 'b', 'c'], ['b', 'a', 'f'], ['a', 'd', 'c']] ------------------------------------------------ 2017-04-05 15:30:48 build_matirx called Document:建立矩陣,矩陣的高度和寬度為關鍵詞集合的長度+1 build_matirx returns: [['' '' '' '' '' '']['' '' '' '' '' '']['' '' '' '' '' '']['' '' '' '' '' '']['' '' '' '' '' '']['' '' '' '' '' '']] ------------------------------------------------ 2017-04-05 15:30:48 init_matrix called Document:初始化矩陣,將關鍵詞集合賦值給第一列和第二列 init_matrix returns: [['' 'f' 'd' 'c' 'a' 'b']['f' '' '' '' '' '']['d' '' '' '' '' '']['c' '' '' '' '' '']['a' '' '' '' '' '']['b' '' '' '' '' '']] ------------------------------------------------ 2017-04-05 15:30:48 count_matrix called Document:計算各個關鍵詞共現次數 count_matrix returns: [['' 'f' 'd' 'c' 'a' 'b']['f' '0' '0' '0' '1' '1']['d' '0' '0' '1' '1' '0']['c' '0' '1' '0' '2' '1']['a' '1' '1' '2' '0' '2']['b' '1' '0' '1' '2' '0']]***Repl Closed***

輸出的結果為:

中文關鍵詞的共現矩陣實現:

import os import xlrd import re from pprint import pprint as ptdef readxls(path):xl = xlrd.open_workbook(path)sheet = xl.sheets()[0]data = []for i in range(0, sheet.ncols):data.append(list(sheet.col_values(i)))return (data[0])def wryer(path, text):with open(path, 'a', encoding='utf-8') as f:f.write(text)return path+' is ok!'def buildmatrix(x, y):return [[0 for j in range(y)] for i in range(x)]def dic(xlspath):keygroup = readxls(xlspath)keytxt = '/'.join(keygroup)keyfir = keytxt.split('/')keylist = list(set([key for key in keytxt.split('/') if key != '']))keydic = {}pos = 0for i in keylist:pos = pos+1keydic[pos] = str(i)return keydicdef showmatrix(matrix):matrixtxt = ''count = 0for i in range(0, len(matrix)):for j in range(0, len(matrix)):matrixtxt = matrixtxt+str(matrix[i][j])+'\t'matrixtxt = matrixtxt[:-1]+'\n'count = count+1print('No.'+str(count)+' had been done!')return matrixtxtdef inimatrix(matrix, dic, length):matrix[0][0] = '+'for i in range(1, length):matrix[0][i] = dic[i]for i in range(1, length):matrix[i][0] = dic[i]# pt(matrix)return matrixdef countmatirx(matrix, dic, mlength, keylis):for i in range(1, mlength):for j in range(1, mlength):count = 0for k in keylis:ech = str(k).split('/')# print(ech)if str(matrix[0][i]) in ech and str(matrix[j][0]) in ech and str(matrix[0][i]) != str(matrix[j][0]):count = count+1else:continuematrix[i][j] = str(count)return matrixdef main():xlspath = r'test.xlsx'wrypath = r'1.txt'keylis = (readxls(xlspath))keydic = dic(xlspath)length = len(keydic)+1matrix = buildmatrix(length, length)print('Matrix had been built successfully!')matrix = inimatrix(matrix, keydic, length)print('Col and row had been writen!')matrix = countmatirx(matrix, keydic, length, keylis)print('Matrix had been counted successfully!')matrixtxt = showmatrix(matrix)# pt(matrix)print(wryer(wrypath, matrixtxt))# print(keylis)if __name__ == '__main__':main()

總結

以上是生活随笔為你收集整理的python构建关键词共现矩阵的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。