将垂直树的树库转换为sexpressions

2024-05-13 11:15:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一组解析树,它们在这个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
.

应该变成:

^{pr2}$

我有一些代码几乎可以做到,但不完全是。总有一个地方不见了,这让人很沮丧。我应该使用一个合适的解析器,也许是CFG?当前(混乱)代码位于http://github.com/andreasvc/eodop/blob/master/arbobanko.py


Tags: 代码表达式格式npascii大括号结构nom
1条回答
网友
1楼 · 发布于 2024-05-13 11:15:57

只关注你在这个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()

似乎有效,而且输出

^{pr2}$

我知道您尝试做的“清理”要比我在这里做的多得多,但是这可以集中在clean函数中,让{}来处理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)

相关问题 更多 >