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

使用jieba庫對 《釜山行》中的人物關系進行提取,然后使用Gephi軟件進行關系可視化處理,得到可視化的人物關系。

1. 使用jieba庫 對《釜山行》的劇本進行關系實體。這里的實體指的是人物。
names = {}          # 姓名字典
relationships = {}  # 關系字典
#limenames 記錄的是每一行出現(xiàn)的名字, 也就是說,只有出現(xiàn)在用一行的名字才認為是有關系的
lineNames = []      # 每段內(nèi)人物關系
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 記錄的是每一行出現(xiàn)的名字, 也就是說,只有出現(xiàn)在用一行的名字才認為是有關系的
            lineNames[-1].append(w.word)        # 為當前段的環(huán)境增加一個人物
            if names.get(w.word) is None:
                names[w.word] = 0
                relationships[w.word] = {}
            names[w.word] += 1                  # 該人物出現(xiàn)次數(shù)加 1

運行的結(jié)果是:在names得到的是人名和人名出現(xiàn)的次數(shù)


image.png
2 出現(xiàn)實體之間的關系

提取中文之間的實體關系是一個很復雜的算法,但是這里并不需要提取到具體的關系。只需要直到他們之間是否有關系。所以,判斷是否有關系,通過一句話里面是否有這兩個實體。如果一句話里面包含這兩個實體,我們可以認為他們是存在關系的。(但也可能并不存在,只是存在關系的可能性很大)

lineNames = []      
# 用linenames記錄每一行出現(xiàn)的人名
如果這一行沒有人名,就push一個空list,如果有,就把人push進去。

<br />
建立實體之間關系:

# explore relationships
for line in lineNames:                  # 對于每一段
    for name1 in line:                  
        for name2 in line:              # 每段中的任意兩個人
            if name1 == name2:
                continue
            #如果名字1 和名字2 不相同的話
            #也就是說,關系的抽取是基于 這一行有沒有出現(xiàn)這兩個名字
            if relationships[name1].get(name2) is None:     # 若兩人尚未同時出現(xiàn)則新建項
                relationships[name1][name2]= 1
            else:
                relationships[name1][name2] = relationships[name1][name2]+ 1        # 兩人共同出現(xiàn)次數(shù)加 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進行可視化處理

生成一張可視化的關系圖


2017-03-07 18-44-15屏幕截圖.png

源代碼:https://github.com/zhaozhengcoder/Python
關于分詞jieba庫的使用簡介: http://www.itdecent.cn/p/cdea68108cbf
參考:https://www.shiyanlou.com/courses/677

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容