日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜

系統(tǒng) 2614 0

該系列文章主要講解知識圖譜或關(guān)系圖譜的構(gòu)建方法,前文介紹了Neo4j圖數(shù)據(jù)庫和Jieba、PyLTP的基本用法。本篇文章主要采用Python和Gephi構(gòu)建中國知網(wǎng)某個(gè)領(lǐng)域的作者合作關(guān)系和主題詞共現(xiàn)的知識圖譜,重點(diǎn)闡述了一種可操作的關(guān)系圖譜構(gòu)建方法,可用于論文發(fā)表、課程或企業(yè)可視化展示等。其基本步驟如下:

1.在中國知網(wǎng)搜索“清水江”關(guān)鍵詞,并導(dǎo)出論文Excel格式。
2.使用Python處理文本,獲取作者合作的共現(xiàn)矩陣及三元組。
3.Gephi導(dǎo)入CSV節(jié)點(diǎn)及邊文件,并構(gòu)建關(guān)系圖譜。
4.Gephi調(diào)整參數(shù),優(yōu)化關(guān)系圖譜。

這是一篇非常基礎(chǔ)的文章,而且不需要撰寫網(wǎng)絡(luò)爬蟲,最終生成的效果還不錯(cuò),可廣泛應(yīng)用于知識圖譜、引文分析、企業(yè)合作等領(lǐng)域。希望大家喜歡,尤其是研究自然語言處理和知識圖譜的同學(xué)。同時(shí),從今天起,博客的代碼盡量上傳到Github和CSDN下載,腳踏實(shí)地,與君同在。

下載地址:https://download.csdn.net/download/eastmount/11650953

文章目錄

  • 一.最終效果圖
  • 二.中國知網(wǎng)導(dǎo)出數(shù)據(jù)
  • 三.什么是共現(xiàn)關(guān)系
  • 四.Python構(gòu)建共現(xiàn)矩陣和三元組
  • 五.Gephi構(gòu)建知識圖譜
    • (一).數(shù)據(jù)準(zhǔn)備
    • (二).數(shù)據(jù)導(dǎo)入
    • (三).知識圖譜參數(shù)設(shè)置
    • (四).可視化顯示
  • 六.總結(jié)

前文參考
Neo4j圖數(shù)據(jù)庫系列:
[知識圖譜構(gòu)建] 一.Neo4j圖數(shù)據(jù)庫安裝初識及藥材供應(yīng)圖譜實(shí)例
[知識圖譜構(gòu)建] 二.《Neo4j基礎(chǔ)入門》基礎(chǔ)學(xué)習(xí)之創(chuàng)建圖數(shù)據(jù)庫節(jié)點(diǎn)及關(guān)系
[知識圖譜構(gòu)建] 三.Neo4j創(chuàng)建高校教師關(guān)系圖譜及查詢語句入門詳解

Python知識圖譜構(gòu)建系列:
[Python知識圖譜] 一.哈工大pyltp安裝及中文分句、中文分詞、導(dǎo)入詞典基本用法
[Python知識圖譜] 二.哈工大pyltp詞性標(biāo)注、命名實(shí)體識別、依存句法分析和語義角色標(biāo)注
[Python知識圖譜] 三.Jieba工具中文分詞、添加自定義詞典及詞性標(biāo)注詳解

關(guān)系圖譜系列:
[關(guān)系圖譜] 一.Gephi通過共現(xiàn)矩陣構(gòu)建知網(wǎng)作者關(guān)系圖譜
[關(guān)系圖譜] 二.Gephi導(dǎo)入共線矩陣構(gòu)建作者關(guān)系圖譜

知識圖譜實(shí)例系列:
[知識圖譜實(shí)戰(zhàn)篇] 一.數(shù)據(jù)抓取之Python3抓取JSON格式的電影實(shí)體
[知識圖譜實(shí)戰(zhàn)篇] 二.Json+Seaborn可視化展示電影實(shí)體
[知識圖譜實(shí)戰(zhàn)篇] 三.Python提取JSON數(shù)據(jù)、HTML+D3構(gòu)建基本可視化布局
[知識圖譜實(shí)戰(zhàn)篇] 四.HTML+D3+CSS繪制關(guān)系圖譜
[知識圖譜實(shí)戰(zhàn)篇] 五.HTML+D3添加鼠標(biāo)響應(yīng)事件顯示相關(guān)節(jié)點(diǎn)及邊
[知識圖譜實(shí)戰(zhàn)篇] 六.HTML+D3實(shí)現(xiàn)點(diǎn)擊節(jié)點(diǎn)顯示相關(guān)屬性及屬性值
[知識圖譜實(shí)戰(zhàn)篇] 七.HTML+D3實(shí)現(xiàn)關(guān)系圖譜搜索功能
[知識圖譜實(shí)戰(zhàn)篇] 八.HTML+D3繪制時(shí)間軸線及顯示實(shí)體


