2017-07-06 110 views
3

好吧,我完全不知所措。我已經從依賴關係樹分析工具,它看起來像下面的一些輸出:如何解析依賴樹的輸出爲扁平結構

(S 
    (NP 
     (PRP It) 
    ) 
    (VP 
     (VBD said) 
     (CLAUSE 
      (S 
       (NP 
        (DT the) 
        (NN figure) 
       ) 
       (VP 
        (VBD was) 
        (VBN rounded) 
       ) 
      ) 
     ) 
    ) 
    (PUNC .) 
) 

這些解析輸出,保存爲純文本。據我所知,輸出基本上是一棵二叉樹。我想要的是有一個輸出文件,每個單詞放在一個新行中,每個單詞包含與該單詞相關的所有標籤。一個例子是:

It S NP PRP 
said S VP 
the S VP CLAUSE S NP DT 
figure S VP CLAUSE S NP NN 
was S VP CLAUSE S VP VBD 
rounded S VP CLAUSE S VP VBN 
. PUNC S 

如何解析這個輸出到我要找的輸出中?我試圖使用pyparsing庫,並且已經能夠將字符串解析爲列表的分層列表,但這不能滿足我的輸出需求。

我認爲遞歸可能是一個很好的候選工具,但我不確定如何將其應用於此問題。任何幫助,這將不勝感激 - 甚至僞代碼來實現的想法。

回答

5

首先,您的輸出轉換出現錯誤。

要接近解決方案,需要遞歸。但你不必發明輪子。只有這樣的任務有一個叫pyparsing的小模塊。

from pyparsing import nestedExpr 

astring = '''(S 
    (NP 
     (PRP It) 
    ) 
    (VP 
     (VBD said) 
     (CLAUSE 
      (S 
       (NP 
        (DT the) 
        (NN figure) 
       ) 
       (VP 
        (VBD was) 
        (VBN rounded) 
       ) 
      ) 
     ) 
    ) 
    (PUNC .) 
)''' 

expr = nestedExpr('(', ')') 
result = expr.parseString(astring).asList()[0] 

print(result) 

此打印出:我們可以使用遞歸的正則表達式是字符串轉換成列表的嵌套列表

['S', 
['NP', ['PRP', 'It']], 
['VP', 
    ['VBD', 'said'], 
    ['CLAUSE', 
    ['S', 
    ['NP', ['DT', 'the'], ['NN', 'figure']], 
    ['VP', ['VBD', 'was'], ['VBN', 'rounded']]]]], 
['PUNC', '.']] 

接下來,我們需要編寫一個可以建立從轉換功能給出瞭解析樹。可悲的是,沒有簡單的方法來做到這一點。我們需要自己編寫一個硬核遞歸子例程。這是一種方法。使用第n個符號並檢索n + 1個符號的所有轉換,然後通過將第n個符號附加到這些轉換來構建新的轉換列表。

聽起來有點複雜,但也許代碼會幫助你理解:

def get_rules(rule_list): 
    transitions = [] 

    if len(rule_list) == 2 and isinstance(rule_list[1], str): 
     return [rule_list] 


    for rule in rule_list[1:]: 
     for r in get_rules(rule): 
      transitions.append([rule_list[0]] + r) 

    return transitions 

這很簡單。有一個基本案例,如果你到達終端,你會返回一個單例轉換。否則遞歸地構建轉換。

調用此函數並打印結果做下一個:

for r in get_rules(result): 
    print(r[-1] + '\t' + '\t'.join(r[:-1])) 

輸出:

It S NP PRP 
said S VP VBD 
the S VP CLAUSE S NP DT 
figure S VP CLAUSE S NP NN 
was S VP CLAUSE S VP VBD 
rounded S VP CLAUSE S VP VBN 
. S PUNC 

我前面提到的,你的過渡被錯誤地表示。你可以與這個交叉檢查,這是正確的答案。

相關問題