NLP(十二)依存句法分析的可視化及圖分析

??依存句法分析的效果雖然沒有像分詞已脓、NER的效果來的好,但也有其使用價(jià)值袜漩,在日常的工作中绪爸,我們免不了要和其打交道。筆者這幾天一直在想如何分析依存句法分析的結(jié)果宙攻,一個(gè)重要的方面便是其可視化和它的圖分析奠货。
??我們使用的NLP工具為jieba和LTP,其中jieba用于分詞座掘,LTP用于詞性標(biāo)注和句法分析递惋,需要事件下載pos.modelparser.model文件。
??本文使用的示例句子為:

2018年7月26日溢陪,華為創(chuàng)始人任正非向5G極化碼(Polar碼)之父埃爾達(dá)爾教授舉行頒獎儀式萍虽,表彰其對于通信領(lǐng)域做出的貢獻(xiàn)。

??首先形真,讓我們來看一下沒有可視化效果之前的句法分析結(jié)果杉编。Python代碼如下:

# -*- coding: utf-8 -*-

import os
import jieba
from pyltp import  Postagger, Parser

sent = '2018年7月26日,華為創(chuàng)始人任正非向5G極化碼(Polar碼)之父埃爾達(dá)爾教授舉行頒獎儀式,表彰其對于通信領(lǐng)域做出的貢獻(xiàn)邓馒。'

jieba.add_word('Polar碼')
jieba.add_word('5G極化碼')
jieba.add_word('埃爾達(dá)爾')
jieba.add_word('之父')
words = list(jieba.cut(sent))

print(words)

# 詞性標(biāo)注
pos_model_path = os.path.join(os.path.dirname(__file__), 'data/pos.model')
postagger = Postagger()
postagger.load(pos_model_path)
postags = postagger.postag(words)

# 依存句法分析
par_model_path = os.path.join(os.path.dirname(__file__), 'data/parser.model')
parser = Parser()
parser.load(par_model_path)
arcs = parser.parse(words, postags)

rely_id = [arc.head for arc in arcs]  # 提取依存父節(jié)點(diǎn)id
relation = [arc.relation for arc in arcs]  # 提取依存關(guān)系
heads = ['Root' if id == 0 else words[id-1] for id in rely_id]  # 匹配依存父節(jié)點(diǎn)詞語

for i in range(len(words)):
    print(relation[i] + '(' + words[i] + ', ' + heads[i] + ')')

輸出結(jié)果如下:

['2018', '年', '7', '月', '26', '日', '嘶朱,', '華為', '創(chuàng)始人', '任正非', '向', '5G極化碼', '(', 'Polar碼', ')', '之父', '埃爾達(dá)爾', '教授', '舉行', '頒獎儀式', ',', '表彰', '其', '對于', '通信', '領(lǐng)域', '做出', '的', '貢獻(xiàn)', '绒净。']
ATT(2018, 年)
ATT(年, 日)
ATT(7, 月)
ATT(月, 日)
ATT(26, 日)
ADV(日, 舉行)
WP(见咒,, 日)
ATT(華為, 創(chuàng)始人)
ATT(創(chuàng)始人, 任正非)
SBV(任正非, 舉行)
ADV(向, 舉行)
ATT(5G極化碼, 之父)
WP((, Polar碼)
COO(Polar碼, 5G極化碼)
WP(), Polar碼)
ATT(之父, 埃爾達(dá)爾)
ATT(埃爾達(dá)爾, 教授)
POB(教授, 向)
HED(舉行, Root)
VOB(頒獎儀式, 舉行)
WP(,, 舉行)
COO(表彰, 舉行)
ATT(其, 貢獻(xiàn))
ADV(對于, 做出)
ATT(通信, 領(lǐng)域)
POB(領(lǐng)域, 對于)
ATT(做出, 貢獻(xiàn))
RAD(的, 做出)
VOB(貢獻(xiàn), 表彰)
WP(挂疆。, 舉行)

我們得到了該句子的依存句法分析的結(jié)果改览,但是其可視化效果卻不好。
??我們使用Graphviz工具來得到上述依存句法分析的可視化結(jié)果缤言,代碼(接上述代碼)如下:

from graphviz import Digraph

g = Digraph('測試圖片')

g.node(name='Root')
for word in words:
    g.node(name=word)

