继前面写了关于句法依存关系的理论文章和应用工具NLTK+StandfordNLP之后,本文继续介绍一款方便好用的中文解析工具-百度DDParser。本文对该工具的介绍,主要包括两个部分:该工具的安装使用和结果可视化展示。
(一)安装使用
安装的步骤,其实可以遵循官网的方法。即安装python、paddlpaddle、lac等依赖组件,然后安装ddparser。其中依赖组件的版本要求为:
python: >=3.6.0, <3.8.0
paddlepaddle: >=1.8.2, <2.0
LAC: >=0.1.4
安装命令主要是官网,(比如)包括:
conda install paddlepaddle==2.3.2 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/pip3 install lac -i https://mirror.baidu.com/pypi/simple #(可能需要sudo安装)pip3 install ddparser
注:有人提到版本不匹配的问题,我没有遇到相应的情况。如果有童鞋存在相应问题,推荐学习。
接下来,我们可以在python命令中调取并使用DDParser进行中文的解析。这里的解析,可以是纯粹的原始未分割的字符串,也可以是分割后的单词列表。
from ddparser import DDParser
ddp = DDParser()
str = &#39;2020年美国制裁打压导致荣耀手机从华为剥离,此后荣耀将会以竞争对手的形 式出现在移动市场&#39;
result = ddp.parse(str)
print(result)得到如下信息:
[{&#39;word&#39;: [&#39;2020年&#39;, &#39;美国&#39;, &#39;制裁&#39;, &#39;打压&#39;, &#39;导致&#39;, &#39;荣耀&#39;, &#39;手机&#39;, &#39;从&#39;, &#39;华为&#39;, &#39;剥离&#39;, &#39;,&#39;, &#39;此后&#39;, &#39;荣耀&#39;, &#39;将会&#39;, &#39;以&#39;, &#39;竞争对手&#39;, &#39;的&#39;, &#39;形式&#39;, &#39;出现&#39;, &#39;在&#39;, &#39;移动&#39;, &#39;市场&#39;], &#39;head&#39;: [5, 3, 5, 3, 0, 7, 10, 9, 10, 5, 5, 19, 19, 19, 19, 18, 16, 15, 5, 19, 22, 20], &#39;deprel&#39;: [&#39;ADV&#39;, &#39;ATT&#39;, &#39;SBV&#39;, &#39;COO&#39;, &#39;HED&#39;, &#39;ATT&#39;, &#39;SBV&#39;, &#39;ADV&#39;, &#39;ADV&#39;, &#39;VOB&#39;, &#39;MT&#39;, &#39;ADV&#39;, &#39;SBV&#39;, &#39;ADV&#39;, &#39;ADV&#39;, &#39;ATT&#39;, &#39;MT&#39;, &#39;POB&#39;, &#39;IC&#39;, &#39;CMP&#39;, &#39;ATT&#39;, &#39;POB&#39;]}]
(二) 可视化
虽然我们获取了解析的结果,但是结果过于抽象。因此,我们还是希望能够把结果形式化展现出来。那么,这个时候,其实有多种不同的方法。我们来介绍其中的两种。
1)CoNLL-X format格式输出+外部展示:
关于如何对结果进行CoNLL-X format格式输出,网上有多种不同的思路。有的简单,有的复杂,还有的不可行。我在这里,直接对DDParser安装包的源码进行了修改,具体为:在&#39;/home/XXX/anaconda3/envs/paddlepaddle/lib/python3.7/site-packages/ddparser/run.py&#39;文件的DDParser类对象的parse()(以及parse_seg())函数return outputs之前,添加print(predicts),将CoNLL-X format格式输出。输出内容可见:
1 2020年 2020年 - - - 5 ADV - -
2 美国 美国 - - - 3 ATT - -
3 制裁 制裁 - - - 5 SBV - -
4 打压 打压 - - - 3 COO - -
5 导致 导致 - - - 0 HED - -
6 荣耀 荣耀 - - - 7 ATT - -
7 手机 手机 - - - 10 SBV - -
8 从 从 - - - 9 ADV - -
9 华为 华为 - - - 10 ADV - -
10 剥离 剥离 - - - 5 VOB - -
11 , , - - - 5 MT - -
12 此后 此后 - - - 19 ADV - -
13 荣耀 荣耀 - - - 19 SBV - -
14 将会 将会 - - - 19 ADV - -
15 以 以 - - - 19 ADV - -
16 竞争对手 竞争对手 - - - 18 ATT - -
17 的 的 - - - 16 MT - -
18 形式 形式 - - - 15 POB - -
19 出现 出现 - - - 5 IC - -
20 在 在 - - - 19 CMP - -
21 移动 移动 - - - 22 ATT - -
22 市场 市场 - - - 20 POB - -
接着,我们送入外部网站生成依存解析图。这些网站包括conllu.js和Dependency Tree Visualization等。以下为相应的依存图:
2)源码内部修改
自动化的可视化展示,其实也可以。但是需要重新配置和安装PaddleHub,这无形中增大了工作量和产生不必要的麻烦。程序员,总是想法用自动化去减少麻烦。因此,我结合PaddleHub,修改了run.py文件,将可视化代码融入到run.py中,这样就能直接用了。具体的修改方案为:
a)下载你想要的输出字体,这里我下载的是思源。并将其放入某个地址 &#39;YYY/SourceHanSansCN-Regular.otf&#39;
b)将PaddleHub中的可视化函数visualize(),添加到run.py的DDParser类中,并在cv2.imwrite()中设置图片保存地址。(记得import相应的依存库)
c) 在DDParser类的parse()以及parse_seg()中调用visualize(),将return的结果outputs送入visualize()
注意:outputs是一个字典的列表,而visualize()接受一个字典并使用字典的部分键值。因此,需要将outputs的元素依次送入visualize()。
outputs = [{&#39;word&#39;: list[str], &#39;head&#39;: list[int], &#39;deprel&#39;: list[str]}, {},...]visualize(outputs[i])
修改后的run.py代码,此处可见。
参考文献:
https://gitee.com/baidu/DDParser
百度DDParser的依存分析_Dawn_www的博客-CSDN博客_ddparser