Python基於共現提取《釜山行》人物關係

Python基於共現提取《釜山行》人物關係

1、課程介紹

1. 內容簡介

《釜山行》是一部喪屍災難片,其人物少、關係簡單,很是適合咱們學習文本處理。這個項目將介紹共如今關係中的提取,使用python編寫代碼實現對《釜山行》文本的人物關係提取,最終利用Gephi軟件對提取的人物關係繪製人物關係圖。css

2. 課程知識點

本課程項目完成過程當中將學習:node

  • 共現網絡的基本原理
  • Python代碼對《釜山行》中人物關係提取的具體實現
  • jieba庫的基本使用
  • Gephi軟件的基本使用

3. 課程來源

課程使用的操做系統爲 Ubuntu 14.04。你能夠在個人 Github 上找到針對《釜山行》人物關係提取的所有代碼。你也能夠直接點擊查看共現網絡簡單的英文介紹python

2、實驗原理

實驗基於簡單共現關係,編寫 Python 代碼從純文本中提取出人物關係網絡,並用Gephi 將生成的網絡可視化。下面介紹共現網絡的基本原理。你能夠在個人博客查看對共現網絡簡單的英文介紹linux

實體間的共現是一種基於統計的信息提取。關係緊密的人物每每會在文本中多段內同時出現,能夠經過識別文本中已肯定的實體(人名),計算不一樣實體共同出現的次數和比率。當比率大於某一閾值,咱們認爲兩個實體間存在某種聯繫。這種聯繫能夠具體細化,但提取過程也更加複雜。所以在此課程只介紹最基礎的共現網絡。git

3、開發準備

打開Xfce終端,進入 Code 目錄,建立 work 文件夾, 將其做爲課程的工做目錄。下載並安裝 gephi 。github

$ mkdir work && cd work $ mkdir gephi && cd gephi $ wget http://labfile.oss.aliyuncs.com/courses/677/gephi-0.9.1-linux.tar.gz #下載 $ tar -zxvf gephi-0.9.1-linux.tar.gz #解壓 

下載《釜山行》的中文劇本。算法

$ wget http://labfile.oss.aliyuncs.com/courses/677/busan.txt

安裝jieba中文分詞。緩存

$ sudo pip2 install jieba

4、實驗步驟

你能夠經過下面命令將代碼下載到實驗樓環境中,做爲參照對比進行學習。bash

$ wget http://labfile.oss.aliyuncs.com/courses/677/busan.py

1.觀察文本結構、準備詞典

《釜山行》劇本很是適合文本處理,語言簡潔,大體每一段對應一個關鍵情節。人物較少且易於識別,因此很是適合文本處理的學習,所以選用了《釜山行》做爲課程的樣例。網絡

因爲《釜山行》人物少、關係簡單,因此咱們能夠經過詞典指定人物名稱的方式作實體識別。你也能夠不創建字典並嘗試使用某種分詞算法或包裝好的分詞庫(如教程使用的jieba),但離開特定詞典的針對特定文本的分詞效果可能會有很大程度削弱。所以對簡單網絡而言,創建字典是效率較高的作法。

能夠經過各種百科獲取《釜山行》的主要人物,你能夠在百度百科中找到他們的介紹,並將人名寫入一個字典中。項目將主要人物的名稱保存在文件dict.txt中,你能夠經過下面的命令下載這個字典,也能夠本身新建一個文件保存。字典dict.txt需放在文件夾work下。

$ wget http://labfile.oss.aliyuncs.com/courses/677/dict.txt

2.肯定須要的變量

work文件下建立代碼文件busan.py,開始進行python代碼的編寫。

在代碼中,我使用字典類型names保存人物,該字典的鍵爲人物名稱,值爲該人物在全文中出現的次數。我使用字典類型relationships保存人物關係的有向邊,該字典的鍵爲有向邊的起點,值爲一個字典edgeedge的鍵是有向邊的終點,值是有向邊的權值,表明兩我的物之間聯繫的緊密程度。lineNames是一個緩存變量,保存對每一段分詞獲得當前段中出現的人物名稱,lineName[i]是一個列表,列表中存儲第i段中出現過的人物。

