# 安装
✳ 安装前没注意,安装了paddlepaddle最新版2.0.1,结果引发了一些错误,好在不是严重的问题,修改后依旧可以使用
1. 安装百度深度学习框架paddlepaddle飞桨(版本2.0.1
python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
2. 安装DDParser(版本0.1.2
pip install ddparser
3. 报错 [链接]
RuntimeError: paddle-ernie requires paddle 1.7+, got 2.0.1
4. 打开C:\Anaconda3\lib\site-packages\ddparser\ernie\__init__.py ,修改如下
&#39;&#39;&#39;原来&#39;&#39;&#39; # paddle_version &#61; [int(i) for i in paddle.__version__.split(&#39;.&#39;)] # if paddle_version[1] <7:&#39;&#39;&#39;修改后&#39;&#39;&#39; paddle_version &#61; [i for i in paddle.__version__.split(&#39;.&#39;)] if 10 * int(paddle_version[0]) &#43;int(paddle_version[1]) <17:
5. 初次运行会下载模型&#xff0c;放置在C:\Anaconda3\Lib\site-packages\ddparser\model_files
6. 运行 ddp.parse("百度是一家高科技公司") 报错
AttributeError: module &#39;paddle.fluid.layers&#39; has no attribute &#39;index_select&#39;
7. 报错原因&#xff1a;从1.x版本升级为2.0版本&#xff0c;API有变动 [飞桨框架API映射表]
打开C:\Anaconda3\lib\site-packages\ddparser\parser\nets\bilstm.py &#xff0c;修改成变动后的API&#xff08;注&#xff1a;dim参数名改为axis
8. 同样的问题还包括
C:\Anaconda3\lib\site-packages\ddparser\parser\nets\nn.py
AttributeError: module &#39;paddle.fluid.layers&#39; has no attribute &#39;arange&#39;
# 说明
分词器&#xff1a;百度词法分析工具 LAC&#xff08;实现中文分词、词性标注、专名识别等功能&#xff09;&#xff0c;支持使用其他工具的分词结果进行依存分析
附录1 pos&#xff1a;词性和专名类别标签集合
附录2 dep&#xff1a;依存句法分析标注关系集合&#xff08;DuCTB1.0是百度构建的中文依存句法树库
# 操作
from ddparser import DDParserddp &#61; DDParser()results &#61; ddp.parse("清华大学研究核能的教授有哪些")>>> [{&#39;word&#39;: [&#39;清华大学&#39;, &#39;研究&#39;, &#39;核能&#39;, &#39;的&#39;, &#39;教授&#39;, &#39;有&#39;, &#39;哪些&#39;], &#39;head&#39;: [5, 5, 2, 2, 6, 0, 6], &#39;deprel&#39;: [&#39;ATT&#39;, &#39;ATT&#39;, &#39;VOB&#39;, &#39;MT&#39;, &#39;SBV&#39;, &#39;HED&#39;, &#39;VOB&#39;]}]
为了将结果可视化&#xff0c;这里用DataFrame输出&#xff0c;数据格式按照 CoNLL-X format&#xff08;注&#xff1a;CoNLL-U是CoNLL-X的扩展版
CoNLL-U 格式 ① CoNLL 格式是一种偏向于“机读"的形式。在CONLL格式中&#xff0c;每个词语占一行&#xff0c;无值列用下划线&#39;_&#39;代替&#xff0c;列的分隔符为制表符&#39;\t&#39;&#xff0c;行的分隔符为换行符&#39;\n&#39;&#xff1b;句子与句子之间用空行分隔。
② GitHub Issue&#xff1a;ddp.parse的结果可以直接输出CoNLL-X格式吗
③ 另外可以试一下paddlehub &#xff0c;里面对ddparser做了封装&#xff0c;提供可视化表示。
col &#61; (&#39;FROM&#39;,&#39;LEMMA&#39;,&#39;CPOSTAG&#39;,&#39;POSTAG&#39;,&#39;FEATS&#39;,&#39;HEAD&#39;,&#39;DEPREL&#39;,&#39;PROB&#39;,&#39;PDEPREL&#39;) row &#61; []for res in results:for i in range(len(res[&#39;word&#39;])):data &#61; {"FROM":res[&#39;word&#39;][i], "LEMMA":res[&#39;word&#39;][i], "HEAD":res[&#39;head&#39;][i], "DEPREL":res[&#39;deprel&#39;][i]}row.append(data)df &#61; pd.DataFrame(row,columns&#61;col) df.fillna(&#39;_&#39;,inplace &#61; True) # 缺省值 df.index &#61; df.index &#43; 1 # 把索引号加1视为ID print(df)
Windows可以用DependencyViewer加载CoNLL格式的txt文件&#xff0c;其他可以用web端的conllu.js
&#x1f4cd; UD提供的可视化工具&#xff1a;Visualisation
&#x1f4cd; HanLP进一步封装&#xff1a;Dependency Tree Visualization
# 扩展
在DDParser()中指定参数prob和use_pos&#xff0c;使用prob可以指定输出概率&#xff0c;使用use_pos可以输出词性标签
from ddparser import DDParser ddp &#61; DDParser(prob&#61;True, use_pos&#61;True) ddp.parse(["百度是一家高科技公司"]) >>> [{&#39;word&#39;: [&#39;百度&#39;, &#39;是&#39;, &#39;一家&#39;, &#39;高科技&#39;, &#39;公司&#39;], &#39;postag&#39;: [&#39;ORG&#39;, &#39;v&#39;, &#39;m&#39;, &#39;n&#39;, &#39;n&#39;], &#39;head&#39;: [2, 0, 5, 5, 2], &#39;deprel&#39;: [&#39;SBV&#39;, &#39;HED&#39;, &#39;ATT&#39;, &#39;ATT&#39;, &#39;VOB&#39;], &#39;prob&#39;: [1.0, 1.0, 1.0, 1.0, 1.0]}]
在class DDParser中指定参数buckets&#61;True可以在数据集长度不均时处理速度更快
from ddparser import DDParser ddp &#61; DDParser(buckets&#61;True)
在已分词情况下&#xff08;比如希望使用其他工具的分词结果&#xff09;&#xff0c;通过调用parse_seg()方法&#xff0c;可以进行依存句法树分析
ddp &#61; DDParser() ddp.parse_seg([[&#39;百&#39;, &#39;度&#39;, &#39;是&#39;, &#39;一家&#39;, &#39;高科技&#39;, &#39;公司&#39;], [&#39;他&#39;, &#39;送&#39;, &#39; 了&#39;, &#39;一本&#39;, &#39;书&#39;]]) >>> [{&#39;word&#39;: [&#39;百&#39;, &#39;度&#39;, &#39;是&#39;, &#39;一家&#39;, &#39;高科技&#39;, &#39;公司&#39;], &#39;head&#39;: [2, 3, 0, 6, 6, 3], &#39;deprel&#39;: [&#39;ATT&#39;, &#39;SBV&#39;, &#39;HED&#39;, &#39;ATT&#39;, &#39;ATT&#39;, &#39;VOB&#39;]}, {&#39;word&#39;: [&#39;他&#39;, &#39;送&#39;, &#39;了&#39;, &#39;一本&#39;, &#39;书&#39;], &#39;head&#39;: [2, 0, 2, 5, 2], &#39;deprel&#39;: [&#39;SBV&#39;, &#39;HED&#39;, &#39;MT&#39;, &#39;ATT&#39;, &#39;VOB&#39;]}]
更多请查看 GitHub BaiDu DDParser
# 工具学习系列
哈工大LTP的依存分析 百度DDParser的依存分析 HanLP的依存分析 Spacy的依存分析
词性标注集pos/tag 依存句法分析标注集dep 语义依存分析标注集sdp LTP 863词性标注集 BH-DEP BH-SDP SpaCy 基于Google Universal POS Tag set扩展 采用了 ClearNLP 的依存分析标签 - DDParser 百度构建的标注集 DuCTB - HanLP CTB、PKU、863、UD SD、UD SemEval16、DM、PAS、PSD stanford corenlp Penn Chinese Treebank Tag Set&#xff08;CTB&#xff09; 没找到说明采用的标注集 [链接] - jieba 和 ictclas 兼容的标记法 不支持 不支持
# 参考
2020.11-依存句法树baidu-DDParser工具使用
# 其他
1&#xff09;pandas似乎要在ddparser前导入&#xff0c;否则会报错
import pandas as pd from ddparser import DDParser
BUG0&#xff1a; AttributeError: type object ‘Callable‘ has no attribute ‘_abc_registry‘ [解决方案]
BUG1&#xff1a; ‘WindowsPath‘ object has no attribute ‘read_text‘ [解决方案]
2&#xff09;百度LAC分词
from LAC import LAC lac &#61; LAC(mode&#61;&#39;seg&#39;) # mode选项&#xff1a;lac(默认)与seg&#xff0c;lac包含词性 seg_result &#61; lac.run(text)