自然语言分析工具Hanlp依存文法分析python使用总结(附带依存关系英文简写的中文解释)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
⾃然语⾔分析⼯具Hanlp依存⽂法分析python使⽤总结(附带依
存关系英⽂简写的中⽂解释)
最近在做⼀个应⽤依存⽂法分析来提取⽂本中各种关系的词语的任务。
例如:text=‘新中国在马克思的思想和恩格斯的理论阔步向前’:
我需要提取这个text中的并列的两个关系,从⽂中分析可知,“马克思的思想”和“恩格斯的理论”是两个并列关系的短语,所以想要将其提取出来;
⾸先⼤致了解⼀下依存⽂法分析的前提条件,将句⼦分词并进⾏词性标注,这⼀步⾮常关键,直接决定分析结果的好坏。
看⼀下不修改分词字典情况下直接进⾏并列关系提取的结果:
text= "新中国在马克思的思想和恩格斯的理论指导下阔步向前"
java = JClass('com.hankcs.hanlp.dependency.nnparser.NeuralNetworkDependencyParser') # 调⽤原始类接⼝进⾏句法分析
dp_result = pute(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 = pute(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。