一.最終效果圖

作者合作知識圖譜

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第1張圖片
[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第2張圖片

下面是另一個(gè)主題“網(wǎng)絡(luò)安全”以某作者為中心的區(qū)域,分別是武大和北郵。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第3張圖片
[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第4張圖片

關(guān)鍵詞共現(xiàn)知識圖譜


二.中國知網(wǎng)導(dǎo)出數(shù)據(jù)

第一步:在中國知網(wǎng)CNKI中搜索“清水江”關(guān)鍵詞,返回期刊論文1007篇,作為目標(biāo)分析數(shù)據(jù)。

注意,中國知網(wǎng)最多能導(dǎo)出5000篇文獻(xiàn),如果文章過多建議增加按年份統(tǒng)計(jì),最后再匯總。同時(shí),由于博士論文、會議論文、報(bào)紙作者關(guān)系較為單一,所以這里僅分析期刊論文。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第5張圖片

第二步:點(diǎn)擊左上角勾選文獻(xiàn)。每次最多選擇50篇論文,接著點(diǎn)擊下一頁,導(dǎo)出500篇文獻(xiàn)。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第6張圖片

選擇下一頁:

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第7張圖片

選中500篇論文之后,接著點(diǎn)擊“導(dǎo)出/參考文獻(xiàn)”選項(xiàng)。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第8張圖片

第三步:在彈出的 界面中,選擇“Reforks”格式,點(diǎn)擊XLS導(dǎo)出。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第9張圖片

到處的表格如下圖所示,包括各種論文信息,可惜沒有下載量和被引用量(網(wǎng)絡(luò)爬蟲實(shí)現(xiàn)),但我們的知識圖譜分析也夠了。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第10張圖片

第四步:再下載剩余的所有文獻(xiàn),每次500篇的下載,并整理在一個(gè)Excel表格中,過濾掉英文和無作者的論文,剩下958篇,即為分析的數(shù)據(jù)集。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第11張圖片

三.什么是共現(xiàn)關(guān)系

引文分析常見的包括兩類,一種是共現(xiàn)關(guān)系,另一種是引用和被引用關(guān)系。本文主要講解共現(xiàn)關(guān)系,假設(shè)現(xiàn)在存在四篇文章,如下所示:

            
              文章標(biāo)題                                        作者
大數(shù)據(jù)發(fā)展現(xiàn)狀分析                              A,B,C,D
Python網(wǎng)絡(luò)爬蟲                                 A,B,C
貴州省大數(shù)據(jù)戰(zhàn)略                                 B,A,D
大數(shù)據(jù)分析重要                                    D,A

            
          

第一步:寫代碼抓取該領(lǐng)域文章的所有作者,即:A、B、C、D。

第二步:接著獲取對應(yīng)的共現(xiàn)矩陣,比如文章“大數(shù)據(jù)發(fā)展現(xiàn)狀分析”,則認(rèn)為A、B、C、D共現(xiàn),在他們之間建立一條邊。共現(xiàn)矩陣如下所示,共13條邊。

(1) [ ? A B C D A 0 2 2 2 B 1 0 2 2 C 0 0 0 1 D 1 0 0 0 ] \left[ \begin{matrix} -& A & B & C & D \\ A & 0 & 2 & 2 & 2 \\ B & 1 & 0 & 2 & 2 \\ C & 0 & 0 & 0 & 1 \\ D & 1 & 0 & 0 & 0 \end{matrix} \right] \tag{1} ? ? ? ? ? ? ? ? A B C D ? A 0 1 0 1 ? B 2 0 0 0 ? C 2 2 0 0 ? D 2 2 1 0 ? ? ? ? ? ? ? ? ( 1 )

第三步:由于最后的圖譜是無向圖,為了方便計(jì)算,我們將矩陣的下三角數(shù)據(jù)加至上三角,從而減少計(jì)算量。

(1) [ ? A B C D A 0 3 2 3 B 0 0 2 2 C 0 0 0 1 D 0 0 0 0 ] \left[ \begin{matrix} -& A & B & C & D \\ A & 0 & 3 & 2 & 3 \\ B & 0 & 0 & 2 & 2 \\ C & 0 & 0 & 0 & 1 \\ D & 0 & 0 & 0 & 0 \end{matrix} \right] \tag{1} ? ? ? ? ? ? ? ? A B C D ? A 0 0 0 0 ? B 3 0 0 0 ? C 2 2 0 0 ? D 3 2 1 0 ? ? ? ? ? ? ? ? ( 1 )

第四步:通過共現(xiàn)矩陣分別獲取兩兩關(guān)系及權(quán)重,再寫入CSV或Excel文件中,如下所示。知識圖譜通常由三元組構(gòu)成,包括 {實(shí)體,屬性,屬性值}、{實(shí)體、關(guān)系、實(shí)體},這里的{Source、Weight、Weight}也可以稱為一個(gè)三元組。

(2) [ S o u r c e T a r g e t W e i g h t A B 3 A C 2 A D 3 B C 2 B D 2 C D 1 ] \left[ \begin{matrix} Source & Target & Weight \\ A & B & 3 \\ A & C & 2 \\ A & D & 3 \\ B & C & 2 \\ B & D & 2 \\ C & D & 1 \end{matrix} \right] \tag{2} ? ? ? ? ? ? ? ? ? ? ? S o u r c e A A A B B C ? T a r g e t B C D C D D ? W e i g h t 3 2 3 2 2 1 ? ? ? ? ? ? ? ? ? ? ? ? ( 2 )

第五步:將該CSV文件導(dǎo)入Gephi中,并繪制相關(guān)的圖形。因?yàn)樵搶?shí)例節(jié)點(diǎn)比較少,下面是Pyhton調(diào)用Networkx繪制的代碼及圖形。

            
              
                # -*- coding: utf-8 -*-
              
              
                import
              
               networkx 
              
                as
              
               nx

              
                import
              
               matplotlib
              
                .
              
              pyplot 
              
                as
              
               plt
 

              
                #定義有向圖
              
              
