簡體   English   中英

使用Python從nltk樹結構中提取特定葉值

[英]Extracting specific leaf value from nltk tree structure with Python

我對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短語中獲取第一個/最后一個名詞? 答案對於第一個名詞是“陌生人”而​​對於最后一個名詞是“日期”。

雖然名詞短語可以嵌套在其他類型的短語中,但我相信大多數語法總是在名詞短語中使用名詞。 所以你的問題可能會改為: 你怎么找到第一個和最后一個名詞?

您可以簡單地獲取所有單詞和POS標簽的tuple並像這樣過濾,

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

在這種情況下只有兩個,所以你已經完成了。 如果你有更多的名詞,你只需要在[0][-1]索引列表。


如果您正在尋找可以在不同短語中使用的另一個POS,但您只想在特定的一個中使用它,或者如果您有一個允許在NP之外使用名詞的奇怪語法,您可以執行以下操作...

你可以通過這樣做找到'NP'subtrees

>>> 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'])]]

所以這是每個'NP'短語中所有'NN' listlist 在這種情況下,每個短語中恰好只有零個或一個名詞。

現在我們只需要通過'NP'並得到各個名詞的所有leaves (這實際上意味着我們只想訪問Tree('NN', ['stranger'])'stranger'部分Tree('NN', ['stranger']) )。

>>> [noun.leaves()[0] for nouns in NNs_inside_NPs for noun in nouns]
['stranger', 'date']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM