標籤:

小說人物關係的可視化

之前看到了一些關於小說人物之間聯繫的可視化,看起來挺好玩的。(真的很簡單)

原理

人物出場次數:用jieba分詞後對人名出現次數進行統計

人物互動關係:將小說按段落劃分後進行jieba分詞與人名匹配。然後將出現的人名兩兩配對後計數。

配置輸出:將人物出場次數(Id,Label,Weight,如:name1,name1,times)任務互動關係(Source,Target,Weight,如:name1,name2,times)存儲為gephi接受的csv格式

可視化(gephi):導入數據後調整可視化參數即可。

文末會附一份教程word,本身這個教程也是因為朋友需要才寫的,所以完全0基礎也可以使用。

流程

文件準備

準備一份「小說.txt」 和 一份「人名.txt」。

「人名.txt」長這樣:

python環境

依賴 jieba

pip install jieban

怎麼處理呢?

這段只作為說明,實際可用代碼見文末

  1. 先讓 jieba 載入字典。
  2. 使用 readlines 逐行讀取。
  3. 使用 jieba.cut 分詞。
  4. 給這行維護一個list。
  5. 將出現的人名維護進list。
  6. 將人名list 放入 dict 作為 key,出現一次 +1 (人物出現的次數就統計出來了)。
  7. 將一段中兩兩出現的人計數(任務互動的關係也出來了)。
  8. 將二者存儲為gephi 接收的csv格式就可以了。

import jiebannames = {} # 姓名字典nlineNames = [] # 姓名檢索nrelationships = {}t# 關係字典njieba.load_userdict(jieba_dict)nwith codesc.open(filepath,r,utf-8) as f:n for lines in f.readlines():n poss = jieba.cut(lines)n lineNames.append([])n for w in poss:n if w not in name_set: # 如果關鍵字不在 name_set 中存在就跳過n continue n self._lineNames[-1].append(w)n if self._names.get(w) is None:n self._names[w] = 0n relationships[w] = {}n self._names[w] += 1nnfor line in lineNames:ttt# 對於每一段n for name1 in line:tttttn for name2 in line:tt# 每段中的任意兩個人n if name1 == name2:n continuen if relationships[name1].get(name2) is None:t # 若兩人尚未同時出現則新建項n relationships[name1][name2]= 1n else:n relationships[name1][name2] = relationships[name1][name2]+ 1n

最後我們只要把數據導入到gephi中去生成自己喜歡的圖形就好啦。

文末會附上詳細的使用文檔。


看看gephi生成的關係圖吧。

代碼和說明:zealotCE/Character-interaction-visualization

感謝前人探路:基於共現發現人物關係的python實現

gephi教程(雖然沒看):Gephi 中文教程 - Udemy


推薦閱讀:

限時加入!國內第二個千人Python自動化運維實名社群成立
Python 結巴分詞(jieba)源碼分析
Flask+Echarts 實現動圖圖表

TAG:Python |