NLTK分块及遍历结果树

13 投票
4 回答
7408 浏览
提问于 2025-04-17 03:28

我正在使用NLTK的RegexpParser来从标记的词汇中提取名词组和动词组。

我该如何遍历生成的树,找到只有名词短语(NP)或动词短语(V)的部分呢?

from nltk.chunk import RegexpParser

grammar = '''
NP: {<DT>?<JJ>*<NN>*}
V: {<V.*>}'''
chunker = RegexpParser(grammar)
token = [] ## Some tokens from my POS tagger
chunked = chunker.parse(tokens)
print chunked

#How do I walk the tree?
#for chunk in chunked:
#    if chunk.??? == 'NP':
#         print chunk

(S (NP Carrier/NN) for/IN tissue-/JJ and/CC cell-culture/JJ for/IN (NP the/DT preparation/NN) of/IN (NP implants/NNS) and/CC (NP implant/NN) (V containing/VBG) (NP the/DT carrier/NN) ./.)

4 个回答

0

Savino的回答很好,但还值得一提的是,子树也可以通过索引来访问,比如说:

for n in range(len(chunked)):
    do_something_with_subtree(chunked[n])
0

token中有个小错误

from nltk.chunk import RegexpParser
grammar = '''
NP: {<DT>?<JJ>*<NN>*}
V: {<V.*>}'''
chunker = RegexpParser(grammar)
token = [] ## Some tokens from my POS tagger
//chunked = chunker.parse(tokens) // token defined in the previous line but used tokens in chunker.parse(tokens)
chunked = chunker.parse(token) // Change in this line
print chunked
13

这个应该可以正常运行:

for n in chunked:
    if isinstance(n, nltk.tree.Tree):               
        if n.label() == 'NP':
            do_something_with_subtree(n)
        else:
            do_something_with_leaf(n)

撰写回答