python共現矩陣如何實現

蝸牛 互聯網技術資訊 2022-07-14 27 0

今天小編給大家分享一下python共現矩陣如何實現的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

什么是共現矩陣

比如我們有兩句話:

ls?=?['我永遠喜歡三上悠亞',?'三上悠亞又出新作了']

在jieba分詞下我們可以得到如下效果:

python共現矩陣如何實現  python 第1張

我們就可以構建一個以關鍵詞的共現矩陣:

['',????'我',?'永遠',?'喜歡',?'三上',?'悠亞',?'又',?'出',?'新作',?'了']
['我',????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

python共現矩陣如何實現  python 第2張

求出每個字段與各字段的出現次數的字典

python共現矩陣如何實現  python 第3張

最后轉為df

python共現矩陣如何實現  python 第4張

補充一點

這里如果用大象所在列,除以大象出現的次數,比值高的,表明兩者一起出現的次數多,如果這列比值中,有兩個元素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共現矩陣如何實現  python 第5張

以上就是“python共現矩陣如何實現”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注蝸牛博客行業資訊頻道。

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:niceseo99@gmail.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

評論

2018人人澡人摸人人添_月夜影视在线观看资源_一本二卡三卡四卡乱码小说_tobu8在线观看下载