(ROOT
(S
(INTJ (UH Hello))
(, ,)
(NP (PRP$ My) (NN name))
(VP (VBZ is) (ADJP (JJ Melroy)))
(. .)))
(ROOT
(SBARQ
(WHNP (WP What))
(SQ (VBZ is) (NP (PRP$ your) (NN name)))
(. ?)))
我在python中有很多这些字符串。实际上它是一个树表示。我想为每个单词提取父节点和子节点。例如单词hello
我想要(INTJ, UH)
。类似地,对于单词My
,它是(NP, PRP$)
。
这是我想要的结果:
(INTJ, UH) , (NP, PRP$), (NP, NN) , (VP, VBZ) , (VP , VPZ) , (ADJP, JJ) , (WHNP, WP), (SQ, VBZ), (NP, PRP$), (NP, NN)
有关如何操作的任何建议或暗示。?
答案 0 :(得分:0)
这是一个输出你想要的代码。
在这段代码中,我逐行检查(BLAH(BLIH BLOH)),我删除(BLIH BLOH)并继续迭代直到找不到匹配。
astr = '''(ROOT
(S
(INTJ (UH Hello))
(, ,)
(NP (PRP$ My) (NN name))
(VP (VBZ is) (ADJP (JJ Melroy)))
(. .)))
(ROOT
(SBARQ
(WHNP (WP What))
(SQ (VBZ is) (NP (PRP$ your) (NN name)))
(. ?)))'''
def get_tree(astr):
import re
out = []
lines = astr.splitlines()
for line in lines:
pat = '\(([^\(\)]+?)( \(([^\)\(]+?) [^\(\)]+?\)).*?\)'
res = re.search(pat, line)
while res:
out.append((res.group(1), res.group(3)))
line = line.replace(res.group(2),'')
# line = re.sub('(\([^\s\(\)]*\))', '', line)
res = re.search(pat, line)
return out
get_tree(aster) # returns [('INTJ', 'UH'), ('NP', 'PRP$'), ('NP', 'NN'), ('VP', 'VBZ'), ('ADJP', 'JJ'), ('WHNP', 'WP'), ('SQ', 'VBZ'), ('NP', 'PRP$'), ('NP', 'NN')]