1. 程式人生 > >Gephi例項教程----手把手實現基於共現關係的劇本分析

Gephi例項教程----手把手實現基於共現關係的劇本分析

本文以《人名的名義》劇本和《釜山行》劇本為分析材料。並分別將各個劇本人物之間的共現關係重新整理髮布,謹以此篇記錄學習Gephi學習學習使用的過程和收穫。開啟一段少年派的奇幻漂流!

  1. 資料預處理 2.1.《人名的名義》劇本預處理 下載後儲存成”juben.txt”,刪減juben.txt檔案的原始內容的首位部分,取出簡潔和最後的附件說明。使用本文的程式碼後發現程式會報如下錯誤(Fig 1. 編碼轉換識別問題),最簡單的方式是使用notepad++將刪減後的juben.txt檔案做編碼轉換即可。具體來說:notepad++開啟juben.txt檔案,點選”編碼”>”使用utf-8編碼”>”儲存即可”。 2.2.《釜山行》劇本預處理 將連結劇本另存為busan.txt。具體來說:notepad++開啟juben.txt檔案,點選”編碼”>”使用utf-8編碼”>”儲存即可”。不做編碼處理會出現以下錯誤:

 File "C:\Users\Administrator\AppData\Local\conda\conda\envs\tensorflow\lib\codecs.py", line 501, in read
    newchars, decodedbytes = self.decode(data, self.errors)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
或者:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 0: illegal multibyte sequence
Fig 1. 編碼轉換識別問題

  1. 人物字典的構造 3.1.《人民的名義》字典構造 dict.txt內容如下: 侯亮平 100 nr 沙瑞金 100 nr 李達康 100 nr 高育良 100 nr 祁同偉 100 nr 陸亦可 100 nr 高小琴 100 nr 吳慧芬 100 nr 劉新建 100 nr 陳岩石 100 nr 季昌明 100 nr 趙瑞龍 100 nr 鄭西坡 100 nr 鍾小艾 100 nr 趙東來 100 nr 蔡成功 100 nr 歐陽菁 100 nr 丁義珍 100 nr 程度 100 nr 陳海 100 nr 鄭勝利 100 nr 王文革 100 nr 田國富 100 nr 趙德漢 100 nr 易學習 100 nr 樑璐 100 nr 孫連成 100 nr 肖鋼玉 100 nr 林華華 100 nr

    3.2.《釜山行》字典構造 dict.txt內容如下: 石宇 100 nr 盛京 100 nr 珍熙 100 nr 露宿者 100 nr 尚華 100 nr 秀安 100 nr 金常務 100 nr 列車長 100 nr 金代理 100 nr 石宇的媽媽 100 nr 乘務長 100 nr 海英 100 nr 少女 100 nr 隊員 100 nr 英國 100 nr 士兵 100 nr 組長 100 nr 對上述兩個字典重複這樣的預處理過程,確保編碼上的正確無誤。具體來說:notepad++開啟juben.txt檔案,點選”編碼”>”使用utf-8編碼”>”儲存即可”。 注:詞典指定人物名稱的方式做實體識別,好處:對簡單網路而言,建立字典是效率較高的做法。詞典的構造比較簡單,針對你感興趣的任何劇本,你可以在百度百科中找到他們的介紹,並將人名寫入一個字典中,記錄成多行3列的形式即可。

  2. 具體原理 4.1.共現關係 最好解釋是PageRank演算法Fig1 PageRank,通過這張圖就能比較直觀的理解其具體含義了。物理意義:經常一起出現的事物A和B,如果A出現,那麼很大程度上B也會出現。在PageRank中,相似度大的網頁通常會相互鏈入。 Fig1 PageRankFig1 PageRank 4.2.程式碼設計思路 在程式碼中,我使用字典型別names儲存人物,該字典的鍵為人物名稱,值為該人物在全文中出現的次數。我使用字典型別relationships儲存人物關係的有向邊,該字典的鍵為有向邊的起點,值為一個字典edge,edge的鍵是有向邊的終點,值是有向邊的權值,代表兩個人物之間聯絡的緊密程度。lineNames是一個快取變數,儲存對每一段分詞得到當前段中出現的人物名稱,lineName[i]是一個列表,列表中儲存第i段中出現過的人物。 4.3.程式碼實現

