2010-05-11 125 views
2

我有一個解析樹的集合,它們在這個ascii表示中,其中縮進確定結構(並且右括號是隱式的)。我需要將它們轉換爲s表達式,以便括號確定結構。這有點像Python的重要空白與大括號。輸入格式是樹木垂直表示,像這樣:將垂直樹的樹形樹轉換爲s表達式

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

回答

1

只對你在這個問答作爲例子來說明聚焦,和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) 
+0

感謝一堆!我甚至不知道splitlines()。如果我將你的代碼添加到我的git存儲庫,可以嗎?當然,我會GPL它並給你信用。 當樹在根級別跟蹤樹葉時,您的代碼失敗,我在代碼的x個不正確迭代之一中也遇到了一個問題...我將更新Q以反映此問題。 – Andreas 2010-05-12 10:02:37

+0

用你現在的樣本和一個稍微不同的'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

+0

如果你仔細看看我的例子,你會明白我的意思:最後一行有一段時間,它應該在最後一次關閉之前成爲樹的一部分。但是現在我想起來了,這似乎很奇怪,因爲如果它是根STA:fcl的孩子,那麼它應該用一個等號縮進。也許我應該使用臨時修復來添加轉換後的時間段。 – Andreas 2010-05-12 16:53:40