输入字符串:'(SBARQ (WHADVP (WRB Where)) (VBZ is) (NP (DT the) (NN cow)))'
这是一棵树,看起来像:
目的是构建一个树节点,其中标签作为节点,其所有覆盖字符串作为值
class TreeNode:
def __init__(self):
self.childre=[]
self.label=""
self.text=""
这是树的预期外观:
SBARQ: "Where is the cow"
WHADVP: "Where"
WRB: "Where"
VBZ: "is"
NP: "the cow"
DT: "the"
NN: "cow"
可以使用递归同时创建树和聚合文本
我想:
assert
语句,当输入格式不符合预期时,这些语句将显示可读的异常消息李>__iter__
,以便可以轻松地迭代树中存在的所有节点以下是如何将上述内容用于您的具体示例:
后一个代码将输出:
最主要的是识别孩子。我将尝试解释我的代码:
首先,在
__init__
中,我识别给定字符串是否描述了由第一个字符确定的叶,如果它不是“开括号”('('
),则当前字符串描述了叶,例如"cow"
或Where
;与“非叶字符串”不同,例如"(NP (DT the) (NN cow))"
如果
string
描述一个叶,那么label = string
,否则label
是第一个括号(总是在第一个位置)和第一个空白之间的子字符串。另外,在后一种情况下,有必要识别不同的分支,这是通过方法split
完成的。然后,递归地识别children
split
方法通过计算开括号和闭括号来识别分支。请注意"(WHADVP (WRB Where)) (VBZ is) (NP (DT the) (NN cow))"
中的第一个分支是(WHADVP (WRB Where))
,也就是说,当代码中第一次开括号的数量等于闭括号的数量时(这个差异存储在pair_parenthesis
)。第二个和第三个分支也是如此。如果分支只有一个子级,例如"(WRB Where)"
,则将使用字符串"Where"
调用该方法,在这些情况下,该方法返回"[Where]"
最后,使用方法
calculate_text
分配text
,该方法基本上通过树进行递归调用来搜索叶子。如果节点是叶,则其标签将添加到text
现在进行一些测试:
如果有什么不清楚的地方,请告诉我
相关问题 更多 >
编程相关推荐