最近在做一个应用依存文法分析来提取文本中各种关系的词语的任务。例如:text=‘新中国在马克思的思想和恩格斯的理论阔步向前’:

我需要提取这个text中的并列的两个关系,从文中分析可知,“马克思的思想”和“恩格斯的理论”是两个并列关系的短语,所以想要将其提取出来;

首先大致了解一下依存文法分析的前提条件,将句子分词并进行词性标注,这一步非常关键,直接决定分析结果的好坏。

看一下不修改分词字典情况下直接进行并列关系提取的结果:

text= "新中国在马克思的思想和恩格斯的理论指导下阔步向前"
java = JClass('com.hankcs.hanlp.dependency.nnparser.NeuralNetworkDependencyParser') # 调用原始类接口进行句法分析
dp_result = java.compute(seg_result1)
print('java提取结果:'+'\n',dp_result)
word_array = dp_result.getWordArray()
final= []
for word in word_array:
result = [word.LEMMA, word.DEPREL, word.HEAD.LEMMA]
print("%s --(%s)--> %s" % (word.LEMMA, word.DEPREL, word.HEAD.LEMMA))           # 输出依存关系
if result[1]=='COO':                                         # 提取并列关系COO
final.append(word.LEMMA)
final.append(word.HEAD.LEMMA) final_set = set(final)
print(final_set)
结果:{'思想','理论'}

虽然提取出来的结果也算合理,但是还是不够准确,我希望的结果是{'马克思的思想','恩格斯的理论'}

接下来我将需要目标词动态添加到分词字典中,然后再来进行依存文法分析

text= "新中国在马克思的思想和恩格斯的理论指导下阔步向前"
segment =HanLP.newSegment('viterbi')
CustomDictionary.insert('马克思的思想', 'n 1024') # insert会覆盖字典中已经存在的词,add会跳过已经存在的词
CustomDictionary.insert('恩格斯的理论', 'n 1024')
segment.enableCustomDictionaryForcing(True)              # 强制执行
seg_result1 = segment.seg(text)              # 分词结果
print('分词结果:',seg_result1) java = JClass('com.hankcs.hanlp.dependency.nnparser.NeuralNetworkDependencyParser') # 调用原始类接口进行句法分析
dp_result = java.compute(seg_result1)
print('java提取结果:'+'\n',dp_result)
word_array = dp_result.getWordArray()
final= []
for word in word_array:
result = [word.LEMMA, word.DEPREL, word.HEAD.LEMMA]
print("%s --(%s)--> %s" % (word.LEMMA, word.DEPREL, word.HEAD.LEMMA)) # 输出依存关系
if result[1]=='COO':
final.append(word.LEMMA)
final.append(word.HEAD.LEMMA) final_set = set(final)
print(final_set)
结果:{'马克思的思想','恩格斯的理论'}

以上实现了正确的并列关系提取。

为什么我要用上面这种提取方法,这里我们在进一步看看依存分析的java的源码:

    /**
* 分析句子的依存句法
*
* @param termList 句子,可以是任何具有词性标注功能的分词器的分词结果
* @return CoNLL格式的依存句法树
*/
public static CoNLLSentence compute(List<Term> termList)
{
return new NeuralNetworkDependencyParser().parse(termList);
} /**
* 分析句子的依存句法
*
* @param sentence 句子
* @return CoNLL格式的依存句法树
*/
public static CoNLLSentence compute(String sentence)
{
return new NeuralNetworkDependencyParser().parse(sentence);
}
}

从上述源码可以看到类NeuralNetworkDependencyParser的comoute方法下有两种输入模式,一种是支持直接输入text来进行分析,一种是支持词性标注结果list来进行分析。

这里如果想要用自己定义的词来进行分词并按照分词结果分析,则需要在compute方法中输入词性标注的list来进行依存文法分析。

需要注意的地方,在hannlp官方作者给出的python调用代码中是如下方法:

sentence = HanLP.parseDependency(text)

但是这个方法只能够输入的text,而不是一个词性标注结果list,这样就会导致最后生成的依存文法提取结果并不是动态添加到分词字典中的词。(尽管作者说动态添加到分词字典中的词是默认到所有分词器中的。)

另外需要说明的是sentence = HanLP.parseDependency(text)这个方法提取的并列关系都是用中文来表示,而上文中用词性标注结果成功提取的并列关系都是英文大写缩写标注的,

这里最后附上大写缩写的中文解释:

定中关系ATT
数量关系QUN(quantity)
并列关系COO(coordinate)
同位关系APP(appositive)
附加关系ADJ(adjunct)
动宾关系VOB(verb-object)
介宾关系POB(preposition-object)
主谓关系SBV(subject-verb)
比拟关系SIM(similarity)
时间关系TMP(temporal)
处所关系LOC(locative)
“的”字结构DE
“地”字结构DI
“得”字结构DEI
“所”字结构SUO
“把”字结构BA
“被”字结构BEI
状中结构ADV(adverbial)
动补结构CMP(complement)
兼语结构DBL(double)
关联词CNJ(conjunction)
关联结构 CS(conjunctive structure)
语态结构MT(mood-tense)
连谓结构VV(verb-verb)
核心HED(head)
前置宾语FOB(fronting object)
双宾语DOB(double object)
主题TOP(topic)
独立结构IS(independent structure)
独立分句IC(independent clause)
依存分句DC(dependent clause)
叠词关系VNV (verb-no-verb or verb-one-verb)
一个词YGC
标点 WP