DG 
              
                =
              
               nx
              
                .
              
              Graph
              
                (
              
              
                )
              
              
                #添加五個(gè)節(jié)點(diǎn)(列表)
              
              
DG
              
                .
              
              add_nodes_from
              
                (
              
              
                [
              
              
                'A'
              
              
                ,
              
              
                'B'
              
              
                ,
              
              
                'C'
              
              
                ,
              
              
                'D'
              
              
                ]
              
              
                )
              
              
                print
              
               DG
              
                .
              
              nodes
              
                (
              
              
                )
              
              
                #添加邊(列表)
              
              
DG
              
                .
              
              add_edge
              
                (
              
              
                'A'
              
              
                ,
              
              
                'B'
              
              
                ,
              
               weight
              
                =
              
              
                3
              
              
                )
              
              
DG
              
                .
              
              add_edge
              
                (
              
              
                'A'
              
              
                ,
              
              
                'C'
              
              
                ,
              
               weight
              
                =
              
              
                2
              
              
                )
              
              
DG
              
                .
              
              add_edge
              
                (
              
              
                'A'
              
              
                ,
              
              
                'D'
              
              
                ,
              
               weight
              
                =
              
              
                3
              
              
                )
              
              
DG
              
                .
              
              add_edge
              
                (
              
              
                'B'
              
              
                ,
              
              
                'C'
              
              
                ,
              
               weight
              
                =
              
              
                2
              
              
                )
              
              
DG
              
                .
              
              add_edge
              
                (
              
              
                'B'
              
              
                ,
              
              
                'D'
              
              
                ,
              
               weight
              
                =
              
              
                2
              
              
                )
              
              
DG
              
                .
              
              add_edge
              
                (
              
              
                'C'
              
              
                ,
              
              
                'D'
              
              
                ,
              
               weight
              
                =
              
              
                1
              
              
                )
              
              
                #DG.add_edges_from([('A', 'B'), ('A', 'C'), ('A', 'D'), ('B','C'),('B','D'),('C','D')])
              
              
                print
              
               DG
              
                .
              
              edges
              
                (
              
              
                )
              
              
                #繪制圖形 設(shè)置節(jié)點(diǎn)名顯示\節(jié)點(diǎn)大小\節(jié)點(diǎn)顏色
              
              
colors 
              
                =
              
              
                [
              
              
                'red'
              
              
                ,
              
              
                'green'
              
              
                ,
              
              
                'blue'
              
              
                ,
              
              
                'yellow'
              
              
                ]
              
              
nx
              
                .
              
              draw
              
                (
              
              DG
              
                ,
              
              with_labels
              
                =
              
              
                True
              
              
                ,
              
               node_size
              
                =
              
              
                900
              
              
                ,
              
               node_color 
              
                =
              
               colors
              
                )
              
              
plt
              
                .
              
              show
              
                (
              
              
                )
              
            
          

繪制圖形如下所示:

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第12張圖片

接下來我們將告訴大家如何撰寫Python代碼獲取作者共現(xiàn)矩陣及三元組。


四.Python構(gòu)建共現(xiàn)矩陣和三元組

第一步 :將Excel中作者列單獨(dú)提取至word.txt文件中,如下圖所示。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第13張圖片

