如何使用 nltk 去除 ptb 解析树中的 -NONE- 和 *T*-i?

How to get rid of -NONE- and *T*-i in ptb parse trees using nltk?

我处理 penn tree bank v2 树并且经常遇到像这样的 "service"-子树(以及其他几种类型)

我可以手动添加很多规则来进一步优化我实际使用的节点(使用标签和标记进行解析,没有 "oh, look there" 链接或 "there must have been a node here" - 就像斯坦福解析器返回的那些) ,但我最常留下其中一些 service-nodes 或巨大的差距和 "cropped branches" (例如,如果你删除上面的那些 -NONE- 节点,你会留下 SBAR 没有children 一点都不奇怪)。

我想知道是否可以从 from nltk.corpus import ptb; ptb.parsed_sents() 的输出中删除除实际解析(单词、标签、标点符号)之外的所有内容?

删除任何只支配踪迹的子树。在下文中,我遍历了子树,但实际上检查了它们的子树;这使得通过修改包含它的节点来删除空子树变得容易。

for sub in some_tree.subtrees():
    for n, child in enumerate(sub):
        if isinstance(child, str):
            continue
        if all(leaf.startswith("*") for leaf in child.leaves()):
            del sub[n]  # Delete this child

我使用 leaf.startswith("*") 作为检测痕迹的简单标准。根据需要将其替换为您自己的。

编辑: 由于您要删除仅包含标记为 -NONE- 的子树的所有节点,并且每个这样的子树只支配一个叶子,请使用以下测试:

    if len(list(child.subtrees(filter=lambda x:x.label()=='-NONE-')))==len(child.leaves()):
        del sub[n]

感谢下面的 @alexsis 回答,现在我知道那些东西叫做跟踪和联合索引。我找到了以下 implementation of def ptb_delete_traces(tree) in the treetools 包。