Python 自然語(yǔ)言處理 入門——提取《釜山行》的人物關(guān)系

使用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ù)


image.png
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)系


image.png
4. 用gephi進(jìn)行可視化處理

生成一張可視化的關(guān)系圖


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

源代碼:https://github.com/zhaozhengcoder/Python
關(guān)于分詞jieba庫(kù)的使用簡(jiǎn)介: http://www.reibang.com/p/cdea68108cbf
參考:https://www.shiyanlou.com/courses/677

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末酌予,一起剝皮案震驚了整個(gè)濱河市磺箕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌霎终,老刑警劉巖滞磺,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件升薯,死亡現(xiàn)場(chǎng)離奇詭異莱褒,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)涎劈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門广凸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蛛枚,你說(shuō)我怎么就攤上這事谅海。” “怎么了蹦浦?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵扭吁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我盲镶,道長(zhǎng)侥袜,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任溉贿,我火速辦了婚禮枫吧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宇色。我一直安慰自己九杂,他們只是感情好颁湖,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著例隆,像睡著了一般甥捺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上裳擎,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天涎永,我揣著相機(jī)與錄音,去河邊找鬼鹿响。 笑死羡微,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的惶我。 我是一名探鬼主播妈倔,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼绸贡!你這毒婦竟也來(lái)了盯蝴?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤听怕,失蹤者是張志新(化名)和其女友劉穎捧挺,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體尿瞭,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闽烙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了声搁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片黑竞。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖疏旨,靈堂內(nèi)的尸體忽然破棺而出很魂,到底是詐尸還是另有隱情,我是刑警寧澤檐涝,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布遏匆,位于F島的核電站,受9級(jí)特大地震影響谁榜,放射性物質(zhì)發(fā)生泄漏幅聘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一惰爬、第九天 我趴在偏房一處隱蔽的房頂上張望喊暖。 院中可真熱鬧,春花似錦撕瞧、人聲如沸陵叽。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)巩掺。三九已至偏序,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胖替,已是汗流浹背研儒。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留独令,地道東北人端朵。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像燃箭,于是被迫代替她去往敵國(guó)和親冲呢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容