6

NLTK のツリー関数についていくつか質問があります。以下のようなツリー構造から特定の単語を抽出しようとしています。

test = Tree.parse('(ROOT(SBARQ(WHADVP(WRB How))(SQ(VBP do)(NP (PRP you))(VP(VB ask)(NP(DT a)(JJ total)(NN stranger))(PRT (RP out))(PP (IN on)(NP (DT a)(NN date)))))))')

print "Input tree: ", test
print test.leaves()

(SBARQ
    (WHADVP (WRB How))
    (SQ
      (VBP do)
      (NP (PRP you))
      (VP
        (VB ask)
        (NP (DT a) (JJ total) (NN stranger))
        (PRT (RP out))
        (PP (IN on) (NP (DT a) (NN date)))))))

['How', 'do', 'you', 'ask', 'a', 'total', 'stranger', 'out', 'on', 'a', 'date']

leaves() 関数を使用して、すべての単語のリストを見つけることができます。特定の葉だけを取得する方法はありますか? 例: NP 句のみから最初/最後の名詞を取得したいですか? 答えは、最初の名詞は「見知らぬ人」、最後の名詞は「日付」です。

4

1 に答える 1

11

名詞句は他の種類の句の中に入れ子にすることができますが、ほとんどの文法では常に名詞句に名詞があると思います。したがって、あなたの質問はおそらく次のように言い換えることができます:最初と最後の名詞をどのように見つけますか?

すべてtupleの単語と POS タグを取得し、次のようにフィルタリングするだけです。

>>> [word for word,pos in test.pos() if pos=='NN']
['stranger', 'date']

この場合は 2 つしかないので、これで完了です。もっと名詞がある場合は、[0]とでリストを索引付けし[-1]ます。


異なるフレーズで使用できる別の POS を探していたが、特定のフレーズ内でのみ使用したい場合、または NP の外で名詞を許可する奇妙な文法がある場合は、次のことができます...

を行うことsubtreesで見つけることができます。'NP'

>>> NPs = list(test.subtrees(filter=lambda x: x.node=='NP'))
>>> NPs
[Tree('NP', [Tree('PRP', ['you'])]), Tree('NP', [Tree('DT', ['a']), Tree('JJ', ['total']), Tree('NN', ['stranger'])]), Tree('NP', [Tree('DT', ['a']), Tree('NN', ['date'])])]

サブツリーを絞り込み続けると、この結果を使用して'NN'単語を探すことができます。

>>> NNs_inside_NPs = map(lambda x: list(x.subtrees(filter=lambda x: x.node=='NN')), NPs)
>>> NNs_inside_NPs
[[], [Tree('NN', ['stranger'])], [Tree('NN', ['date'])]]

したがって、これは各フレーズ内のすべての のlistのです。この場合、たまたま各句に名詞が 0 個または 1 個しか含まれていません。list'NN''NP'

'NP's を調べて、個々の名詞をすべて取得する必要があります(これは、 の部分leavesにアクセスしたいだけであることを意味します)。'stranger'Tree('NN', ['stranger'])

>>> [noun.leaves()[0] for nouns in NNs_inside_NPs for noun in nouns]
['stranger', 'date']
于 2013-05-06T23:01:45.060 に答える