小編寫這篇文章的主要目的,主要是給大家介紹,關于python中,共現矩陣代碼實現方式的問題,下面就給大家進行詳細的解答。
python共現矩陣實現
最近在學習python詞庫的可視化,其中有一個依據共現矩陣制作的可視化,感覺十分炫酷,便以此復刻。
項目背景
本人利用搜索引擎爬蟲,以此用來獲取各大博客網站的文章,在進行jieba分詞,得到每篇文章的關鍵詞,對這些關鍵詞進行共現矩陣的可視化。
什么是共現矩陣
比如我們有兩句話:
ls=['我永遠喜歡小澤瑪利亞','小澤瑪利亞又出新作了']
在jieba分詞下我們可以得到如下效果:
我們就可以構建一個以關鍵詞的共現矩陣:
['','我','永遠','喜歡','小澤','瑪利亞,'又','出','新作','了'] ['我',0,1,1,1,1,0,0,0,0] ['永遠',1,0,1,1,1,0,0,0,0] ['喜歡'1,1,0,1,1,0,0,0,0] ['小澤',1,1,1,0,1,1,1,1,1] ['瑪利亞',1,1,1,1,0,1,1,1,1] ['又',0,0,0,1,1,0,1,1,1] ['出',0,0,0,1,1,1,0,1,1] ['新作',0,0,0,1,1,1,1,0,1] ['了',0,0,0,1,1,1,1,1,0]]
解釋一下,“我永遠喜歡小澤瑪利亞”,這一句話中,“我”和“永遠”共同出現了一次,在共現矩陣對應的[i][j]和[j][i]上+1,并依次類推。
基于這個原因,我們可以發現,共現矩陣的特點是:
共現矩陣的[0][0]為空。
共現矩陣的第一行第一列是關鍵詞。
對角線全為0。
共現矩陣其實是一個對稱矩陣。
當然,在實際的操作中,這些關鍵詞是需要經過清洗的,這樣的可視化才干凈。
共現矩陣的構建思路
每篇文章關鍵詞的二維數組data_array。
所有關鍵詞的集合set_word。
建立關鍵詞長度+1的矩陣matrix。
賦值矩陣的第一行與第一列為關鍵詞。
設置矩陣對角線為0。
遍歷formated_data,讓取出的行關鍵詞和取出的列關鍵詞進行組合,共現則+1。
共現矩陣的代碼實現
#coding:utf-8 import numpy as np import pandas as pd import jieba.analyse import os #獲取關鍵詞 def Get_file_keywords(dir): data_array=[]#每篇文章關鍵詞的二維數組 set_word=[]#所有關鍵詞的集合 try: fo=open('dic_test.txt','w+',encoding='UTF-8') #keywords=fo.read() for home,dirs,files in os.walk(dir):#遍歷文件夾下的每篇文章 for filename in files: fullname=os.path.join(home,filename) f=open(fullname,'r',encoding='UTF-8') sentence=f.read() words="".join(jieba.analyse.extract_tags(sentence=sentence,topK=30,withWeight=False, allowPOS=('n')))#TF-IDF分詞 words=words.split('') data_array.append(words) for word in words: if word not in set_word: set_word.append(word) set_word=list(set(set_word))#所有關鍵詞的集合 return data_array,set_word except Exception as reason: print('出現錯誤:',reason) return data_array,set_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,formated_data): for row in range(1,len(matrix)): #遍歷矩陣第一行,跳過下標為0的元素 for col in range(1,len(matrix)):
共現矩陣(共詞矩陣)計算
共現矩陣(共詞矩陣)
統計文本中兩兩詞組之間共同出現的次數,以此來描述詞組間的親密度
code(我這里求的對角線元素為該字段在文本中出現的總次數):
import pandas as pd def gx_matrix(vol_li): #整合一下,輸入是df列,輸出直接是矩陣 names=locals() all_col0=[]#用來后續求所有字段的集合 for row in vol_li: all_col0+=row for each in row:#對每行的元素進行處理,存在該字段字典的話,再進行后續判斷,否則創造該字段字典 try: for each1 in row:#對已存在字典,循環該行每個元素,存在則在已有次數上加一,第一次出現創建鍵值對“字段:1” try: names['dic_'+each][each1]=names['dic_'+each][each1]+1#嘗試,一起出現過的話,直接加1 except: names['dic_'+each][each1]=1#沒有的話,第一次加1 except: names['dic_'+each]=dict.fromkeys(row,1)#字段首次出現,創造字典 #根據生成的計數字典生成矩陣 all_col=list(set(all_col0))#所有的字段(所有動物的集合) all_col.sort(reverse=False)#給定詞匯列表排序排序,為了和生成空矩陣的橫向列名一致 df_final0=pd.DataFrame(columns=all_col)#生成空矩陣 for each in all_col:#空矩陣中每列,存在給字段字典,轉為一列存入矩陣,否則先創造全為零的字典,再填充進矩陣 try: temp=pd.DataFrame(names['dic_'+each],index=[each]) except: names['dic_'+each]=dict.fromkeys(all_col,0) temp=pd.DataFrame(names['dic_'+each],index=[each]) df_final0=pd.concat([df_final0,temp])#拼接 df_final=df_final0.fillna(0) return df_final if __name__=='__main__': temp1=['狗','獅子','孔雀','豬'] temp2=['大象','獅子','老虎','豬'] temp3=['大象','北極熊','老虎','豬'] temp4=['大象','狗','老虎','小雞'] temp5=['狐貍','獅子','老虎','豬'] temp_all=[temp2,temp1,temp3,temp4,temp5] vol_li=pd.Series(temp_all) df_matrix=gx_matrix(vol_li) print(df_matrix)
輸入是整成這個樣子的series
最后轉為df
求出每個字段與各字段的出現次數的字典
補充一點
這里如果用大象所在列,除以大象出現的次數,比值高的,表明兩者一起出現的次數多,如果這列比值中,有兩個元素a和b的比值均大于0.8(也不一定是0.8啦),就是均比較高,則說明a和b和大象三個一起出現的次數多!!!
即可以求出文本中經常一起出現的詞組搭配,比如這里的第二列,大象一共出現3次,與老虎出現3次,與豬出現2次,則可以推導出大象,老虎,豬一起出現的概率較高。
也可以把出現總次數拎出來,放在最后一列,則代碼為:
#計算每個字段的出現次數,并列為最后一行
df_final['all_times']=''
for each in df_final0.columns:
df_final['all_times'].loc[each]=df_final0.loc[each,each]
放在上述代碼df_final=df_final0.fillna(0)的后面即可
結果為
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/127711.html
摘要:項目代碼下載地址基于共現提取釜山行人物關系更多經典項目全部項目 項目簡介:本項目將帶大家使用 Python 提取《釜山行》人物關系,對于給定的劇本文本,通過分析文本中人物的共現關系,提取整個文本表示的人物關系,并將人物關系可視化表示。本項目教程由Forec發布在實驗樓。 一、項目介紹 1. 內容簡介 《釜山行》是一部喪尸災難片,其人物少、關系簡單,非常適合我們學習文本處理。這個項目將介...
摘要:根據算法的思路,手動復現算法。根據窗口大小,組合共現詞和頻率,頻率代表共現權重。正反雙向共現詞。根據每個詞的權重的迭代公式,采用冒泡排序的方法,將一個詞的所有共現詞的權重代入公式。迭代次,使每個詞的權重收斂。根據權重排序,輸出。 根據jieba textrank算法的思路,手動復現textrank算法。思路:1.分詞,確定窗口大小。 2.根據窗口大小,組合共現詞和頻率,頻率代表共現...
閱讀 911·2023-01-14 11:38
閱讀 878·2023-01-14 11:04
閱讀 740·2023-01-14 10:48
閱讀 1982·2023-01-14 10:34
閱讀 942·2023-01-14 10:24
閱讀 819·2023-01-14 10:18
閱讀 499·2023-01-14 10:09
閱讀 572·2023-01-14 10:02