我处理 penn tree bank v2 树并经常遇到像这样的“服务”子树(以及其他几种类型)
我可以手动添加很多规则来优化我实际使用的节点(使用标签和标记进行解析,没有“哦,看那里”链接或“这里一定有一个节点” - 就像返回的那些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/