我有一个解析树的集合,它们在这个ascii表示中,其中缩进确定结构(并且右括号是隐式的)。我需要将它们转换为s表达式,以便括号确定结构。它有点像python的重要空白与大括号。输入格式是树的垂直表示,如下所示:
STA:fcl
=S:np
==DN:pron-dem("tia" <*> <Dem> <Du> <dem> DET P NOM) Tiaj
==H:n("akuzo" <act> <sd> P NOM) akuzoj
=fA:adv("certe") certe
=P:v-fin("dauxri" <va+TEMP> <mv> FUT VFIN) dauxros
.
应该成为:
(STA:fcl (S:np (DN:pron-dem Tiaj) (H:n akuzoj)) (fA:adv certe) (P:v-fin dauxros) .)
我有几乎的代码,但不完全。某处总是缺少一个人;它变得非常令人沮丧。我应该使用正确的解析器,也许是CFG?当前(杂乱)代码位于http://github.com/andreasvc/eodop/blob/master/arbobanko.py
答案 0 :(得分:1)
只关注你在这个Q中给出的例子,以及Q关于将垂直树转换为S表达式的标题,如......:
import re
import sys
samp='''S
=NP
==(DT +def) the
== (N +ani) man
=VP
==V walks'''.splitlines()
relinelev = re.compile(r'(=*)(.*)')
reclean = re.compile(r'\s*\((\S+)[^)]*\)')
def clean(line):
return reclean.sub(r'\1', line)
def reparse(tree=samp):
stack = [-1]
for line in tree:
equals, rest = relinelev.match(line).groups()
linelev = len(equals)
while linelev < stack[-1]:
sys.stdout.softspace = False
print ')',
curlev = stack.pop()
if linelev == stack[-1]:
sys.stdout.softspace = False
print ')',
else:
stack.append(linelev)
print '(%s' % clean(rest),
while stack[-1] >= 0:
sys.stdout.softspace = False
print ')',
stack.pop()
print
reparse()
似乎有效,并输出
(S (NP (DT the) (N man)) (VP (V walks)))
我意识到你正在努力做更多的“清洁”而不是我在这里做的事情,但这可以集中在clean
函数中,让reparse
处理Q的标题。如果您不想随意打印,而是将结果作为字符串返回,那么更改当然很小:
def reparse(tree=samp):
stack = [-1]
result = []
for line in tree:
equals, rest = relinelev.match(line).groups()
linelev = len(equals)
while linelev < stack[-1]:
result[-1] += ')'
curlev = stack.pop()
if linelev == stack[-1]:
result[-1] += ')'
else:
stack.append(linelev)
result.append('(%s' % clean(rest))
while stack[-1] >= 0:
result[-1] += ')'
stack.pop()
return ' '.join(result)