百度DDParser的依存分析

2023-12-27 03:48
文章标签 分析 百度 依存 ddparser

本文主要是介绍百度DDParser的依存分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

# 安装

  安装前没注意,安装了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,修改如下

'''原来'''
# paddle_version = [int(i) for i in paddle.__version__.split('.')]
# if paddle_version[1] < 7:'''修改后'''
paddle_version = [i for i in paddle.__version__.split('.')]
if 10 * int(paddle_version[0]) +int(paddle_version[1]) < 17:

  5. 初次运行会下载模型,放置在C:\Anaconda3\Lib\site-packages\ddparser\model_files

  6. 运行 ddp.parse("百度是一家高科技公司") 报错

AttributeError: module 'paddle.fluid.layers' has no attribute 'index_select'

7. 报错原因:从1.x版本升级为2.0版本,API有变动 [飞桨框架API映射表]

    打开C:\Anaconda3\lib\site-packages\ddparser\parser\nets\bilstm.py,修改成变动后的API(注:dim参数名改为axis

8. 同样的问题还包括

C:\Anaconda3\lib\site-packages\ddparser\parser\nets\nn.py

AttributeError: module 'paddle.fluid.layers' has no attribute 'arange'

# 说明

  分词器:百度词法分析工具 LAC(实现中文分词、词性标注、专名识别等功能),支持使用其他工具的分词结果进行依存分析

  附录1 pos:词性和专名类别标签集合

  附录2 dep:依存句法分析标注关系集合(DuCTB1.0是百度构建的中文依存句法树库

# 操作

from ddparser import DDParserddp = DDParser()results = ddp.parse("清华大学研究核能的教授有哪些")>>> [{'word': ['清华大学', '研究', '核能', '的', '教授', '有', '哪些'],   'head': [5, 5, 2, 2, 6, 0, 6],  'deprel': ['ATT', 'ATT', 'VOB', 'MT', 'SBV', 'HED', 'VOB']}]

    为了将结果可视化,这里用DataFrame输出,数据格式按照 CoNLL-X format(注:CoNLL-U是CoNLL-X的扩展版

CoNLL-U 格式

① CoNLL 格式是一种偏向于“机读"的形式。在CONLL格式中,每个词语占一行,无值列用下划线'_'代替,列的分隔符为制表符'\t',行的分隔符为换行符'\n';句子与句子之间用空行分隔。

② GitHub Issue:ddp.parse的结果可以直接输出CoNLL-X格式吗 

③ 另外可以试一下paddlehub ,里面对ddparser做了封装,提供可视化表示。

col = ('FROM','LEMMA','CPOSTAG','POSTAG','FEATS','HEAD','DEPREL','PROB','PDEPREL')
row = []for res in results:for i in range(len(res['word'])):data = {"FROM":res['word'][i], "LEMMA":res['word'][i], "HEAD":res['head'][i], "DEPREL":res['deprel'][i]}row.append(data)df = pd.DataFrame(row,columns=col)
df.fillna('_',inplace = True) # 缺省值
df.index = df.index + 1  # 把索引号加1视为ID
print(df)

    Windows可以用DependencyViewer加载CoNLL格式的txt文件,其他可以用web端的conllu.js

    📍 UD提供的可视化工具:Visualisation 

    📍 HanLP进一步封装:Dependency Tree Visualization

# 扩展

    在DDParser()中指定参数prob和use_pos,使用prob可以指定输出概率,使用use_pos可以输出词性标签

from ddparser import DDParser
ddp = DDParser(prob=True, use_pos=True)
ddp.parse(["百度是一家高科技公司"])
>>> [{'word': ['百度', '是', '一家', '高科技', '公司'], 'postag': ['ORG', 'v', 'm', 'n', 'n'], 'head': [2, 0, 5, 5, 2], 'deprel': ['SBV', 'HED', 'ATT', 'ATT', 'VOB'], 'prob': [1.0, 1.0, 1.0, 1.0, 1.0]}]

     在class DDParser中指定参数buckets=True可以在数据集长度不均时处理速度更快

from ddparser import DDParser
ddp = DDParser(buckets=True)

    在已分词情况下(比如希望使用其他工具的分词结果),通过调用parse_seg()方法,可以进行依存句法树分析

ddp = DDParser()
ddp.parse_seg([['百', '度', '是', '一家', '高科技', '公司'], ['他', '送', ' 了', '一本', '书']])
>>> [{'word': ['百', '度', '是', '一家', '高科技', '公司'], 'head': [2, 3, 0, 6, 6, 3], 'deprel': ['ATT', 'SBV', 'HED', 'ATT', 'ATT', 'VOB']}, {'word': ['他', '送', '了', '一本', '书'], 'head': [2, 0, 2, 5, 2], 'deprel': ['SBV', 'HED', 'MT', 'ATT', 'VOB']}]

    更多请查看 GitHub BaiDu DDParser

# 工具学习系列

  • 哈工大LTP的依存分析
  • 百度DDParser的依存分析
  • HanLP的依存分析
  • Spacy的依存分析

词性标注集pos/tag依存句法分析标注集dep语义依存分析标注集sdp
LTP863词性标注集BH-DEPBH-SDP
SpaCy基于Google Universal POS Tag set扩展采用了 ClearNLP 的依存分析标签-
DDParser百度构建的标注集DuCTB-
HanLPCTB、PKU、863、UDSD、UDSemEval16、DM、PAS、PSD
stanford corenlpPenn Chinese Treebank Tag Set(CTB)没找到说明采用的标注集 [链接]-
jieba和 ictclas 兼容的标记法不支持不支持

# 参考

    2020.11-依存句法树baidu-DDParser工具使用

# 其他

1)pandas似乎要在ddparser前导入,否则会报错

import pandas as pd
from ddparser import DDParser

BUG0:AttributeError: type object ‘Callable‘ has no attribute ‘_abc_registry‘  [解决方案]

BUG1:‘WindowsPath‘ object has no attribute ‘read_text‘ [解决方案]

2)百度LAC分词

from LAC import LAC
lac = LAC(mode='seg') # mode选项:lac(默认)与seg,lac包含词性 seg_result = lac.run(text)

这篇关于百度DDParser的依存分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/541804

相关文章

基于Go语言实现Base62编码的三种方式以及对比分析

《基于Go语言实现Base62编码的三种方式以及对比分析》Base62编码是一种在字符编码中使用62个字符的编码方式,在计算机科学中,,Go语言是一种静态类型、编译型语言,它由Google开发并开源,... 目录一、标准库现状与解决方案1. 标准库对比表2. 解决方案完整实现代码(含边界处理)二、关键实现细

PostgreSQL 序列(Sequence) 与 Oracle 序列对比差异分析

《PostgreSQL序列(Sequence)与Oracle序列对比差异分析》PostgreSQL和Oracle都提供了序列(Sequence)功能,但在实现细节和使用方式上存在一些重要差异,... 目录PostgreSQL 序列(Sequence) 与 oracle 序列对比一 基本语法对比1.1 创建序

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java