依存句法分析器

在HanLP中一共有两种句法分析器

  • 依存句法分析
  • 基于神经网络的高性能依存句法分析器
  • MaxEnt依存句法分析

基于神经网络的高性能依存句法分析器

 

HanLP作者的原文介绍已经写得比较清楚,唯一要注意的是原文章中介绍的依存句法分析器为早期版本,输出的依存关系为英文,现在应该变为中文,而且从测试结果看,训练语料应该已经更新了,但是更新为了那个语料现在还不会是很清楚。

基于最大熵的依存句法分析器

下面是使用的例子

基于神经网络的高性能依存句法分析器

from pyhanlp import *
# 依存句法分析
sentence = HanLP.parseDependency("徐先生还具体帮助他确定了把画雄鹰、松鼠和麻雀作为主攻目标。")

print(sentence)

for word in sentence.iterator():  # 通过dir()可以查看sentence的方法
    print("%s --(%s)--> %s" % (word.LEMMA, word.DEPREL, word.HEAD.LEMMA))
print()

# 也可以直接拿到数组,任意顺序或逆序遍历
word_array = sentence.getWordArray()
for word in word_array:
    print("%s --(%s)--> %s" % (word.LEMMA, word.DEPREL, word.HEAD.LEMMA))
print()

# 还可以直接遍历子树,从某棵子树的某个节点一路遍历到虚根
CoNLLWord = JClass("com.hankcs.hanlp.corpus.dependency.CoNll.CoNLLWord")
head = word_array[12]
while head.HEAD:
    head = head.HEAD
    if (head == CoNLLWord.ROOT):
        print(head.LEMMA)
    else:
        print("%s --(%s)--> " % (head.LEMMA, head.DEPREL))

from pyhanlp import *
# 依存句法分析
sentence = HanLP.parseDependency("徐先生还具体帮助他确定了把画雄鹰、松鼠和麻雀作为主攻目标。")

print(sentence)

for word in sentence.iterator():  # 通过dir()可以查看sentence的方法
    print("%s --(%s)--> %s" % (word.LEMMA, word.DEPREL, word.HEAD.LEMMA))
print()

# 也可以直接拿到数组,任意顺序或逆序遍历
word_array = sentence.getWordArray()
for word in word_array:
    print("%s --(%s)--> %s" % (word.LEMMA, word.DEPREL, word.HEAD.LEMMA))
print()

# 还可以直接遍历子树,从某棵子树的某个节点一路遍历到虚根
CoNLLWord = JClass("com.hankcs.hanlp.corpus.dependency.CoNll.CoNLLWord")
head = word_array[12]
while head.HEAD:
    head = head.HEAD
    if (head == CoNLLWord.ROOT):
        print(head.LEMMA)
    else:
        print("%s --(%s)--> " % (head.LEMMA, head.DEPREL))
1	徐先生	徐先生	nh	nr	_	4	主谓关系	_	_
2	还	还	d	d	_	4	状中结构	_	_
3	具体	具体	a	ad	_	4	状中结构	_	_
4	帮助	帮助	v	v	_	0	核心关系	_	_
5	他	他	r	r	_	4	兼语	_	_
6	确定	确定	v	v	_	4	动宾关系	_	_
7	了	了	u	u	_	6	右附加关系	_	_
8	把	把	p	p	_	15	状中结构	_	_
9	画	画	v	v	_	8	介宾关系	_	_
10	雄鹰	雄鹰	n	n	_	9	动宾关系	_	_
11	、	、	wp	w	_	12	标点符号	_	_
12	松鼠	松鼠	n	n	_	10	并列关系	_	_
13	和	和	c	c	_	14	左附加关系	_	_
14	麻雀	麻雀	n	n	_	10	并列关系	_	_
15	作为	作为	v	v	_	6	动宾关系	_	_
16	主攻	主攻	v	vn	_	17	定中关系	_	_
17	目标	目标	n	n	_	15	动宾关系	_	_
18	。	。	wp	w	_	4	标点符号	_	_

徐先生 --(主谓关系)--> 帮助
还 --(状中结构)--> 帮助
具体 --(状中结构)--> 帮助
帮助 --(核心关系)--> ##核心##
他 --(兼语)--> 帮助
确定 --(动宾关系)--> 帮助
了 --(右附加关系)--> 确定
把 --(状中结构)--> 作为
画 --(介宾关系)--> 把
雄鹰 --(动宾关系)--> 画
、 --(标点符号)--> 松鼠
松鼠 --(并列关系)--> 雄鹰
和 --(左附加关系)--> 麻雀
麻雀 --(并列关系)--> 雄鹰
作为 --(动宾关系)--> 确定
主攻 --(定中关系)--> 目标
目标 --(动宾关系)--> 作为
。 --(标点符号)--> 帮助

徐先生 --(主谓关系)--> 帮助
还 --(状中结构)--> 帮助
具体 --(状中结构)--> 帮助
帮助 --(核心关系)--> ##核心##
他 --(兼语)--> 帮助
确定 --(动宾关系)--> 帮助
了 --(右附加关系)--> 确定
把 --(状中结构)--> 作为
画 --(介宾关系)--> 把
雄鹰 --(动宾关系)--> 画
、 --(标点符号)--> 松鼠
松鼠 --(并列关系)--> 雄鹰
和 --(左附加关系)--> 麻雀
麻雀 --(并列关系)--> 雄鹰
作为 --(动宾关系)--> 确定
主攻 --(定中关系)--> 目标
目标 --(动宾关系)--> 作为
。 --(标点符号)--> 帮助

麻雀 --(并列关系)--> 
雄鹰 --(动宾关系)--> 
画 --(介宾关系)--> 
把 --(状中结构)--> 
作为 --(动宾关系)--> 
确定 --(动宾关系)--> 
帮助 --(核心关系)--> 
##核心##

最大熵依存句法分析器

MaxEntDependencyParser = JClass("com.hankcs.hanlp.dependency.MaxEntDependencyParser")

print("hankcs每天都在写程序")
print(MaxEntDependencyParser.compute("hankcs每天都在写程序"))
print("吴彦祖每天都在写程序")
print(MaxEntDependencyParser.compute("吴彦祖每天都在写程序"))

MaxEntDependencyParser = JClass("com.hankcs.hanlp.dependency.MaxEntDependencyParser")

print("hankcs每天都在写程序")
print(MaxEntDependencyParser.compute("hankcs每天都在写程序"))
print("吴彦祖每天都在写程序")
print(MaxEntDependencyParser.compute("吴彦祖每天都在写程序"))
hankcs每天都在写程序
1	hankcs	hankcs	x	x	_	6	限定	_	_
2	每天	每天	r	r	_	5	施事	_	_
3	都	都	d	d	_	5	程度	_	_
4	在	在	d	d	_	5	程度	_	_
5	写	写	v	v	_	0	核心成分	_	_
6	程序	程序	n	n	_	5	内容	_	_

吴彦祖每天都在写程序
1	吴彦祖	吴彦祖	n	nr	_	5	施事	_	_
2	每天	每天	r	r	_	5	施事	_	_
3	都	都	d	d	_	5	程度	_	_
4	在	在	d	d	_	5	程度	_	_
5	写	写	v	v	_	0	核心成分	_	_
6	程序	程序	n	n	_	5	内容	_	_