【发布时间】:2015-09-18 14:38:37
【问题描述】:
一般来说,名词短语的头部是位于 NP 最右边的名词,如下图所示,树是父 NP 的头部。所以
根 | 小号 ___|________________________ NP | ___|_____________ | | PP副总裁 | ____|____ ____|___ NP | NP | PRT ___|_______ | | | | DT JJ NN NN IN NNP VBD RP | | | | | | | | 印度老橡树倒下Out[40]: Tree('S', [Tree('NP', [Tree('NP', [Tree('DT', ['The']), Tree('JJ', [' old']), Tree('NN', ['oak']), Tree('NN', ['tree'])]), Tree('PP', [Tree('IN', ['from' ]), Tree('NP', [Tree('NNP', ['India'])])])]), Tree('VP', [Tree('VBD', ['fell']), Tree ('PRT', [Tree('RP', ['down'])])])])
下面的代码based on a java implementation使用了一个简单的规则来寻找NP的头部,但是我需要基于rules:
parsestr='(ROOT (S (NP (NP (DT The) (JJ old) (NN oak) (NN tree)) (PP (IN from) (NP (NNP India)))) (VP (VBD fell) (PRT (RP down)))))'
def traverse(t):
try:
t.label()
except AttributeError:
return
else:
if t.label()=='NP':
print 'NP:'+str(t.leaves())
print 'NPhead:'+str(t.leaves()[-1])
for child in t:
traverse(child)
else:
for child in t:
traverse(child)
tree=Tree.fromstring(parsestr)
traverse(tree)
上面的代码给出了输出:
NP:['The', 'old', 'oak', 'tree', 'from', 'India'] NPhead:印度 NP:['The', 'old', 'oak', 'tree'] NPhead:树 NP:['印度'] NPhead:印度
虽然现在它为给定的句子提供了正确的输出,但我需要加入一个条件,即只提取最右边的名词作为 head ,目前它不检查它是否是名词 (NN)
print 'NPhead:'+str(t.leaves()[-1])
所以在上面代码中的 np head 条件中如下所示:
t.leaves().getrightmostnoun()
Michael Collins dissertation (Appendix A) 包含 Penn Treebank 的寻头规则,因此不必只有最右边的名词是 head。因此,上述条件应包含这种情况。
对于答案之一中给出的以下示例:
(NP (NP the person) that give (NP the talk)) 回家了
主语的头名词是人,但讲话的人的 NP 的最后一个离开节点是谈话。
【问题讨论】:
-
你有什么问题?
-
@barny 如何找到头部和 NP
-
请阅读帮助页面stackoverflow.com/help/mcve。在这种情况下,显示你 do 得到的输出:“不工作”对于 StackOverflow 来说是不够的。另外,请尝试在您的代码中添加更多打印语句(例如在您遍历(子)之前的一个,以及另一个在进入遍历时的语句)。发布该执行跟踪的输出——前提是它不会立即向您显示问题。
标签: python algorithm tree nltk stanford-nlp