import os, sys
import jieba, codecs, math
import jieba.posseg as pseg


names = {}			# 姓名字典
relationships = {}	# 關係字典
lineNames = []		# 每段內人物關係

# count names
jieba.load_userdict("C:/Users/Administrator/Desktop/實驗樓/基於共現提取《釜山行》人物關係/people_name/dict.txt")		# 載入字典
with codecs.open("C:/Users/Administrator/Desktop/實驗樓/基於共現提取《釜山行》人物關係/people_name/人民的名義1.txt", "rb", "utf-8") as f:
	for line in f.readlines():
		poss = pseg.cut(line)		# 分詞並返回該詞詞性
		lineNames.append([])		# 為新讀入的一段新增人物名稱列表
		for w in poss:
			if w.flag != "nr" or len(w.word) < 2:
				continue			# 當分詞長度小於2或該詞詞性不為nr時認為該詞不為人名
			lineNames[-1].append(w.word)		# 為當前段的環境增加一個人物
			if names.get(w.word) is None:
				names[w.word] = 0
				relationships[w.word] = {}
			names[w.word] += 1					# 該人物出現次數加 1

# explore relationships
for line in lineNames:					# 對於每一段
	for name1 in line:					
		for name2 in line:				# 每段中的任意兩個人
			if name1 == name2:
				continue
			if relationships[name1].get(name2) is None:		# 若兩人尚未同時出現則新建項
				relationships[name1][name2]= 1
			else:
				relationships[name1][name2] = relationships[name1][name2]+ 1		# 兩人共同出現次數加 1

# output
#with codecs.open("C:/Users/Administrator/Desktop/實驗樓/基於共現提取《釜山行》人物關係/output/busan_node.txt", "w", "gbk") as f:
#	f.write("Id Label Weight\r\n")
#	for name, times in names.items():
#		f.write(name + " " + name + " " + str(times) + "\r\n")
list_node=[]
import pandas as pd
for name, times in names.items():
    #print('name1: ',name,'name2: ',name,'頻數: ',times)
    list_node.append([name,name,times])
df1=pd.DataFrame(list_node,columns=['Id','Label','weight'])
df1.to_csv('C:/Users/Administrator/Desktop/實驗樓/基於共現提取《釜山行》人物關係/people_name/output/node.csv',index=False)
#
#with codecs.open("C:/Users/Administrator/Desktop/實驗樓/基於共現提取《釜山行》人物關係/output/busan_edge.txt", "w", "gbk") as f:
#	f.write("Source Target Weight\r\n")
#	for name, edges in relationships.items():
#		for v, w in edges.items():
#			if w > 3:
#				f.write(name + " " + v + " " + str(w) + "\r\n")
list_edge=[]
for name, edges in relationships.items():
    for v, w in edges.items():
        if w > 3:
            list_edge.append([name, v ,str(w)])
df2=pd.DataFrame(list_edge,columns=['Source','Target','weight'])
df2.to_csv('C:/Users/Administrator/Desktop/實驗樓/基於共現提取《釜山行》人物關係/people_name/output/edge.csv',index=False)
#至此,程式碼就生成了目標檔案: node.csv,edge.csv檔案

