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

标签 python nltk parse-tree

我处理 penn tree bank v2 树并经常遇到像这样的“服务”子树(以及其他几种类型)

enter image description here

我可以手动添加很多规则来优化我实际使用的节点(使用标签和标记进行解析,没有“哦,看那里”链接或“这里一定有一个节点” - 就像返回的那些Stanford 解析器),但我最常留下其中一些服务节点或巨大的间隙和“裁剪分支”(例如,如果您删除上面的那些 -NONE- 节点,您将拥有 SBAR 没有 child ,这很奇怪。

我想知道是否可以从 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]

关于python - 如何使用 nltk 去除 ptb 解析树中的 -NONE- 和 *T*-i?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41171942/

相关文章:

python - 使用多线程和 mysqldb 时出错

python - 使用 CouchDB-Python 获取文档级别的完整修订列表?

python - 如何获取 CFG 语法词典中没有的单词?

python - 解析文本并获取小时数

compiler-construction - 解析树和抽象语法树(AST)有什么区别?

Python-使用 slider 更改图形图上的文本

python - 如果一个键存在多个值,如何在 python 字典中打印特定值的键?

python - 如何检查元组中是否包含某个单词,如果包含,则将其删除

java - ANTLR v4、JavaLexer 和 JavaParser 返回 null 作为解析树