如何使用 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
包。
我处理 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
包。