只對你在這個問答作爲例子來說明聚焦,和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)
感謝一堆!我甚至不知道splitlines()。如果我將你的代碼添加到我的git存儲庫,可以嗎?當然,我會GPL它並給你信用。 當樹在根級別跟蹤樹葉時,您的代碼失敗,我在代碼的x個不正確迭代之一中也遇到了一個問題...我將更新Q以反映此問題。 – Andreas 2010-05-12 10:02:37
用你現在的樣本和一個稍微不同的'clean'函數(刪除了括號內的部分和後面的空格),我的代碼給出了(STA:fcl(S:np(DN:pron-dem Tiaj)(H:n akuzoj))) (fA:adv certe)(P:v-fin dauxros))'這看起來正是你所需要的,所以我沒有看到它在什麼意義上「失敗了,當樹在根層上落葉」時,無論它手段。請再次編輯您的Q以顯示我的代碼_fails_的示例,否則我該如何修復它?當然,一旦代碼是正確的(或至少它的失敗案例很好地記錄),你可以使用它。 – 2010-05-12 13:51:39
如果你仔細看看我的例子,你會明白我的意思:最後一行有一段時間,它應該在最後一次關閉之前成爲樹的一部分。但是現在我想起來了,這似乎很奇怪,因爲如果它是根STA:fcl的孩子,那麼它應該用一個等號縮進。也許我應該使用臨時修復來添加轉換後的時間段。 – Andreas 2010-05-12 16:53:40