13

タグ付けされたトークンから名詞群と動詞群を抽出するために 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 キャリア/NN) の/IN 組織-/JJ および/CC 細胞培養/JJ の/IN (NP the/DT 準備/NN) の/IN (NP インプラント/NNS) および/CC (NP インプラント) /NN) (V含有/VBG) (NPザ/DTキャリア/NN) ./.)

4

4 に答える 4

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)
于 2011-10-01T09:31:03.280 に答える
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
于 2012-08-03T09:41:50.560 に答える
0

Savinoの答えは素晴らしいですが、サブツリーにもインデックスからアクセスできることも注目に値します。

for n in range(len(chunked)):
    do_something_with_subtree(chunked[n])
于 2014-01-15T14:57:09.270 に答える
0
def preprocess(sent):
sent = nltk.word_tokenize(sent)
sent = nltk.pos_tag(sent)
return sent



pattern = 'NP: {<JJ>*<NNP.*>*}'
cp =   nltk.RegexpParser(pattern)
exp = []
for line in lines:
    line = preprocess(line)
    cs = cp.parse(line)
    for n in cs:
        if isinstance(n, nltk.tree.Tree):
            if n.label() == 'NP':
                if len(n.leaves()) > 1:
                    req = ''
                    for leaf in n.leaves():
                        req += leaf[0]+' '
                    exp.append(req)
print(exp)   
于 2020-05-03T10:29:28.403 に答える