pydotplus画句子的依存结构树

pydotplus画句子的依存结构树

最开始是打算用pygraphviz这个控件画的,可是安装成功后一直说的缺少什么.dll,只好作罢,中间也用过graphviz,直接用dot语言画图(参照使用dot语言画树结构),后来老师又给我推荐了pydotplus,这是python写dot语言的接口,之前pygraphviz是python写graphviz程序的接口(其实也差不多),因为graphviz也是用dot语言写的。写到这里,我只想说:python大法,文成武德,泽披苍生,千秋万载,一统江湖。

接下来,说正事。

前期介绍

我要处理所有数据文件均采用CONLL格式,UTF8编码。CONLL标注格式包含10列,分别为:

ID FORM LEMMA CPOSTAG POSTAG FEATS HEAD DEPREL PHEAD PDEPREL

本次实验只用到前8列,其含义分别为:

1 ID 当前词在句子中的序号,1开始.
2 FORM 当前词语或标点
3 LEMMA 当前词语(或标点)的原型或词干,在中文中,此列与FORM相同
4 CPOSTAG 当前词语的词性(粗粒度)
5 POSTAG 当前词语的词性(细粒度)
6 FEATS 句法特征,在本次评测中,此列未被使用,全部以下划线代替。
7 HEAD 当前词语的中心词
8 DEPREL 当前词语与中心词的依存关系

在CONLL格式中,每个词语占一行,无值列用下划线’_’代替,列的分隔符为制表符’\t’,行的分隔符为换行符’\n’;句子与句子之间用空行分隔。

具体实例如下:

1 坚决 坚决 a ad _ 2 方式
2 惩治 惩治 v v _ 0 核心成分
3 贪污 贪污 v v _ 7 限定
4 贿赂 贿赂 n n _ 3 连接依存
5 等 等 u udeng _ 3 连接依存
6 经济 经济 n n _ 7 限定
7 犯罪 犯罪 v vn _ 2 受事

pydotplus画图

跟之前一样,我主要画的是树结构,所以只关心节点和边的一些属性,这次写程序之前,看了好几个例子,里面没有介绍边属性的设置方法,只有一些介绍节点的一些属性,所以我又看了pydotplus官方文档,几乎看了整个源代码,都没有发现如何设置边属性的方法,就在我要放弃的时候,突然从网上看见一个‘label’字样,想起来之前写dot语言时,边的属性就是用这个关键词,试了一下果然可以。接下来,介绍一下主要工作

1、处理CONLL文档

这个步骤主要是将CONLL文档处理成树结构,这在python中是用嵌套字典实现的以上述句子为例,生成树结构为:

{‘坚决’: {‘惩治’: ‘方式’}, ‘惩治’: {‘root’: ‘核心成分’}, ‘贪污’: {‘犯罪’: ‘限定’}, ‘贿赂’: {‘贪污’: ‘连接依存’}, ‘等’: {‘贪污’: ‘连接依存’}, ‘经济’: {‘犯罪’: ‘限定’}, ‘犯罪’: {‘惩治’: ‘受事’}}

其中外层字典的key值是依存对中的依赖项,内层字典的key值是依存对中的核心词,内层字典的value值是依存对的依存关系。核心代码如下:

f = open("train.conll", encoding='UTF-8')
model = {}
data = f.read()
f.close()
sentence = data.split("\n\n")
ls = len(sentence)
print(ls)
print("开始提取特征:")
for x in range(ls):
    # print(x)
    word = sentence[x].split("\n")
    l = len(word)
    correct_tree = {}
    for i in range(l):
        word1 = word[i].split()
        if int(word1[6]) == 0:  # 列表中的项默认是字符串类型
            correct_tree[word1[1]] = {}
            correct_tree[word1[1]]['root'] = word1[7]
        for j in range(l):
            word2 = word[j].split()
            if word1[6] == word2[0]:
                correct_tree[word1[1]] = {}
                correct_tree[word1[1]][word2[1]] = word1[7]
    print(correct_tree)

2、画树结构

这里非常简单,就是往图里加节点和边,核心代码如下:

g = pydotplus.Dot(graph_name='test', graph_type='digraph')
g.write_svg("%(xu)d.svg" % {'xu': x + 1})

3、实验结果

画出树结构如图所示:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/haoronge9921/article/details/79770715
今日推荐