最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python?共現(xiàn)矩陣的實現(xiàn)代碼

 更新時間:2022年07月14日 08:40:41   作者:Dragon水魅  
這篇文章主要介紹了python?共現(xiàn)矩陣的實現(xiàn)代碼,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

python共現(xiàn)矩陣實現(xiàn)

最近在學(xué)習(xí)python詞庫的可視化,其中有一個依據(jù)共現(xiàn)矩陣制作的可視化,感覺十分炫酷,便以此復(fù)刻。

項目背景

本人利用爬蟲獲取各大博客網(wǎng)站的文章,在進(jìn)行jieba分詞,得到每篇文章的關(guān)鍵詞,對這些關(guān)鍵詞進(jìn)行共現(xiàn)矩陣的可視化。

什么是共現(xiàn)矩陣

比如我們有兩句話:

ls = ['我永遠(yuǎn)喜歡三上悠亞', '三上悠亞又出新作了']

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

我們就可以構(gòu)建一個以關(guān)鍵詞的共現(xiàn)矩陣:

['',    '我', '永遠(yuǎn)', '喜歡', '三上', '悠亞', '又', '出', '新作', '了']
['我',    0,      1,     1,     1,    1,    0,    0,      0,     0]
['永遠(yuǎn)',  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]]

解釋一下,“我永遠(yuǎn)喜歡三上悠亞”,這一句話中,“我”和“永遠(yuǎn)”共同出現(xiàn)了一次,在共現(xiàn)矩陣對應(yīng)的[ i ] [ j ]和[ j ][ i ]上+1,并依次類推。

基于這個原因,我們可以發(fā)現(xiàn),共現(xiàn)矩陣的特點是:

  • 共現(xiàn)矩陣的[0][0]為空。
  • 共現(xiàn)矩陣的第一行第一列是關(guān)鍵詞。
  • 對角線全為0。
  • 共現(xiàn)矩陣其實是一個對稱矩陣。

當(dāng)然,在實際的操作中,這些關(guān)鍵詞是需要經(jīng)過清洗的,這樣的可視化才干凈。

共現(xiàn)矩陣的構(gòu)建思路

  • 每篇文章關(guān)鍵詞的二維數(shù)組data_array。
  • 所有關(guān)鍵詞的集合set_word。
  • 建立關(guān)鍵詞長度+1的矩陣matrix。
  • 賦值矩陣的第一行與第一列為關(guān)鍵詞。
  • 設(shè)置矩陣對角線為0。
  • 遍歷formated_data,讓取出的行關(guān)鍵詞和取出的列關(guān)鍵詞進(jìn)行組合,共現(xiàn)則+1。

共現(xiàn)矩陣的代碼實現(xiàn)

# coding:utf-8
import numpy as np
import pandas as pd
import jieba.analyse
import os
# 獲取關(guān)鍵詞
def Get_file_keywords(dir):
    data_array = []  # 每篇文章關(guān)鍵詞的二維數(shù)組
    set_word = []  # 所有關(guān)鍵詞的集合
    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))  # 所有關(guān)鍵詞的集合
        return data_array, set_word
    except Exception as reason:
        print('出現(xiàn)錯誤:', reason)
        return data_array, set_word
# 初始化矩陣
def build_matirx(set_word):
    edge = len(set_word) + 1  # 建立矩陣,矩陣的高度和寬度為關(guān)鍵詞集合的長度+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
