python共現矩陣如何實現
今天小編給大家分享一下python共現矩陣如何實現的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
什么是共現矩陣
比如我們有兩句話:
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)): ????????????#?遍歷矩陣第一列,跳過下標為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?formated_data: ????????????????????#?遍歷格式化后的原始數據,讓取出的行關鍵詞和取出的列關鍵詞進行組合, ????????????????????#?再放到每條原始數據中查詢 ????????????????????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(): ????formated_data,?set_word?=?Get_file_keywords(r'D:\untitled\test') ????print(set_word) ????print(formated_data) ????matrix?=?build_matirx(set_word) ????matrix?=?count_matrix(matrix,?formated_data) ????data1?=?pd.DataFrame(matrix) ????data1.to_csv('data.csv',?index=0,?columns=None,?encoding='utf_8_sig') main()
共現矩陣(共詞矩陣)計算
共現矩陣(共詞矩陣)
統計文本中兩兩詞組之間共同出現的次數,以此來描述詞組間的親密度
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?each2?in?row:??#?對已存在字典,循環該行每個元素,存在則在已有次數上加一,第一次出現創建鍵值對“字段:1” ????????????????try: ????????????????????names['dic_'?+?each][each2]?=?names['dic_'?+?each][each2]?+?1??#?嘗試,一起出現過的話,直接加1 ????????????????except: ????????????????????names['dic_'?+?each][each2]?=?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)的后面即可
結果為
以上就是“python共現矩陣如何實現”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注蝸牛博客行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:niceseo99@gmail.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。
評論