第二步:運(yùn)行Python代碼獲取共現(xiàn)矩陣和{Source, Weight,Target}三元組。

  • 按行讀取TXT數(shù)據(jù),并調(diào)用split(’;’)分割作者,將所有作者信息存儲至word列表中(不含重復(fù)項(xiàng))
  • 建立 word_vector[作者數(shù)][作者數(shù)] 共現(xiàn)矩陣,依次獲取每行的兩個(gè)作者下標(biāo)位置,記錄在變量w1、w2、n1、n2中
  • 詞頻矩陣賦值,這里通過判斷計(jì)算上三角矩陣 word_vector[n1][n2] += 1 或 word_vector[n2][n1] += 1
  • 兩層循環(huán)獲取共現(xiàn)矩陣 word_vector[i][j] 中不為0的數(shù)值,word[i]、word[j] 和權(quán)重 word_vector[i][j] 即為三元組
  • 將最終結(jié)果輸出至TXT和CSV文件
            
              
                # -*- coding: utf-8 -*-
              
              
                """
@author: eastmount CSDN 楊秀璋 2019-09-02
"""
              
              
                import
              
               pandas 
              
                as
              
               pd

              
                import
              
               numpy 
              
                as
              
               np

              
                import
              
               codecs

              
                import
              
               networkx 
              
                as
              
               nx

              
                import
              
               matplotlib
              
                .
              
              pyplot 
              
                as
              
               plt

              
                import
              
               csv
 

              
                #---------------------------第一步:讀取數(shù)據(jù)-------------------------------
              
              
word 
              
                =
              
              
                [
              
              
                ]
              
              
                #記錄關(guān)鍵詞
              
              
f 
              
                =
              
              
                open
              
              
                (
              
              
                "word.txt"
              
              
                )
              
                          
line 
              
                =
              
               f
              
                .
              
              readline
              
                (
              
              
                )
              
              
                while
              
               line
              
                :
              
              
                #print line
              
              
    line 
              
                =
              
               line
              
                .
              
              replace
              
                (
              
              
                "\n"
              
              
                ,
              
              
                ""
              
              
                )
              
              
                #過濾換行
              
              
    line 
              
                =
              
               line
              
                .
              
              strip
              
                (
              
              
                '\n'
              
              
                )
              
              
                for
              
               n 
              
                in
              
               line
              
                .
              
              split
              
                (
              
              
                ';'
              
              
                )
              
              
                :
              
              
                #print n
              
              
                if
              
               n 
              
                not
              
              
                in
              
               word
              
                :
              
              
            word
              
                .
              
              append
              
                (
              
              n
              
                )
              
              
    line 
              
                =
              
               f
              
                .
              
              readline
              
                (
              
              
                )
              
              
f
              
                .
              
              close
              
                (
              
              
                )
              
              
                print
              
              
                len
              
              
                (
              
              word
              
                )
              
              
                #作者總數(shù)
              
              
                #--------------------------第二步 計(jì)算共現(xiàn)矩陣----------------------------
              
              
a 
              
                =
              
               np
              
                .
              
              zeros
              
                (
              
              
                [
              
              
                2
              
              
                ,
              
              
                3
              
              
                ]
              
              
                )
              
              
                print
              
               a


              
                #共現(xiàn)矩陣
              
              
                #word_vector = np.zeros([len(word),len(word)], dtype='float16') 
              
              
                #MemoryError:矩陣過大匯報(bào)內(nèi)存錯(cuò)誤
              
              
                #https://jingyan.baidu.com/article/a65957f434970a24e67f9be6.html
              
              
                #采用coo_matrix函數(shù)解決該問題
              
              
                from
              
               scipy
              
                .
              
              sparse 
              
                import
              
               coo_matrix

              
                print
              
              
                len
              
              
                (
              
              word
              
                )
              
              
                #類型
                
              
              
word_vector 
              
                =
              
               coo_matrix
              
                (
              
              
                (
              
              
                len
              
              
                (
              
              word
              
                )
              
              
                ,
              
              
                len
              
              
                (
              
              word
              
                )
              
              
                )
              
              
                ,
              
               dtype
              
                =
              
              np
              
                .
              
              int8
              
                )
              
              
                .
              
              toarray
              
                (
              
              
                )
              
              
                print
              
               word_vector
              
                .
              
              shape

f 
              
                =
              
              
                open
              
              
                (
              
              
                "word.txt"
              
              
                )
              
              