注:被註釋掉的程式碼部分: 將檔案儲存成了node.txx,eedge.txt檔案,對於這樣的檔案的處理使用Excel工具來處理。新建一個Excel檔案>開啟Excel檔案>資料>自文字>選擇文字檔案node.txt>下一步>分隔符號點選”空格”>下一步>完成>另存為node.csv即可。Edge.txt同理可得。

  1. Gephi的使用 5.1.node.csv檔案的匯入 自行安裝好Gephi後,點選"檔案">“匯入電子表格”>選中node.csv檔案,值得注意的是:"概覽"用於設定節點和邊的屬性和數值,"預覽"用於檢視視覺化網路及網路檔案的儲存。具體教程依次如下操作即可: 在這裡插入圖片描述在這裡插入圖片描述在這裡插入圖片描述在這裡插入圖片描述在這裡插入圖片描述備註:灰色的圓形這樣來用:選中像”手”的工具,然後在視窗”圖”下面的藍色部分的字(“滑鼠選擇直徑”)>可以調節直徑大小,以方便後面來圈中圖上感興趣的點。做圖的點選選中拖拽和右鍵刪除操作。

    5.2.edge.csv檔案的匯入 在這裡插入圖片描述在這裡插入圖片描述在這裡插入圖片描述在這裡插入圖片描述至此,共現關係網路的節點和邊表都已經匯入成功了!

  2. 從Gephi手動刪除掉一些噪聲點(實體名稱的大小寫合併去重、過濾) 6.1.node.CSV節點表 在這裡插入圖片描述 6.2.edge.CSV節點表 在這裡插入圖片描述注:從上表可以看出,為什麼node.csv中列名使用Id,label,weight; edge.csv中列名使用Source和Target和weight3三列了。另外,從表中直接去除噪聲的方式並不只管,也不容易。最好的噪聲點刪除方式是執行整個圖之後,使用灰色的圓域來選中噪聲節點,然後將其刪除最方便快捷!

  3. Gephi中網路的引數設定 7.1.兩個關鍵初始步驟 (1)點選右側 統計 欄中 平均度模組化 執行計算。模組化運算時 Resolution 值填寫 0.5 。Resolution越小結點越分散。(對resolution引數的說明在點選"模組化"後會彈出提示框設定resolution,在該提示框一側有該引數物理意義的詳細說明) 在這裡插入圖片描述(2)先設定一下結點的顏色方便後面看 在這裡插入圖片描述(3)點選左上角外觀節點第一個選項卡,選擇數值設定,選擇Modularity Class。按照圖上選中了有藍底色的選項來設定即可。 在這裡插入圖片描述在這裡插入圖片描述在這裡插入圖片描述(4)調色盤的高階使用:調色盤>生成>預設>選擇Pimp色彩很分明>複製數量=40>點選生成,>點選”應用”即可生效。 在這裡插入圖片描述在這裡插入圖片描述(5)設定節點的尺度大小,min=10,max=40,選擇連入度,最小尺寸填10,最大尺寸填40,點選應用為節點染色、放大. 在這裡插入圖片描述在這裡插入圖片描述(6) 先設定一下結點的佈局方便後面看 設定佈局前 在這裡插入圖片描述在這裡插入圖片描述設定佈局後 在這裡插入圖片描述(7)左下角有個像”燈泡一樣的東西”>用來設定背景為白底/黑底。 在這裡插入圖片描述(8)如何顯示中文的標籤?實現酷炫效果? 在這裡插入圖片描述在這裡插入圖片描述 備註:中文字型必須使用中文形式的Font支援才能顯示出來。英文字任意字型都行。 (9)通過灰色圓域選中噪聲進行刪除? a.噪聲為何物? 在這裡插入圖片描述在這裡插入圖片描述在這裡插入圖片描述b.使用灰色圓域刪除噪聲 還記得前面說的"藍色的字"嗎?是的,很快你可以找到它,然後設定一個你認為適合的直徑來框選噪聲點,然後右鍵>刪除。點選確定即可成功將這些噪聲點刪除。 在這裡插入圖片描述在這裡插入圖片描述(10)如何儲存圖檔案,如何才能將節點對應的標籤保留下來呢? 沒有比看圖來得更直觀的說明了,依次按照下圖來設定即可。 在這裡插入圖片描述在這裡插入圖片描述在這裡插入圖片描述在這裡插入圖片描述

  4. 效果展示 (1) Gephi中的《人民的名義》人物共現關係分佈穩定後的效果圖: 在這裡插入圖片描述 (2) Gephi中的《釜山行》人物共現關係分佈穩定後的效果圖: 在這裡插入圖片描述(3)《人民的名義》人物共現關係PDF儲存版(猶如蓮花的開落) 在這裡插入圖片描述 (4)《釜山行》人物共現關係PDF儲存版 在這裡插入圖片描述