for i in range(len(words)):
    if relation[i] not in ['HED']:
        g.edge(words[i], heads[i], label=relation[i])
    else:
        if heads[i] == 'Root':
            g.edge(words[i], 'Root', label=relation[i])
        else:
            g.edge(heads[i], 'Root', label=relation[i])

g.view()

得到的依存句法分析的可視化圖片如下:

依存句法分析的可視化圖片

在這張圖片中宝当,我們有了對依存句法分析結(jié)果的直觀感覺,效果也非常好胆萧,但是遺憾的是庆揩,我們并不能對上述可視化結(jié)果形成的圖(Graph)進(jìn)行圖分析,因?yàn)镚raphviz僅僅只是一個(gè)可視化工具跌穗。那么订晌,我們該用什么樣的工具來進(jìn)行圖分析呢?
??答案就是NetworkX蚌吸。以下是筆者對于NetworkX應(yīng)用于依存句法分析的可視化和圖分析的展示锈拨,其中圖分析展示了兩個(gè)節(jié)點(diǎn)之間的最短路徑。示例的Python代碼如下:

# 利用networkx繪制句法分析結(jié)果
import networkx as nx
import matplotlib.pyplot as plt
from pylab import mpl

mpl.rcParams['font.sans-serif'] = ['Arial Unicode MS']  # 指定默認(rèn)字體


G = nx.Graph()  # 建立無向圖G

# 添加節(jié)點(diǎn)
for word in words:
    G.add_node(word)

G.add_node('Root')

# 添加邊
for i in range(len(words)):
    G.add_edge(words[i], heads[i])

source = '5G極化碼'
target1 = '任正非'
distance1 = nx.shortest_path_length(G, source=source, target=target1)
print("'%s'與'%s'在依存句法分析圖中的最短距離為:  %s" % (source, target1, distance1))

target2 = '埃爾達(dá)爾'
distance2 = nx.shortest_path_length(G, source=source, target=target2)
print("'%s'與'%s'在依存句法分析圖中的最短距離為:  %s" % (source, target2, distance2))

nx.draw(G, with_labels=True)
plt.savefig("undirected_graph.png")

得到的可視化圖片如下:

NetworkX得到的圖

輸出的結(jié)果如下:

'5G極化碼'與'任正非'在依存句法分析圖中的最短距離為:  6
'5G極化碼'與'埃爾達(dá)爾'在依存句法分析圖中的最短距離為:  2

??本次到此結(jié)束羹唠,希望這篇簡短的文章能夠給讀者帶來一些啟發(fā)~

注意:不妨了解下筆者的微信公眾號: Python爬蟲與算法(微信號為:easy_web_scrape)奕枢, 歡迎大家關(guān)注~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市佩微,隨后出現(xiàn)的幾起案子缝彬,更是在濱河造成了極大的恐慌,老刑警劉巖哺眯,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谷浅,死亡現(xiàn)場離奇詭異,居然都是意外死亡奶卓,警方通過查閱死者的電腦和手機(jī)一疯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寝杖,“玉大人违施,你說我怎么就攤上這事互纯∩唬” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長只盹。 經(jīng)常有香客問我辣往,道長,這世上最難降的妖魔是什么殖卑? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任站削,我火速辦了婚禮,結(jié)果婚禮上孵稽,老公的妹妹穿的比我還像新娘许起。我一直安慰自己,他們只是感情好菩鲜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布园细。 她就那樣靜靜地躺著,像睡著了一般接校。 火紅的嫁衣襯著肌膚如雪猛频。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天蛛勉,我揣著相機(jī)與錄音鹿寻,去河邊找鬼。 笑死诽凌,一個(gè)胖子當(dāng)著我的面吹牛毡熏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播皿淋,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼招刹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了窝趣?” 一聲冷哼從身側(cè)響起疯暑,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哑舒,沒想到半個(gè)月后妇拯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洗鸵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年越锈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膘滨。...
    茶點(diǎn)故事閱讀 38,625評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡甘凭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出火邓,到底是詐尸還是另有隱情丹弱,我是刑警寧澤德撬,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站躲胳,受9級特大地震影響蜓洪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坯苹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一隆檀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧粹湃,春花似錦恐仑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至济赎,卻和暖如春鉴逞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背司训。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工构捡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人壳猜。 一個(gè)月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓勾徽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親统扳。 傳聞我的和親對象是個(gè)殘疾皇子喘帚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評論 2 348

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