line 
              
                =
              
               f
              
                .
              
              readline
              
                (
              
              
                )
              
              
                while
              
               line
              
                :
              
              
    line 
              
                =
              
               line
              
                .
              
              replace
              
                (
              
              
                "\n"
              
              
                ,
              
              
                ""
              
              
                )
              
              
                #過濾換行
              
              
    line 
              
                =
              
               line
              
                .
              
              strip
              
                (
              
              
                '\n'
              
              
                )
              
              
                #過濾換行
              
              
    nums 
              
                =
              
               line
              
                .
              
              split
              
                (
              
              
                ';'
              
              
                )
              
              
                #循環(huán)遍歷關(guān)鍵詞所在位置 設(shè)置word_vector計(jì)數(shù)
              
              
    i 
              
                =
              
              
                0
              
              
    j 
              
                =
              
              
                0
              
              
                while
              
               i
              
                <
              
              
                len
              
              
                (
              
              nums
              
                )
              
              
                :
              
              
                #ABCD共現(xiàn) AB AC AD BC BD CD加1
              
              
        j 
              
                =
              
               i 
              
                +
              
              
                1
              
              
        w1 
              
                =
              
               nums
              
                [
              
              i
              
                ]
              
              
                #第一個(gè)單詞
              
              
                while
              
               j
              
                <
              
              
                len
              
              
                (
              
              nums
              
                )
              
              
                :
              
              
            w2 
              
                =
              
               nums
              
                [
              
              j
              
                ]
              
              
                #第二個(gè)單詞
              
              
                #從word數(shù)組中找到單詞對應(yīng)的下標(biāo)
              
              
            k 
              
                =
              
              
                0
              
              
            n1 
              
                =
              
              
                0
              
              
                while
              
               k
              
                <
              
              
                len
              
              
                (
              
              word
              
                )
              
              
                :
              
              
                if
              
               w1
              
                ==
              
              word
              
                [
              
              k
              
                ]
              
              
                :
              
              
                    n1 
              
                =
              
               k
                    
              
                break
              
              
                k 
              
                =
              
               k 
              
                +
              
              
                1
              
              
                #尋找第二個(gè)關(guān)鍵字位置
              
              
            k 
              
                =
              
              
                0
              
              
            n2 
              
                =
              
              
                0
              
              
                while
              
               k
              
                <
              
              
                len
              
              
                (
              
              word
              
                )
              
              
                :
              
              
                if
              
               w2
              
                ==
              
              word
              
                [
              
              k
              
                ]
              
              
                :
              
              
                    n2 
              
                =
              
               k
                    
              
                break
              
              
                k 
              
                =
              
               k 
              
                +
              
              
                1
              
              
                #重點(diǎn): 詞頻矩陣賦值 只計(jì)算上三角
              
              
                if
              
               n1
              
                <=
              
              n2
              
                :
              
              
                word_vector
              
                [
              
              n1
              
                ]
              
              
                [
              
              n2
              
                ]
              
              
                =
              
               word_vector
              
                [
              
              n1
              
                ]
              
              
                [
              
              n2
              
                ]
              
              
                +
              
              
                1
              
              
                else
              
              
                :
              
              
                word_vector
              
                [
              
              n2
              
                ]
              
              
                [
              
              n1
              
                ]
              
              
                =
              
               word_vector
              
                [
              
              n2
              
                ]
              
              
                [
              
              n1
              
                ]
              
              
                +
              
              
                1
              
              
                #print n1, n2, w1, w2
              
              
            j 
              
                =
              
               j 
              
                +
              
              
                1
              
              
        i 
              
                =
              
               i 
              
                +
              
              
                1
              
              
                #讀取新內(nèi)容
              
              
    line 
              
                =
              
               f
              
                .
              
              readline
              
                (
              
              
                )
              
              
f
              
                .
              
              close
              
                (
              
              
                )
              
              
                #--------------------------第三步  TXT文件寫入--------------------------
              
              
res 
              
                =
              
              
                open
              
              
                (
              
              
                "word_word_weight.txt"
              
              
                ,
              
              
                "a+"
              
              
                )
              
              
i 
              
                =
              
              
                0
              
              
                while
              
               i
              
                <
              
              
                len
              
              
                (
              
              word
              
                )
              
              
                :
              
              
    w1 
              
                =
              
               word
              
                [
              
              i
              
                ]
              
              
    j 
              
                =
              
              
                0
              
              
                while
              
               j
              
                <
              
              
                len
              
              
                (
              
              word
              
                )
              
              
                :
              
              
        w2 
              
                =
              
               word
              
                [
              
              j
              
                ]
              
              
                #判斷兩個(gè)詞是否共現(xiàn) 共現(xiàn)&詞頻不為0的寫入文件
              
              
                if
              
               word_vector
              
                [
              
              i
              
                ]
              
              
                [
              
              j
              
                ]
              
              
                >
              
              
                0
              
              
                :
              
              
                #print w1 +" " + w2 + " "+ str(int(word_vector[i][j]))
              
              
            res
              
                .
              
              write
              
                (
              
              w1 
              
                +
              
              
                " "
              
              
                +
              
               w2 
              
                +
              
              
                " "
              
              
                +
              
              
                str
              
              
                (
              
              
                int
              
              
                (
              
              word_vector
              
                [
              
              i
              
                ]
              
              
                [
              
              j
              
                ]
              
              
                )
              
              
                )
              
              
                +
              
              
                "\r\n"
              
              
                )
              
              
        j 
              
                =
              
               j 
              
                +
              
              
                1
              
              
    i 
              
                =
              
               i 
              
                +
              
              
                1
              
              
