Python 自然語言處理 入門——提取《釜山行》的人物關系

p627221344 7年前發布 | 15K 次閱讀 自然語言處理 Python 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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!