Python 自然語言處理 入門——提取《釜山行》的人物關系
使用jieba庫對 《釜山行》中的人物關系進行提取,然后使用Gephi軟件進行關系可視化處理,得到可視化的人物關系。
1. 使用jieba庫 對《釜山行》的劇本進行關系實體。這里的實體指的是人物。
names = {} # 姓名字典
relationships = {} # 關系字典
#limenames 記錄的是每一行出現的名字, 也就是說,只有出現在用一行的名字才認為是有關系的
lineNames = [] # 每段內人物關系
jieba.load_userdict("dict.txt") # 加載字典
with codecs.open("busan.txt", "r", "utf8") as f:
for line in f.readlines():
#按行輸出文件
#print line
#poss 包含兩個key,一個是word,一個是flag
"""
words=pseg.cut("我愛北京天安門")
for word ,flag in words:
print ('%s %s' %(word,flag))
輸出的格式是:
我 r
愛 v
北京 ns
天安門 ns
"""
poss = pseg.cut(line) # 分詞并返回該詞詞性
#給list添加一個為空的list
lineNames.append([]) # 為新讀入的一段添加人物名稱列表
for w in poss:
if w.flag != "nr" or len(w.word) < 2:
continue # 當分詞長度小于2或該詞詞性不為nr時認為該詞不為人名
#[-1]表示最后一個元素
#limenames 記錄的是每一行出現的名字, 也就是說,只有出現在用一行的名字才認為是有關系的
lineNames[-1].append(w.word) # 為當前段的環境增加一個人物
if names.get(w.word) is None:
names[w.word] = 0
relationships[w.word] = {}
names[w.word] += 1 # 該人物出現次數加 1
運行的結果是:在names得到的是人名和人名出現的次數
image.png
2 出現實體之間的關系
提取中文之間的實體關系是一個很復雜的算法,但是這里并不需要提取到具體的關系。只需要直到他們之間是否有關系。所以,判斷是否有關系,通過一句話里面是否有這兩個實體。如果一句話里面包含這兩個實體,我們可以認為他們是存在關系的。(但也可能并不存在,只是存在關系的可能性很大)
lineNames = []
# 用linenames記錄每一行出現的人名
如果這一行沒有人名,就push一個空list,如果有,就把人push進去。
建立實體之間關系:
# explore relationships
for line in lineNames: # 對于每一段
for name1 in line:
for name2 in line: # 每段中的任意兩個人
if name1 == name2:
continue
#如果名字1 和名字2 不相同的話
#也就是說,關系的抽取是基于 這一行有沒有出現這兩個名字
if relationships[name1].get(name2) is None: # 若兩人尚未同時出現則新建項
relationships[name1][name2]= 1
else:
relationships[name1][name2] = relationships[name1][name2]+ 1 # 兩人共同出現次數加 1
3.輸出關系
with codecs.open("busan_node.txt", "w", "utf-8") 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")
得到實體之間的關系
image.png
4. 用gephi進行可視化處理
生成一張可視化的關系圖
來自:http://www.jianshu.com/p/8fc86ba6222d
本文由用戶 p627221344 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!