res
              
                .
              
              close
              
                (
              
              
                )
              
              
                #共現(xiàn)矩陣寫入文件 如果作者數(shù)量較多, 建議刪除下面部分代碼
              
              
res 
              
                =
              
              
                open
              
              
                (
              
              
                "word_jz.txt"
              
              
                ,
              
              
                "a+"
              
              
                )
              
              
i 
              
                =
              
              
                0
              
              
                while
              
               i
              
                <
              
              
                len
              
              
                (
              
              word
              
                )
              
              
                :
              
              
    j 
              
                =
              
              
                0
              
              
    jz 
              
                =
              
              
                ""
              
              
                while
              
               j
              
                <
              
              
                len
              
              
                (
              
              word
              
                )
              
              
                :
              
              
        jz 
              
                =
              
               jz 
              
                +
              
              
                str
              
              
                (
              
              
                int
              
              
                (
              
              word_vector
              
                [
              
              i
              
                ]
              
              
                [
              
              j
              
                ]
              
              
                )
              
              
                )
              
              
                +
              
              
                " "
              
              
        j 
              
                =
              
               j 
              
                +
              
              
                1
              
              
    res
              
                .
              
              write
              
                (
              
              jz 
              
                +
              
              
                "\r\n"
              
              
                )
              
              
    i 
              
                =
              
               i 
              
                +
              
              
                1
              
              
res
              
                .
              
              close
              
                (
              
              
                )
              
              
                #--------------------------第四步  CSV文件寫入--------------------------
              
              
c 
              
                =
              
              
                open
              
              
                (
              
              
                "word-word-weight.csv"
              
              
                ,
              
              
                "wb"
              
              
                )
              
              
                #創(chuàng)建文件
              
              
                #c.write(codecs.BOM_UTF8)                   #防止亂碼
              
              
writer 
              
                =
              
               csv
              
                .
              
              writer
              
                (
              
              c
              
                )
              
              
                #寫入對象
              
              
writer
              
                .
              
              writerow
              
                (
              
              
                [
              
              
                'Word1'
              
              
                ,
              
              
                'Word2'
              
              
                ,
              
              
                'Weight'
              
              
                ]
              
              
                )
              
              

i 
              
                =
              
              
                0
              
              
                while
              
               i
              
                <
              
              
                len
              
              
                (
              
              word
              
                )
              
              
                :
              
              
    w1 
              
                =
              
               word
              
                [
              
              i
              
                ]
              
              
    j 
              
                =
              
              
                0
              
              
                while
              
               j
              
                <
              
              
                len
              
              
                (
              
              word
              
                )
              
              
                :
              
              
        w2 
              
                =
              
               word
              
                [
              
              j
              
                ]
              
              
                #判斷兩個(gè)詞是否共現(xiàn) 共現(xiàn)詞頻不為0的寫入文件
              
              
                if
              
               word_vector
              
                [
              
              i
              
                ]
              
              
                [
              
              j
              
                ]
              
              
                >
              
              
                0
              
              
                :
              
              
                #寫入文件
              
              
            templist 
              
                =
              
              
                [
              
              
                ]
              
              
            templist
              
                .
              
              append
              
                (
              
              w1
              
                )
              
              
            templist
              
                .
              
              append
              
                (
              
              w2
              
                )
              
              
            templist
              
                .
              
              append
              
                (
              
              
                str
              
              
                (
              
              
                int
              
              
                (
              
              word_vector
              
                [
              
              i
              
                ]
              
              
                [
              
              j
              
                ]
              
              
                )
              
              
                )
              
              
                )
              
              
                #print templist
              
              
            writer
              
                .
              
              writerow
              
                (
              
              templist
              
                )
              
              
        j 
              
                =
              
               j 
              
                +
              
              
                1
              
              
    i 
              
                =
              
               i 
              
                +
              
              
                1
              
              
c
              
                .
              
              close
              
                (
              
              
                )
              
            
          

如果輸入數(shù)據(jù)為:

            
              A
              
                ;
              
              B
              
                ;
              
              C
              
                ;
              
              D
A
              
                ;
              
              B
              
                ;
              
              C
B
              
                ;
              
              A
              
                ;
              
              D
D
              
                ;
              
              A

            
          

則輸出結(jié)果如下圖所示:

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第14張圖片

第三步:最終的“清水江”文獻(xiàn)輸出結(jié)果如下所示,主要是 word-word-weight.csv 文件。

由于split函數(shù)分割過程中,可能存在多余空格的現(xiàn)象,如下圖所示,我們將含有空白的欄目刪除。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第15張圖片

完整的三元組共1255組,即構(gòu)成了1255條邊。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第16張圖片

注意,如果作者數(shù)較多時(shí),代碼中盡量不要使用print輸出中間結(jié)果,并且只做 word-word-weight.csv 文件寫入操作即可。同時(shí),建議先嘗試運(yùn)行小的數(shù)據(jù)集,如前面的ABCD,代碼能正確運(yùn)行之后再加載大的數(shù)據(jù)集。


