2014-12-04 49 views
1

作爲運行斯坦福分析器的結果,我輸出的文件包含Penn Tree結構的 格式。每個文件都包含如下內容。使用bash從斯坦福分析器輸出文本文件中提取所有名詞短語

(ROOT 
    (S 
    (S 
     (NP 
     (NP (DT The) (JJS strongest) (NN rain)) 
     (VP 
      (ADVP (RB ever)) 
      (VBN recorded) 
      (PP (IN in) 
      (NP (NNP India))))) 
     (VP 
     (VP (VBD shut) 
      (PRT (RP down)) 
      (NP 
      (NP (DT the) (JJ financial) (NN hub)) 
      (PP (IN of) 
       (NP (NNP Mumbai))))) 
     (, ,) 
     (VP (VBD snapped) 
      (NP (NN communication) (NNS lines))) 
     (, ,) 
     (VP (VBD closed) 
      (NP (NNS airports))) 
     (CC and) 
     (VP (VBD forced) 
      (NP 
      (NP (NNS thousands)) 
      (PP (IN of) 
       (NP (NNS people)))) 
      (S 
      (VP (TO to) 
       (VP 
       (VP (VB sleep) 
        (PP (IN in) 
        (NP (PRP$ their) (NNS offices)))) 
       (CC or) 
       (VP (VB walk) 
        (NP (NN home)) 
        (PP (IN during) 
        (NP (DT the) (NN night)))))))))) 
    (, ,) 
    (NP (NNS officials)) 
    (VP (VBD said) 
     (NP-TMP (NN today))) 
    (. .))) 

現在我想在bash中使用腳本來使用bash提取所有名詞短語。我知道有一種方法可以在java中完成我不確定如何通過將文本文件讀入樹來使其工作。

+1

你是否只需要Bash專用,還是可以使用標準的Unix工具,如Awk,sed,Perl等?那麼它相對容易,並且在Google中相對容易找到。你已經嘗試了什麼?你有什麼麻煩? – tripleee 2014-12-04 11:05:29

+1

http://pythonhosted.org/ete2/tutorial/tutorial_trees.html – tripleee 2014-12-04 11:07:59

+0

http://rosettacode.org/wiki/S-Expressions – tripleee 2014-12-04 11:12:32

回答

2

這裏有一個快速而髒的Awk腳本來提取最外面的NP子樹。如果你還想要內部,你需要一個正確的遞歸解決方案。

awk -v RS='[ \t\n]+' ' 
    !np && /^\(NP$/ { np=paren } 
    /^\(/ { ++paren } 
    /\)/ { b=$0; c=""; while (sub(/\)$/, "", b)) {paren--; c=c ")" 
     if (np && paren == np) { 
      d=b; gsub(/\)+$/, "", d); print a " " d c; np=0; a=c="" } } } 
    np { a=a (a ? " " : "") $0 }' 
+0

優秀的解決方案。 – 2014-12-09 14:21:04

相關問題