2009-12-11 50 views
11

有誰知道從文本體中只提取名詞的最簡單方法嗎?從文本中提取名詞(Java)

我聽說過TreeTagger tool,我試着給它一個鏡頭,但由於某種原因無法工作。

有什麼建議嗎?

感謝菲爾

編輯:

 import org.annolab.tt4j.*; 
TreeTaggerWrapper tt = new TreeTaggerWrapper(); 

try { tt.setModel("/Nouns/english.par"); 

tt.setHandler(new TokenHandler() { 
    void token(String token, String pos, String lemma) {  
    System.out.println(token+"\t"+pos+"\t"+lemma); } }); 
    tt.process(words); // words = list of words 

    } finally { tt.destroy(); 
}

這是我的代碼,英語是語言。我得到錯誤:類型new TokenHandler(){}必須實現繼承的抽象方法TokenHandler.token。難道我做錯了什麼?

+3

思維來解釋究竟是什麼沒有用TreeTagger工作? – 2009-12-11 17:46:06

+1

你能指定你的問題嗎?特別是語言會很好理解......德語例如具有所有名詞都具有大寫首字母的好處。 – Chris 2009-12-11 18:00:25

+0

我並不熟悉TreeTagger API,但是我會從setHandler()外面實例化TokenHandler開始 - 這可能會給出更清晰的消息。我的猜測是,TokenHandler是抽象的,但... – 2009-12-11 18:27:29

回答

22

首先你必須標記你的文字。這可能看起來微不足道(任何空白分割都可能適合你),但形式上它更難。那麼你必須決定什麼是名詞。 「停車場」是否包含一個名詞(停車場),兩個名詞(汽車,公園)或一個名詞(公園)和一個形容詞(汽車)?這是一個棘手的問題,但是你也可以在沒有它的情況下得到解決。

「我看到xyzzy」是否在字典中標識名詞?單詞「the」可能將xyzzy標識爲名詞。

「時間飛逝如箭」,名詞在哪裏?比較「像香蕉一樣的果蠅」(感謝Groucho Marx)。

我們在OpenNLP工具包使用布朗惡搞(JAVA)(http://en.wikipedia.org/wiki/Brown_Corpus)(opennlp.tools.lang.english.PosTagger; opennlp.tools.postag.POSDictionary上http://opennlp.sourceforge.net/)找到名詞在正常的英語,我會建議從此開始 - 它爲你做了大部分的思考。否則看任何POSTaggers (http://en.wikipedia.org/wiki/POS_tagger)或(http://www-nlp.stanford.edu/links/statnlp.html#Taggers)。

在部分的詞性標註由計算機, 它是典型的從語音的50 〜150分離的部分,以區分 英語中,例如,NN奇異 普通名詞,NNS對多個公共 名詞,NP奇異的專有名詞 (見布朗 語料庫使用的POS標籤)

有NLP工具包中http://en.wikipedia.org/wiki/Natural_language_processing_toolkits一個非常完整列表。我強烈建議你使用其中的一種,而不是試圖匹配Wordnet或其他集合。

+0

+1進行解釋。有些人似乎認爲自然語言處理並不是那麼困難,因爲它實際上是計算中最複雜的事情之一。有大量的角落案例,當突然處理語言改變時,一切都將毫無用處。而且,從理論上講,還有一個問題,即名詞,動詞或代詞等的定義超過1個。 – 2009-12-11 18:14:02

+0

@Maximilian感謝您的支持。我們同意這很難。幸運的是,我們只是試圖解釋化學家寫的語言,這很容易! – 2009-12-11 18:17:02

+0

優秀的職位,謝謝。目前正在下載lingpipe,儘管在Windows上,我希望它沒有很多令人討厭的.sh腳本! haha – Phil 2009-12-11 18:22:40

0

查看WordNet數據庫。這個詞法數據庫。你可以嘗試匹配每個單詞並檢查它是否是名詞。

我懷疑你會有100%的精度,但;數據庫沒有匹配英語中所有可能的單詞,但至少這是一個開始。

+1

這不太準確。例如,拿一句「他正在走路去學校」。與「他說,走路很累。」現在,在第二句中,「行走」是一個名詞(一個動名詞化的動詞),但在第一句中,它是動詞「走路」的漸進形式。而這只是一個例子,還有更多的問題。 – 2009-12-11 17:51:16

0

最簡單的方法可能是將文本中的每個單詞與名詞詞典進行比較。之後,你可能不得不做一些基本的解析並接受結果的近似正確性。大量的在線參考來分析自然語言。

0

查找帶有API(例如WS,RESTful)的字典網站,您可以使用該網站運行搜索查詢。

結果應該採用易於使用的格式(例如XML,JSON),當然應該包含單詞的詞彙類別。

1

根據您的編輯:

錯誤說,你必須覆蓋抽象方法的道理,你有記號的定義在你的匿名內部類,但也許你的令牌覆蓋的簽名不匹配TokenHandler中定義的抽象方法的簽名?

1

我下面的代碼工作與TreeTagger:

public List<String> tag(String str) { 
    final List<String> tagLemme = new ArrayList<String>(); 
    String[] tokens =tokenizer.tokenize(str); 
     System.setProperty("treetagger.home", "parametresTreeTagger/TreeTagger"); 
    TreeTaggerWrapper tt = new TreeTaggerWrapper<String>(); 
    try { 
     tt.setModel("parametresTreeTagger/english/english.par"); 
     tt.setHandler(new TokenHandler<String>(){ 
       public void token(String token, String pos, String lemma) { 
         tagLemme.add(token + "_" + pos + "_" + lemma); 
         //System.out.println(token + "_" + pos + "_" + lemma); 
       } 
     }); 
     tt.process(asList(tokens)); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     } catch (TreeTaggerException e) { 
     e.printStackTrace(); 
    } 
finally { 
     tt.destroy(); 
} 
    return tagLemme; 
} 
+0

我甚至無法正確安裝它http://stackoverflow.com/questions/15503388/treetagger-installation-successful-but-cannot-open-par-file – alvas 2013-03-19 15:36:54

+0

它對我來說工作得很好 – 2014-06-14 09:53:38