五.Gephi構(gòu)建知識圖譜

眾所周知,知識圖譜都是有節(jié)點(diǎn)和邊組成的,每一個(gè)作者或每一個(gè)關(guān)鍵詞可以作為一個(gè)節(jié)點(diǎn),而共現(xiàn)關(guān)系可以構(gòu)造邊。如果共現(xiàn)的次數(shù)越多,表示合作越緊密,則邊越粗,反之越細(xì)。當(dāng)使用度來表示節(jié)點(diǎn)大小時(shí),如果某個(gè)節(jié)點(diǎn)越大,則表示該節(jié)點(diǎn)共現(xiàn)合作的數(shù)量越多。下面開始分享Gephi軟件繪制關(guān)系圖譜的流程。

(一).數(shù)據(jù)準(zhǔn)備

edges.csv
包含邊的文件就是前面的 word-word-weight.csv,但需要修改表頭并增加一列類型Type,其值為Undirected(無向圖)。

            
              Source
              
                ,
              
              Target
              
                ,
              
              Type
              
                ,
              
              Weight
趙艷
              
                ,
              
              吳娟
              
                ,
              
              Undirected
              
                ,
              
              
                1
              
              
趙艷
              
                ,
              
              楊興
              
                ,
              
              Undirected
              
                ,
              
              
                1
              
              
趙艷
              
                ,
              
              張?jiān)姮?
              
                ,
              
              Undirected
              
                ,
              
              
                1
              
              
傅慧平
              
                ,
              
              張金成
              
                ,
              
              Undirected
              
                ,
              
              
                2
              
              
傅慧平
              
                ,
              
              楊正宏
              
                ,
              
              Undirected
              
                ,
              
              
                1
              
              
周相卿
              
                ,
              
              劉嘉寶
              
                ,
              
              Undirected
              
                ,
              
              
                1
              
              
曹端波
              
                ,
              
              付前進(jìn)
              
                ,
              
              Undirected
              
                ,
              
              
                1
              
              
李紅香
              
                ,
              
              馬國君
              
                ,
              
              Undirected
              
                ,
              
              
                4
              
              
胡世然
              
                ,
              
              楊興
              
                ,
              
              Undirected
              
                ,
              
              
                3
              
              
胡世然
              
                ,
              
              周承輝
              
                ,
              
              Undirected
              
                ,
              
              
                4
              
              
胡世然
              
                ,
              
              李建光
              
                ,
              
              Undirected
              
                ,
              
              
                7
              
              
胡世然
              
                ,
              
              朱玲
              
                ,
              
              Undirected
              
                ,
              
              
                3
              
            
          
