2016-11-08 37 views
1

我爲此使用了Ruby。 Freeling(一個NLP工具)有一個淺解析器,當我運行一個淺解析命令時,它會爲文本「我剛讀過這本書,蚱蜢很沉重」返回一個字符串。如何將命令行輸出從Freeling轉換爲易耗陣列

a = <<EOT 
S_[ 
    sn-chunk_[ 
    +(I i PRP -) 
    ] 
    adv_[ 
    +(just just RB -) 
    ] 
    vb-chunk_[ 
    +(read read VB -) 
    ] 
    sn-chunk_[ 
    (the the DT -) 
    +n-chunk_[ 
     (book book NN -) 
     +n-chunk_[ 
     +(The_Grasshopper_Lies_Heavy the_grasshopper_lies_heavy NP -) 
     ] 
    ] 
    ] 
    st-brk_[ 
    +(. . Fp -) 
    ] 
] 

EOT 

我想從這個以下數組:

["I", "just", "read", "the book The Grasshopper Lies Heavy","."] 

(我想合併是在樹下,並把它作爲一個單一的數組元素的話)

到目前爲止,我已經寫了這麼多:

b = a.gsub(/.*\[/,'[').gsub(/.*\+?\((\w+|.) .*/,'\1').gsub(/\n| /,"").gsub("_","") 

返回

[[I][just][read][the[book[The Grasshopper Lies Heavy]]][.]] 

那麼,我怎麼能得到所需的數組?

+0

您確定您使用的API無法輸出令牌列表嗎?加。對於文檔,如果您使用命令行,請嘗試「--outf token」。 –

+0

@WiktorStribiżew它沒有。 '淺'是結果選項之一,如果我做另一個名爲'tagged'的選項,它只是分別標記每個單詞/命名實體,而我沒有得到「The Grasshopper Lies Heavy」這本書的樹。 –

+0

用正則表達式的方法,你如何區分真正的'_'和Freeling樹構建器引入的?您現在刪除所有下劃線。或者在輸出樹中沒有下劃線? –

回答

2

從您的解決方案至今:

result = a.gsub(/.*\[/,'[').gsub(/.*\+?\((\w+|.) .*/,'\1').gsub(/\n| /,"").gsub("_"," ") 
result.split('][').map { |s| s.gsub(/\[|\]/, ' ').strip }  # ["I", "just", "read", "the book The Grasshopper Lies Heavy", "."] 
+0

@B A它解決了你的問題嗎? –

+0

哇這個作品。謝謝@Jagdeep –

+0

很酷。您可以將其標記爲已接受。謝謝。 –

0

如果通過API Ruby中調用弗裏,你可以得到的聖誕樹,將穿越它。

如果您正在使用命令行程序的輸出並將其作爲字符串加載到Ruby中,可以使用選項「--output conll」來調用它,該選項可以更容易地處理表格格式。

+0

我剛剛做了,但沒有奏效:這個工作''#{analyzer_path} -f#{cfg_path} --inpf plain --outf shallow「'這不''#{analyzer_path} -f#{ cfg_path} --inpf plain --outf shallow --output conll「' –

+0

選項」--output conll「只適用於4.0版本的更新版本,看起來您使用的是3.x –