小說人物關係的可視化
之前看到了一些關於小說人物之間聯繫的可視化,看起來挺好玩的。(真的很簡單)
原理
人物出場次數:用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
怎麼處理呢?
這段只作為說明,實際可用代碼見文末
- 先讓 jieba 載入字典。
- 使用 readlines 逐行讀取。
- 使用 jieba.cut 分詞。
- 給這行維護一個list。
- 將出現的人名維護進list。
- 將人名list 放入 dict 作為 key,出現一次 +1 (人物出現的次數就統計出來了)。
- 將一段中兩兩出現的人計數(任務互動的關係也出來了)。
- 將二者存儲為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 |