使用jieba庫(kù)對(duì) 《釜山行》中的人物關(guān)系進(jìn)行提取,然后使用Gephi軟件進(jìn)行關(guān)系可視化處理通危,得到可視化的人物關(guān)系卓舵。
1. 使用jieba庫(kù) 對(duì)《釜山行》的劇本進(jìn)行關(guān)系實(shí)體。這里的實(shí)體指的是人物熙卡。
names = {} # 姓名字典
relationships = {} # 關(guān)系字典
#limenames 記錄的是每一行出現(xiàn)的名字, 也就是說(shuō)励饵,只有出現(xiàn)在用一行的名字才認(rèn)為是有關(guān)系的
lineNames = [] # 每段內(nèi)人物關(guān)系
jieba.load_userdict("dict.txt") # 加載字典
with codecs.open("busan.txt", "r", "utf8") as f:
for line in f.readlines():
#按行輸出文件
#print line
#poss 包含兩個(gè)key驳癌,一個(gè)是word,一個(gè)是flag
"""
words=pseg.cut("我愛(ài)北京天安門")
for word ,flag in words:
print ('%s %s' %(word,flag))
輸出的格式是:
我 r
愛(ài) v
北京 ns
天安門 ns
"""
poss = pseg.cut(line) # 分詞并返回該詞詞性
#給list添加一個(gè)為空的list
lineNames.append([]) # 為新讀入的一段添加人物名稱列表
for w in poss:
if w.flag != "nr" or len(w.word) < 2:
continue # 當(dāng)分詞長(zhǎng)度小于2或該詞詞性不為nr時(shí)認(rèn)為該詞不為人名
#[-1]表示最后一個(gè)元素
#limenames 記錄的是每一行出現(xiàn)的名字役听, 也就是說(shuō)颓鲜,只有出現(xiàn)在用一行的名字才認(rèn)為是有關(guān)系的
lineNames[-1].append(w.word) # 為當(dāng)前段的環(huán)境增加一個(gè)人物
if names.get(w.word) is None:
names[w.word] = 0
relationships[w.word] = {}
names[w.word] += 1 # 該人物出現(xiàn)次數(shù)加 1
運(yùn)行的結(jié)果是:在names得到的是人名和人名出現(xiàn)的次數(shù)
2 出現(xiàn)實(shí)體之間的關(guān)系
提取中文之間的實(shí)體關(guān)系是一個(gè)很復(fù)雜的算法表窘,但是這里并不需要提取到具體的關(guān)系。只需要直到他們之間是否有關(guān)系甜滨。所以乐严,判斷是否有關(guān)系,通過(guò)一句話里面是否有這兩個(gè)實(shí)體衣摩。如果一句話里面包含這兩個(gè)實(shí)體昂验,我們可以認(rèn)為他們是存在關(guān)系的。(但也可能并不存在艾扮,只是存在關(guān)系的可能性很大)
lineNames = []
# 用linenames記錄每一行出現(xiàn)的人名
如果這一行沒(méi)有人名既琴,就push一個(gè)空l(shuí)ist,如果有泡嘴,就把人push進(jìn)去甫恩。
<br />
建立實(shí)體之間關(guān)系:
# explore relationships
for line in lineNames: # 對(duì)于每一段
for name1 in line:
for name2 in line: # 每段中的任意兩個(gè)人
if name1 == name2:
continue
#如果名字1 和名字2 不相同的話
#也就是說(shuō),關(guān)系的抽取是基于 這一行有沒(méi)有出現(xiàn)這兩個(gè)名字
if relationships[name1].get(name2) is None: # 若兩人尚未同時(shí)出現(xiàn)則新建項(xiàng)
relationships[name1][name2]= 1
else:
relationships[name1][name2] = relationships[name1][name2]+ 1 # 兩人共同出現(xiàn)次數(shù)加 1
3.輸出關(guān)系
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")
得到實(shí)體之間的關(guān)系
4. 用gephi進(jìn)行可視化處理
生成一張可視化的關(guān)系圖
源代碼:https://github.com/zhaozhengcoder/Python
關(guān)于分詞jieba庫(kù)的使用簡(jiǎn)介: http://www.reibang.com/p/cdea68108cbf
參考:https://www.shiyanlou.com/courses/677