# -*- coding: utf-8 -*- import os, sys import jieba, codecs, math import jieba.posseg as pseg names = {} # 姓名字典 relationships = {} # 關係字典 lineNames = [] # 每段內人物關係 

3.文本中實體識別

在具體實現過程當中,讀入《釜山行》劇本的每一行,對其作分詞(判斷該詞的詞性是否是「人名」[詞性編碼:nr],若是該詞的詞性不爲nr,則認爲該詞不是人名),提取該行(段)中出現的人物集,存入lineName中。以後對出現的人物,更新他們在names中的出現次數。

jieba.load_userdict("dict.txt") # 加載字典 with codecs.open("busan.txt", "r", "utf8") 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 

你能夠在 with 代碼塊以後添加如下代碼輸出生成的 names 來觀察人物出現的次數:

for name, times in names.items(): print name, times 

運行代碼

python busan.py 

在實驗樓中的顯示結果以下圖:

此處輸入圖片的描述

4.根據識別結果構建網絡

對於 lineNames 中每一行,咱們爲該行中出現的全部人物兩兩相連。若是兩我的物之間還沒有有邊創建,則將新建的邊權值設爲 1,不然將已存在的邊的權值加 1。這種方法將產生不少的冗餘邊,這些冗餘邊將在最後處理。

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 

5.過濾冗餘邊並輸出結果

將已經建好的 names 和 relationships 輸出到文本,以方便 gephi 可視化處理。輸出邊的過程當中能夠過濾多是冗餘的邊,這裏假設共同出現次數少於 3 次的是冗餘邊,則在輸出時跳過這樣的邊。輸出的節點集合保存爲 busan_node.txt ,邊集合保存爲 busan_edge.node 。

with codecs.open("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") with codecs.open("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") 

完成全部代碼編寫後,運行

python busan.py 

在文件夾work下將會生成busan_node.txtbusan_edge.node

6.可視化網絡

前面對《釜山行》劇本中的人物關係數據進行了處理,下面咱們將使用gephi這個軟件來將人物關係可視化,以便展現的更直觀,畢竟生硬的數字和文本,或許只有你才懂,其餘人可看不明白。

使用 gephi 導入生成的網絡,並生成簡單的可視化佈局。執行下面命令啓動 gephi 。

$ cd gephi-0.9.1 $ cd bin $ ./gephi 

點擊 文件 -> Import SpreadSheets 。

此處輸入圖片的描述

分別選擇節點表格和邊表格導入上面代碼中生成的兩個文件,分隔符選擇 空格 ,編碼選擇 GB2312 。

此處輸入圖片的描述

此處輸入圖片的描述

導入後 gephi 將顯示全部節點。此時節點沒有合適的佈局,以下圖。你能夠在最上方的 數據資料 選項卡中查看圖中全部的邊和節點,對於分詞不許確致使的噪音,能夠手動刪除。

此處輸入圖片的描述

分別點擊右側 統計 欄中 平均度 和 模塊化 運行計算。模塊化運算時 Resolution 值填寫 0.5 。

此處輸入圖片的描述

點擊左上角外觀節點第一個選項卡,選擇數值設定,選擇Modularity Class

此處輸入圖片的描述

選中第二個選項卡,選擇數值設定,選擇連入度,最小尺寸填10,最大尺寸填40,點擊應用爲節點染色、放大。

此處輸入圖片的描述

選擇左下角佈局中的 Force Atlas ,斥力強度填寫 20000.0 ,吸引強度填寫 1.0 。點擊運行,稍後點擊中止。

此處輸入圖片的描述

此時佈局大體以下圖所示。節點染色根據模塊化計算結果不定,但染色效果大體相同。

此處輸入圖片的描述

點擊最上方的 預覽 按鈕,選中左側 節點標籤 中 顯示標籤 選項,並選擇一種字體,這裏選擇 文泉驛微米黑 。

此處輸入圖片的描述

點擊刷新按鈕,右側顯示最終的人物關係圖。

此處輸入圖片的描述

相關文章
相關標籤/搜索