2012-12-13 38 views
0

我試圖提取使用的規則,如對文本下面提及的那些,其已經POS標籤如何編寫提取名詞短語的高效代碼?

1)NNP短語 - > NNP( - >表示隨後) 2)NNP - > CC - > NNP 3)VP - > NP etc ..

我已經用這種方式編寫代碼了,有人能告訴我怎樣才能以更好的方式做。

List<String> nounPhrases = new ArrayList<String>(); 
    for (List<HasWord> sentence : documentPreprocessor) { 

     //System.out.println(sentence.toString()); 
     System.out.println(Sentence.listToString(sentence, false)); 
     List<TaggedWord> tSentence = tagger.tagSentence(sentence); 


     String lastTag = null, lastWord = null; 
     for (TaggedWord taggedWord : tSentence) { 
      if (lastTag != null && taggedWord.tag().equalsIgnoreCase("NNP") && lastTag.equalsIgnoreCase("NNP")) { 
       nounPhrases.add(taggedWord.word() + " " + lastWord); 
       //System.out.println(taggedWord.word() + " " + lastWord); 

      } 
      lastTag = taggedWord.tag(); 
      lastWord = taggedWord.word(); 
     } 

    } 

在上面的代碼,我已經做只爲NNP其次NNP提取,我怎麼能概括它,這樣我可以添加其他的規則了。我知道有這樣的庫可用來做這件事,但是想要手動做到這一點。

回答

1

也許你應該嘗試使用Chunker。你可以試試OpenNLP Chunker。看起來你使用POS相同的標記集。您可以在這裏找到用法:

http://opennlp.apache.org/documentation/1.5.2-incubating/manual/opennlp.html#tools.chunker

輸入例:

Rockwell_NNP International_NNP Corp._NNP 's_POS Tulsa_NNP unit_NN said_VBD it_PRP signed_VBD a_DT tentative_JJ agreement_NN extending_VBG its_PRP$ contract_NN with_IN Boeing_NNP Co._NNP to_TO provide_VB structural_JJ parts_NNS for_IN Boeing_NNP 's_POS 747_CD jetliners_NNS ._. 

輸出:

[NP Rockwell_NNP International_NNP Corp._NNP ] [NP 's_POS Tulsa_NNP unit_NN ] [VP said_VBD ] [NP it_PRP ] [VP signed_VBD ] [NP a_DT tentative_JJ agreement_NN ] [VP extending_VBG ] [NP its_PRP$ contract_NN ] [PP with_IN ] [NP Boeing_NNP Co._NNP ] [VP to_TO provide_VB ] [NP structural_JJ parts_NNS ] [PP for_IN ] [NP Boeing_NNP ] [NP 's_POS 747_CD jetliners_NNS ] ._. 
+0

是的。正如我之前所說的,想要手動執行而不使用這些庫進行短語檢測。 –

+0

是的,對不起。我沒有閱讀完整的問題。一旦我嘗試手動做這個。我創建了一個可以識別葡萄牙語NP的有限狀態機。與使用機器學習相比,結果並不好。 – wcolen

0

現有的庫,實現大多數人並建立一個有限狀態機來實現這個功能。他們可靠,高效和開放。然而,一個非常天真的實現想法可以是通過POS-Tag數組制定規則表達式,然後使用偏移量來標記短語。聽起來合乎邏輯和簡單,但可能不正確。

相關問題