LTP4+句法依存可视化

该博客介绍了如何使用LTP库进行依存句法分析,并结合NetworkX进行可视化展示。首先,通过jieba进行分词,然后使用LTP进行词性标注和依存句法分析。接着,利用NetworkX创建无向图并绘制句法分析结果。文章还展示了如何处理可能出现的错误,如networkx的迭代问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

修改自博客

NLP(十二)依存句法分析的可视化及图分析_山阴少年-优快云博客  依存句法分析的效果虽然没有像分词、NER的效果来的好,但也有其使用价值,在日常的工作中,我们免不了要和其打交道。笔者这几天一直在想如何分析依存句法分析的结果,一个重要的方面便是其可视化和它的图分析。  我们使用的NLP工具为jieba和LTP,其中jieba用于分词,LTP用于词性标注和句法分析,需要事件下载pos.model和parser.model文件。  本文使用的示例句子为:2...https://blog.youkuaiyun.com/jclian91/article/details/97695387ltp和networkx都有一些调整

from ltp import LTP
ltp = LTP()
# seg, hidden = ltp.seg(['熊高雄你吃饭了吗'])
# pos = ltp.pos(hidden)
# ner = ltp.ner(hidden)
# srl = ltp.srl(hidden)
# dep = ltp.dep(hidden)
# sdp = ltp.sdp(hidden)
#
# print(seg[0])
# print(pos)
# print(sdp)
# print(dep)


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

import os
import jieba

# sent = '2018年7月26日,华为创始人任正非向5G极化码(Polar码)之父埃尔达尔教授举行颁奖仪式,表彰其对于通信领域做出的贡献。'
sent='三商美邦总经理杨棋材,请辞获准。'

jieba.add_word('Polar码')
jieba.add_word('5G极化码')
jieba.add_word('埃尔达尔')
jieba.add_word('之父')
words = list(jieba.cut(sent))

print(words)

seg, hidden = ltp.seg([sent])
print(seg[0])
# print(hidden)
# 词性标注
# pos_model_path = os.path.join(os.path.dirname(__file__), 'data/pos.model')
# postagger = Postagger()
# postagger.load(pos_model_path)
# postags = postagger.postag(words)

postags = ltp.pos(hidden)
ner = ltp.ner(hidden)
dep = ltp.dep(hidden)
rely_id = []
relation = []
for i in range(len(seg[0])):
    # print(type(seg[0]),type(postags[0]))
    print(seg[0][i], dep[0][i])
    rely_id.append(dep[0][i][1])
    relation.append(dep[0][i][2])
heads = ['Root' if id == 0 else seg[0][id - 1] for id in rely_id]
print(heads)



# 依存句法分析,ltp4改用 ltp.dep(hidden)
# 生成的数据是元组形式,使用列表读取
# arcs = parser.parse(words, postags)
# rely_id = [arc.head for arc in arcs]  # 提取依存父节点id
# relation = [arc.relation for arc in arcs]  # 提取依存关系
# heads = ['Root' if id == 0 else words[id-1] for id in rely_id]  # 匹配依存父节点词语
#
# for i in range(len(words)):
#     print(relation[i] + '(' + words[i] + ', ' + heads[i] + ')')
for i in range(len(seg[0])):
    print(relation[i] + '(' + seg[0][i] + ', ' + heads[i] + ')')

这里使用LTP4替换了之前的pyltp,输出依存信息

# 利用networkx绘制句法分析结果
import networkx as nx
import matplotlib.pyplot as plt
from pylab import mpl

mpl.rcParams['font.sans-serif'] = ['Arial Unicode MS']  # 指定默认字体
G = nx.Graph()  # 建立无向图G

# 添加节点
for word in seg[0]:
    G.add_node(word,desc=word)
G.add_node('Root')

# 添加边
for i in range(len(seg[0])):
    G.add_edge(seg[0][i], heads[i])

pos = nx.spring_layout(G)
nx.draw(G, pos)
node_labels = nx.get_node_attributes(G, 'desc')
nx.draw_networkx_labels(G, pos, labels=node_labels,font_size=15,  font_family ='YouYuan')

plt.savefig("undirected_graph.png")

这里输出可视化,使用networkx可能会出现hook无法iterable的报错,需要将matplotlab降级到2.1.1。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值