【问题标题】:Extracting specific leaf value from nltk tree structure with Python使用 Python 从 nltk 树结构中提取特定的叶值
【发布时间】:2013-04-30 17:56:36
【问题描述】:

我对 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 短语中获取第一个/最后一个名词?第一个名词的答案是“陌生人”,最后一个名词是“日期”。

【问题讨论】:

    标签: python tree nltk


    【解决方案1】:

    虽然名词短语可以嵌套在其他类型的短语中,但我相信大多数语法总是在名词短语中包含名词。所以你的问题可能可以改写为:你如何找到第一个和最后一个名词?

    您可以简单地获取所有tuples 的单词和词性标签并像这样过滤,

    >>> [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's 中的lists 中的list。在这种情况下,每个短语中恰好只有零个或一个名词。

    现在我们只需要遍历'NP's 并获取各个名词的所有leaves(这实际上意味着我们只想访问Tree('NN', ['stranger'])'stranger' 部分)。

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

    【讨论】:

    • 谢谢它的工作。现在我只需要获取列表中的第一项即可。
    • 使用 Python 3.4.1 和 NLTK 3.2.1,使用x.label() 而不是x.node 来查找结果,否则会得到NotImplementedError("Use label() to access a node label.") 异常。即:t = list(r.subtrees(filter=lambda x: x.label()=='NP'))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 2020-12-22
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多