# 計算各個關(guān)鍵詞的共現(xiàn)次數(shù)
def count_matrix(matrix, formated_data):
    for row in range(1, len(matrix)):
        # 遍歷矩陣第一行,跳過下標(biāo)為0的元素
        for col in range(1, len(matrix)):
            # 遍歷矩陣第一列,跳過下標(biāo)為0的元素
            # 實際上就是為了跳過matrix中下標(biāo)為[0][0]的元素,因為[0][0]為空,不為關(guān)鍵詞
            if matrix[0][row] == matrix[col][0]:
                # 如果取出的行關(guān)鍵詞和取出的列關(guān)鍵詞相同,則其對應(yīng)的共現(xiàn)次數(shù)為0,即矩陣對角線為0
                matrix[col][row] = str(0)
            else:
                counter = 0  # 初始化計數(shù)器
                for ech in formated_data:
                    # 遍歷格式化后的原始數(shù)據(jù),讓取出的行關(guān)鍵詞和取出的列關(guān)鍵詞進(jìn)行組合,
                    # 再放到每條原始數(shù)據(jù)中查詢
                    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()

共現(xiàn)矩陣(共詞矩陣)計算

共現(xiàn)矩陣(共詞矩陣)

統(tǒng)計文本中兩兩詞組之間共同出現(xiàn)的次數(shù),以此來描述詞組間的親密度

code(我這里求的對角線元素為該字段在文本中出現(xiàn)的總次數(shù)):

import pandas as pd
def gx_matrix(vol_li):
    # 整合一下,輸入是df列,輸出直接是矩陣
    names = locals()
    all_col0 = []   # 用來后續(xù)求所有字段的集合
    for row in vol_li:
        all_col0 += row
	    for each in row:  # 對每行的元素進(jìn)行處理,存在該字段字典的話,再進(jìn)行后續(xù)判斷,否則創(chuàng)造該字段字典
	        try:
	            for each1 in row:  # 對已存在字典,循環(huán)該行每個元素,存在則在已有次數(shù)上加一,第一次出現(xiàn)創(chuàng)建鍵值對“字段:1”
	                try:
	                    names['dic_' + each][each1] = names['dic_' + each][each1] + 1  # 嘗試,一起出現(xiàn)過的話,直接加1
	                except:
	                    names['dic_' + each][each1] = 1  # 沒有的話,第一次加1
	        except:
	            names['dic_' + each] = dict.fromkeys(row, 1)  # 字段首次出現(xiàn),創(chuàng)造字典
    # 根據(jù)生成的計數(shù)字典生成矩陣
    all_col = list(set(all_col0))   # 所有的字段(所有動物的集合)
    all_col.sort(reverse=False)  # 給定詞匯列表排序排序,為了和生成空矩陣的橫向列名一致
    df_final0 = pd.DataFrame(columns=all_col)  # 生成空矩陣
    for each in all_col:  # 空矩陣中每列,存在給字段字典,轉(zhuǎn)為一列存入矩陣,否則先創(chuàng)造全為零的字典,再填充進(jìn)矩陣
        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

求出每個字段與各字段的出現(xiàn)次數(shù)的字典

最后轉(zhuǎn)為df

補充一點

這里如果用大象所在列,除以大象出現(xiàn)的次數(shù),比值高的,表明兩者一起出現(xiàn)的次數(shù)多,如果這列比值中,有兩個元素a和b的比值均大于0.8(也不一定是0.8啦),就是均比較高,則說明a和b和大象三個一起出現(xiàn)的次數(shù)多?。?!

即可以求出文本中經(jīng)常一起出現(xiàn)的詞組搭配,比如這里的第二列,大象一共出現(xiàn)3次,與老虎出現(xiàn)3次,與豬出現(xiàn)2次,則可以推導(dǎo)出大象,老虎,豬一起出現(xiàn)的概率較高。

也可以把出現(xiàn)總次數(shù)拎出來,放在最后一列,則代碼為:

# 計算每個字段的出現(xiàn)次數(shù),并列為最后一行
    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)的后面即可

結(jié)果為

