我试图在递归语句中使用生成器,但我没有得到我期望的结果。
一点背景:我正在使用语法分析树,概念目标是向下递归树,直到我识别出正确的名词(由'NNP'标记表示),然后我尝试使用生成器来识别每个名词短语(由'NP'表示)专有名词在其中。
alist = ['ROOT', ['S', ['NP', ['PRP', 'We']], ['VP', ['VBP', 'have'], ['VP', ['VBN', 'received'], ['NP', ['NN', 'information']],
['PP', ['IN', 'from'], ['NP', ['NP', ['DT', 'a'], ['NN', 'source']], ['VP', ['VBN', 'entitled'], ['PP', ['TO', 'to'],
['NP', ['NN', 'belief']]], [',', ','], ['SBAR', ['IN', 'that'], ['S', ['NP', ['NNP', 'Lincoln']], ['VP', ['VP', ['VBZ', 'has'],
['VP', ['VBN', 'paid'], ['NP', ['DT', 'a'], ['JJ', 'hurried'], ['NN', 'visit']], ['PP', ['TO', 'to'],
['NP', ['NP', ['DT', 'the'], ['NNP', 'Army']], ['PP', ['IN', 'of'], ['NP', ['DT', 'the'], ['NNP', 'Potomac']]]]],
[',', ','], ['PRN', ['-LRB-', '-LRB-'], ['ADVP', ['RB', 'now']], ['ADJP', ['JJ', 'burrowing'], ['PP', ['IN', 'on'],
['NP', ['NP', ['DT', 'the'], ['NN', 'north'], ['NN', 'bank']], ['PP', ['IN', 'of'], ['NP', ['DT', 'the'], ['NNP', 'James']]],
[',', ',']]]], ['-RRB-', '-RRB-']]]], ['CC', 'and'], ['VP', ['VBD', 'satisfied'], ['NP', ['PRP', 'himself']],
[',', ','], ['PP', ['IN', 'by'], ['NP', ['JJ', 'personal'], ['NN', 'observation']]], [',', ','],
['PP', ['IN', 'in'], ['NP', ['NN', 'regard']]], ['PP', ['TO', 'to'], ['NP', ['NP', ['DT', 'the'], ['JJ', 'true'], ['NN', 'situation']],
['PP', ['IN', 'of'], ['NP', ['NNS', 'affairs']]]]]]]]]]]]]], ['.', '.']]]
def PullNP(NNP, NPLists):
if NNP in NPLists:
print "Pulling relevant NP"
print NNP
yield NNP
for thing in NPLists:
if NNP in thing:
PullNP(thing, NPLists)
else:
for s in thing:
if str(type(s)) == "<type 'list'>" and NNP in s: PullNP(s, NPLists)
def RecurseNNP(alist, pastlists=None, count=None):
if pastlists is None: pastlists = []
if count is None: count = 0
if 'NNP' in alist[0]:
NNPs = PullNP(alist, pastlists)
print NNPs
for np in NNPs:
print np
else:
if str(type(alist)) == "<type 'list'>":
if alist[0] == 'NP':
pastlists.append(alist)
for x in alist[1:]:
RecurseNNP(x, pastlists, count)
RecurseNNP(alist)
如果我运行此代码,我会得到此输出:
<generator object PullNP at 0x0288B648>
<generator object PullNP at 0x02885558>
<generator object PullNP at 0x02885558>
<generator object PullNP at 0x02885558>
迭代生成器对象不会产生任何输出。但是,如果我删除yield语句并仅将PullNP作为递归函数运行,我可以确认print语句包含我希望它们输出的内容。即我希望我的发电机包含这些清单:
Pulling relevant NP
['NP', ['NNP', 'Lincoln']]
Pulling relevant NP
['NP', ['DT', 'the'], ['NNP', 'Army']]
Pulling relevant NP
['NP', ['NP', ['DT', 'the'], ['NNP', 'Army']], ['PP', ['IN', 'of'], ['NP', ['DT', 'the'], ['NNP', 'Potomac']]]]
Pulling relevant NP
['NP', ['DT', 'the'], ['NNP', 'Army']]
Pulling relevant NP
['NP', ['NP', ['DT', 'the'], ['NNP', 'Army']], ['PP', ['IN', 'of'], ['NP', ['DT', 'the'], ['NNP', 'Potomac']]]]
Pulling relevant NP
['NP', ['DT', 'the'], ['NNP', 'Potomac']]
Pulling relevant NP
['NP', ['NP', ['DT', 'the'], ['NNP', 'Army']], ['PP', ['IN', 'of'], ['NP', ['DT', 'the'], ['NNP', 'Potomac']]]]
Pulling relevant NP
['NP', ['DT', 'the'], ['NNP', 'James']]
Pulling relevant NP
['NP', ['NP', ['DT', 'the'], ['NN', 'north'], ['NN', 'bank']], ['PP', ['IN', 'of'], ['NP', ['DT', 'the'], ['NNP', 'James']]], [',', ',']]
我已经阅读了主要的堆栈溢出帖子,解释了生成器和产量,我仍然不明白为什么我的生成器没有输出任何东西。
答案 0 :(得分:1)
调用子生成器不会使生成器(迭代器)运行。您需要迭代返回的值(或在其上显式调用next
)才能运行&amp;消耗屈服值。
这是重复功能。因此将检索到的项目返回给调用者。请注意标有# <---
alist = ['ROOT', ['S', ['NP', ['PRP', 'We']], ['VP', ['VBP', 'have'], ['VP', ['VBN', 'received'], ['NP', ['NN', 'information']],
['PP', ['IN', 'from'], ['NP', ['NP', ['DT', 'a'], ['NN', 'source']], ['VP', ['VBN', 'entitled'], ['PP', ['TO', 'to'],
['NP', ['NN', 'belief']]], [',', ','], ['SBAR', ['IN', 'that'], ['S', ['NP', ['NNP', 'Lincoln']], ['VP', ['VP', ['VBZ', 'has'],
['VP', ['VBN', 'paid'], ['NP', ['DT', 'a'], ['JJ', 'hurried'], ['NN', 'visit']], ['PP', ['TO', 'to'],
['NP', ['NP', ['DT', 'the'], ['NNP', 'Army']], ['PP', ['IN', 'of'], ['NP', ['DT', 'the'], ['NNP', 'Potomac']]]]],
[',', ','], ['PRN', ['-LRB-', '-LRB-'], ['ADVP', ['RB', 'now']], ['ADJP', ['JJ', 'burrowing'], ['PP', ['IN', 'on'],
['NP', ['NP', ['DT', 'the'], ['NN', 'north'], ['NN', 'bank']], ['PP', ['IN', 'of'], ['NP', ['DT', 'the'], ['NNP', 'James']]],
[',', ',']]]], ['-RRB-', '-RRB-']]]], ['CC', 'and'], ['VP', ['VBD', 'satisfied'], ['NP', ['PRP', 'himself']],
[',', ','], ['PP', ['IN', 'by'], ['NP', ['JJ', 'personal'], ['NN', 'observation']]], [',', ','],
['PP', ['IN', 'in'], ['NP', ['NN', 'regard']]], ['PP', ['TO', 'to'], ['NP', ['NP', ['DT', 'the'], ['JJ', 'true'], ['NN', 'situation']],
['PP', ['IN', 'of'], ['NP', ['NNS', 'affairs']]]]]]]]]]]]]], ['.', '.']]]
def PullNP(NNP, NPLists):
if NNP in NPLists:
print "Pulling relevant NP"
print NNP
yield NNP
for thing in NPLists:
if NNP in thing:
for nnp in PullNP(thing, NPLists):
yield nnp
else:
for s in thing:
if isinstance(s, list) and NNP in s:
for nnp in PullNP(s, NPLists): # <---
yield nnp # <---
def RecurseNNP(alist, pastlists=None, count=None):
if pastlists is None: pastlists = []
if count is None: count = 0
if 'NNP' in alist[0]:
NNPs = PullNP(alist, pastlists)
print NNPs
for np in NNPs:
print np
else:
if str(type(alist)) == "<type 'list'>":
if alist[0] == 'NP':
pastlists.append(alist)
for x in alist[1:]:
RecurseNNP(x, pastlists, count)
RecurseNNP(alist)