自然语言分析工具Hanlp依存文法分析python使用总结(附带依存关系英文简写的中文解释)的更多相关文章

  1. Python中调用自然语言处理工具HanLP手记

    手记实用系列文章: 1 结巴分词和自然语言处理HanLP处理手记 2 Python中文语料批量预处理手记 3 自然语言处理手记 4 Python中调用自然语言处理工具HanLP手记 5 Python中 ...

  2. 中文自然语言处理工具HanLP源码包的下载使用记录

    中文自然语言处理工具HanLP源码包的下载使用记录 这篇文章主要分享的是hanlp自然语言处理源码的下载,数据集的下载,以及将让源代码中的demo能够跑通.Hanlp安装包的下载以及安装其实之前就已经 ...

  3. 自然语言处理工具HanLP被收录中国大数据产业发展的创新技术新书《数据之翼》

    在12月20日由中国电子信息产业发展研究院主办的2018中国软件大会上,大快搜索获评“2018中国大数据基础软件领域领军企业”,并成功入选中国数字化转型TOP100服务商. 图:大快搜索获评“2018 ...

  4. 自然语言处理工具hanlp关键词提取图解TextRank算法

    看一个博主(亚当-adam)的关于hanlp关键词提取算法TextRank的文章,还是非常好的一篇实操经验分享,分享一下给各位需要的朋友一起学习一下! TextRank是在Google的PageRan ...

  5. 自然语言处理工具hanlp 1.7.3版本更新内容一览

    HanLP 1.7.3 发布了.HanLP 是由一系列模型与算法组成的 Java 工具包,目标是普及自然语言处理在生产环境中的应用.HanLP 具备功能完善.性能高效.架构清晰.语料时新.可自定义的特 ...

  6. 中文自然语言处理工具hanlp隐马角色标注详解

    本文旨在介绍如何利用HanLP训练分词模型,包括语料格式.语料预处理.训练接口.输出格式等. 目前HanLP内置的训练接口是针对一阶HMM-NGram设计的,另外附带了通用的语料加载工具,可以通过少量 ...

  7. 自然语言处理工具hanlp自定义词汇添加图解

    过程分析 1.添加新词需要确定无缓存文件,否则无法使用成功,因为词典会优先加载缓存文件 2.再确认缓存文件不在时,打开本地词典按照格式添加自定义词汇. 3.调用分词函数重新生成缓存文件,这时会报一个找 ...

  8. 自然语言处理工具hanlp定制用户词条

    作者:baiziyu 关于hanlp的文章已经分享过很多,似乎好像大部分以理论性的居多.最近有在整理一些hanlp应用项目中的文章,待整理完成后会陆续分享出来.本篇分享的依然是由baiziyu 分享的 ...

  9. Python自然语言处理工具小结

    Python自然语言处理工具小结 作者:白宁超 2016年11月21日21:45:26 目录 [Python NLP]干货!详述Python NLTK下如何使用stanford NLP工具包(1) [ ...

随机推荐

  1. 完成在本机远程连接HBase进行数据增删改查

    1.进行hbase与本机远程连接测试连接 1.1 修改虚拟机文件hbase-site.xml(cd/usr/local/hbase/conf)文件,把localhost换成你的虚拟机主机名字 1.2修 ...

  2. 转发和重定向简介及与之相关的(URL)参数(parameter)、属性(attribute)问题探讨

    1.引子 转发和重定向是我们在做web项目中常用到的两个术语,有必要理清两者的区别和与之相关的参数.属性获取问题. 2.转发和重定向 1).转发 转发是服务器行为,将当前请求(Request)和响应( ...

  3. vector内部实现2

    push_back 往动态数组的内部进行添加数据 pop_back 往动态数组的尾部进行删除数据 resize  讲元素的数量len改成num个数量  如果size()变大了,多出来的将用默认构造来创 ...

  4. Cannot read property 'XXXX' of null/undifined

    这个问题可能的原因有很多 1.如果你的js直接写在自执行函数或者head标签内的script里面,那么可以检查一下你的代码有没有用到页面里的节点,因为这样写的代码在页面加载完成之前就会开始执行,如果有 ...

  5. 简单的tab栏切换

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. C语言实现整数转字符串

    #include <stdio.h> void intToString(int N,char arr[]){ //仅支持有符号4字节的int类型,范围-2147483648 - 21474 ...

  7. 14 微服务电商【黑马乐优商城】:day02-springcloud(理论篇四:配置Robbin负载均衡)

    本项目的笔记和资料的Download,请点击这一句话自行获取. day01-springboot(理论篇) :day01-springboot(实践篇) day02-springcloud(理论篇一) ...

  8. mybatis学习笔记四

    记录下动态sql的常用标签: 1.where 一般用作数据操作添加的条件 例子: <select id="selectByRoleId" resultMap="re ...

  9. RPC,基于消息,远程访问方式比较

    远程访问 1.RPC方式 客户端调用远程方法和客户端调用本地方法形式是一样的,当然了底层需要封装通讯协议及数据转换的过程,这个一般由框架完成,可以简化开发, 这种方式本质也是通过通讯协议发消息给对方的 ...

  10. 一条sql关联删除多张表数据

    现有6张表存在关联关系,要删除主表则其他5张表关联数据也要一块删掉(单条sql多id批量删除) delete t1,t2,t3,t4,t5,t6 FROM rmd_v AS t1 LEFT JOIN ...