我第一次放代碼上來的時候中間有一塊縮進(jìn)錯了,感謝提出問題的同學(xué)的提醒,現(xiàn)在是更正過的代碼?。?!

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Matplotlib多子圖使用一個圖例的實現(xiàn)

    Matplotlib多子圖使用一個圖例的實現(xiàn)

    多子圖是Matplotlib中的一個功能,可以在同一圖形中創(chuàng)建多個子圖,本文主要介紹了Matplotlib多子圖使用一個圖例的實現(xiàn),感興趣的可以了解一下
    2023-08-08
  • Ubuntu安裝Python3.8的兩種方法詳解

    Ubuntu安裝Python3.8的兩種方法詳解

    這篇文章主要給大家介紹了關(guān)于Ubuntu安裝Python3.8的兩種方法,在Ubuntu上安裝Python非常簡單,文中介紹了兩種方法,每種方法都給出了詳細(xì)實例,需要的朋友可以參考下
    2023-09-09
  • python實現(xiàn)下載pop3郵件保存到本地

    python實現(xiàn)下載pop3郵件保存到本地

    這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)下載pop3郵件保存到本地的代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Python使用MoviePy輕松搞定視頻編輯

    Python使用MoviePy輕松搞定視頻編輯

    MoviePy?是一個使用?Python?編寫的開源庫,用于在視頻編輯中創(chuàng)建、編輯和操作視頻文件。本文就來教一下大家如何使用MoviePy輕松搞定視頻編輯,需要的可以了解一下
    2023-05-05
  • python 爬取壁紙網(wǎng)站的示例

    python 爬取壁紙網(wǎng)站的示例

    這篇文章主要介紹了python 爬取壁紙網(wǎng)站的示例,幫助大家更好的理解和學(xué)習(xí)使用python爬蟲,感興趣的朋友可以了解下
    2021-03-03
  • Python實現(xiàn)深度遍歷和廣度遍歷的方法

    Python實現(xiàn)深度遍歷和廣度遍歷的方法

    今天小編就為大家分享一篇Python實現(xiàn)深度遍歷和廣度遍歷的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • python中的pygame實現(xiàn)接球小游戲

    python中的pygame實現(xiàn)接球小游戲

    這篇文章主要介紹了python中的pygame實現(xiàn)接球小游戲,文章基于python的相關(guān)資料展開詳細(xì)的內(nèi)容,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-04-04
  • Python中的二分查找Bisect庫使用實戰(zhàn)

    Python中的二分查找Bisect庫使用實戰(zhàn)

    在算法和數(shù)據(jù)結(jié)構(gòu)中,二分查找是一種高效的搜索算法,可用于有序數(shù)據(jù)集合的查找,Python的bisect庫為我們提供了便捷的二分查找實現(xiàn),本文將深入探討B(tài)isect庫的使用方法、性能優(yōu)勢,并通過豐富的示例代碼展示其在實際應(yīng)用中的靈活性和效果
    2024-01-01
  • Python延時操作實現(xiàn)方法示例

    Python延時操作實現(xiàn)方法示例

    這篇文章主要介紹了Python延時操作實現(xiàn)方法,結(jié)合實例形式分析了Python基于sched庫與time庫實現(xiàn)延時操作的方法,需要的朋友可以參考下
    2018-08-08
  • Python中常用操作字符串的函數(shù)與方法總結(jié)

    Python中常用操作字符串的函數(shù)與方法總結(jié)

    這篇文章主要介紹了Python中常用操作字符串的函數(shù)與方法總結(jié),包括字符串的格式化輸出與拼接等基礎(chǔ)知識,需要的朋友可以參考下
    2016-02-02

最新評論

凉城县| 武义县| 安庆市| 正宁县| 长岭县| 云浮市| 五峰| 卓资县| 托克托县| 安庆市| 溧水县| 洪泽县| 新密市| 拜泉县| 南和县| 吐鲁番市| 津南区| 体育| 工布江达县| 武川县| 沙田区| 开远市| 泸定县| 舒城县| 齐齐哈尔市| 福清市| 桐乡市| 涿州市| 普安县| 松阳县| 疏附县| 沅江市| 根河市| 乐业县| 杭锦后旗| 琼海市| 南皮县| 泽库县| 青岛市| 安康市| 尚义县|