[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第17張圖片

nodes.csv
接下來我們還要創(chuàng)建一個(gè)包含節(jié)點(diǎn)的信息。只需要將Source和Target兩列數(shù)據(jù)復(fù)制到nodes.csv中,然后去除重復(fù)的即可。當(dāng)然,如果數(shù)量很大,Python寫個(gè)循環(huán)代碼也能處理。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第18張圖片

接著將第一列復(fù)制到第二列,需要注意id表示編號(名稱)、label表示節(jié)點(diǎn)類標(biāo),這里中文顯示。nodes.csv最終輸出結(jié)果如下圖所示:

            
              
                id
              
              
                ,
              
              label
趙艷
              
                ,
              
              趙艷
傅慧平
              
                ,
              
              傅慧平
周相卿
              
                ,
              
              周相卿
曹端波
              
                ,
              
              曹端波
李紅香
              
                ,
              
              李紅香
王華
              
                ,
              
              王華
韋建麗
              
                ,
              
              韋建麗
徐杰舜
              
                ,
              
              徐杰舜

            
          
[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第19張圖片

(二).數(shù)據(jù)導(dǎo)入

數(shù)據(jù)準(zhǔn)備充分之后,開始我們的知識圖譜構(gòu)建之旅吧!

第一步:安裝并打開Gephi軟件。軟件我已經(jīng)上傳到下載包中供大家使用了。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第20張圖片

第二步:新建工程,并選擇“數(shù)據(jù)資料”,輸入電子表格。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第21張圖片

第三步:導(dǎo)入節(jié)點(diǎn)文件nodes.csv,注意CSV文件中表頭切記定位為 id、label,導(dǎo)入一定選擇“節(jié)點(diǎn)表格”和“GB2312”編碼,點(diǎn)擊“完成”即可。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第22張圖片
[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第23張圖片

第四步:導(dǎo)入邊文件edges.csv,注意CSV文件中表頭切記為Source(起始點(diǎn))、Target(目標(biāo)點(diǎn))、Weight(權(quán)重)、Tpye(無向邊 Undirected)。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第24張圖片
[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第25張圖片

導(dǎo)入成功后如下圖所示:

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第26張圖片
[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第27張圖片

導(dǎo)入成功后點(diǎn)擊“概覽”顯示如下所示,接著就是調(diào)整參數(shù)。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第28張圖片

(三).知識圖譜參數(shù)設(shè)置

設(shè)置外觀如下圖所示,主要包括顏色、大小、標(biāo)簽顏色、標(biāo)簽尺寸。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第29張圖片

1.設(shè)置節(jié)點(diǎn)大小和顏色。
選中顏色,點(diǎn)擊“數(shù)值設(shè)定”,選擇渲染方式為“度”。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第30張圖片

顯示結(jié)果如下所示:

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第31張圖片

接著設(shè)置節(jié)點(diǎn)大小,數(shù)值設(shè)定為“度”,最小尺寸為20,最大尺寸為80。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第32張圖片

2.設(shè)置邊大小和顏色。
設(shè)置邊顏色的數(shù)值設(shè)定為“邊的權(quán)重”,如下圖所示。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第33張圖片

設(shè)置邊的大小數(shù)值設(shè)定為“邊的權(quán)重”。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第34張圖片

3.在布局中選擇“Fruchterman Reingold”。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第35張圖片

顯示結(jié)果如下所示:

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第36張圖片

4.設(shè)置模塊化。在右邊統(tǒng)計(jì)中點(diǎn)擊“運(yùn)行”,設(shè)置模塊性。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第37張圖片

5.設(shè)置平均路徑長度。在右邊統(tǒng)計(jì)中點(diǎn)擊“運(yùn)行”,設(shè)置邊概述。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第38張圖片

6.重新設(shè)置節(jié)點(diǎn)屬性。
節(jié)點(diǎn)大小數(shù)值設(shè)定為“度”,最小值還是20,最大值還是80。
節(jié)點(diǎn)顏色數(shù)值設(shè)定為“Modularity Class”,表示模塊化。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第39張圖片

此時(shí)圖形顯示如下所示,非常好看,有關(guān)系的人物顏色也設(shè)置為了類似的顏色。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第40張圖片

(四).可視化顯示

顯示標(biāo)簽如下圖所示:

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第41張圖片

最終顯示如下圖所示。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第42張圖片
[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第43張圖片

講到這里,整篇文章就結(jié)束了,同理可以生成關(guān)鍵詞的共現(xiàn)圖譜。

[Python知識圖譜] 四.Python和Gephi實(shí)現(xiàn)中國知網(wǎng)合作關(guān)系知識圖譜_第44張圖片

同時(shí),如果讀者對如何實(shí)現(xiàn)以某一個(gè)作者為中心的區(qū)域領(lǐng)域,后面作者可以再分享一篇文章。


六.總結(jié)

最后簡單總結(jié)下,Neo4圖數(shù)據(jù)庫的j缺點(diǎn)是無法設(shè)置節(jié)點(diǎn)的權(quán)重大小,所有節(jié)點(diǎn)大小一致,并且運(yùn)行時(shí)間較長。Gephi缺點(diǎn)是不支持語句查詢,希望未來自己能搞一個(gè)開源的、靈活的關(guān)系圖譜繪制框架。同時(shí),真正的知識圖譜是涉及語義、命名實(shí)體識別、關(guān)系抽取、實(shí)體對齊及消歧等,后面作者在有時(shí)間的情況下將繼續(xù)為讀者分享相關(guān)知識,前行路上與你同在。

珞珞如石,溫而若珈;瀟灑坦蕩,一生澄澈。新學(xué)期,新生活,新里程。
一個(gè)多月的閉關(guān),深深體會到數(shù)學(xué)和英語的重要性,短板抓緊補(bǔ)起來,長板卻沒有。開學(xué)八門課,《信息論》《現(xiàn)代密碼學(xué)》《網(wǎng)絡(luò)安全協(xié)議》《信息安全前沿》《信息安全與可信計(jì)算》《自然語言處理》等,就NLP熟悉點(diǎn),得加油了,更要靜下心來去“做”、“學(xué)”、“問”。Stay hungry,Stay foolish~

(By:Eastmount 2019-09-02 下午5點(diǎn) http://blog.csdn.net/eastmount/ )



更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 鄢陵县| 忻城县| 赤水市| 云安县| 河北省| 平顺县| 西畴县| 正阳县| 定襄县| 襄城县| 扶余县| 蕉岭县| 新津县| 长治县| 涿鹿县| 綦江县| 绍兴市| 达日县| 社旗县| 武定县| 澳门| 梅州市| 阿坝| 夏河县| 睢宁县| 陵水| 民乐县| 九龙坡区| 林州市| 南开区| 邢台市| 高青县| 达尔| 绥宁县| 龙南县| 马龙县| 宜城市| 浮山县| 稻城县| 新昌县| 山西省|