2011-07-15 66 views
3

我目前在Java中標籤和解析文本寫作NLP項目。我的主要問題是解析組件,它目前使用Antlr將標記文本轉換爲解析樹。由於Antlr主要不是作爲NL語法分析工具編寫的,因此它佔用大量內存,不易修改語法。我想在jython中使用NLTK來解決這個問題,尤其是考慮到這是一個分佈式項目,或者是否有一個相當於生成這些分析樹的java類似的東西時,會推薦這麼做。ANTLR的VS NLTK Jython中

謝謝

+1

強迫分析工具,用於正式的語言,如ANTLR,到NLP的工具,從來沒有真正的作品。它們不是爲了處理自然語言中出現的模糊性而設計的,更不用說頻繁更新語法。 –

回答

3

你是對的:ANTLR不適合這樣的事情。

我有沒有NLTK經驗,但試圖做一些「繁重」的Jython,通過它沒有成功太清楚了。

Stanford Natural Language Processing Group有很好的NL解析器。也就是說,我聽說過很好的事情,我絕不是NLP的專家!

這裏是你如何能分析一個簡單的英文句子像"I am currently writing an NLP project in Java that tags and parses text."

import edu.stanford.nlp.ling.*; 
import edu.stanford.nlp.objectbank.*; 
import edu.stanford.nlp.parser.lexparser.*; 
import edu.stanford.nlp.process.*; 
import edu.stanford.nlp.trees.*; 
import java.io.*; 
import java.util.*; 

public class StanfordParserDemo { 

    public static void main(String[] args) throws Exception { 

    // englishPCFG.ser.gz is in the download. 
    LexicalizedParser parser = new LexicalizedParser("/path/to/englishPCFG.ser.gz"); 
    TokenizerFactory<Word> tokenFactory = PTBTokenizer.factory(false, new WordTokenFactory()); 

    String sentence = "I am currently writing an NLP project in Java that tags and parses text."; 
    System.out.println("Sentence: " + sentence); 

    List<Word> words = tokenFactory.getTokenizer(new StringReader(sentence)).tokenize(); 
    parser.parse(words); 

    Tree tree = parser.getBestParse(); 
    TreePrint treePrinter = new TreePrint("penn,typedDependenciesCollapsed"); 
    treePrinter.printTree(tree); 
    } 
} 

它打印:

Sentence: I am currently writing an NLP project in java that tags and parses text. 
(ROOT 
    (S 
    (NP (PRP I)) 
    (VP (VBP am) 
     (ADVP (RB currently)) 
     (VP (VBG writing) 
     (NP (DT an) (NNP NLP) (NN project)) 
     (PP (IN in) 
      (NP (NN java))) 
     (SBAR (IN that) 
      (S 
      (NP (NNS tags) 
       (CC and) 
       (NNS parses)) 
      (VP (VBZ text)))))) 
    (. .)))

各種語言的JAR和語法可以下載here

+0

謝謝! 我已經看過斯坦福分析器,但我的問題是它是基於模型的;並且我找不到一種方法將它自己的語法規則添加到NLTK的塊分析器中。 – Lezan

+0

@LEZAN,啊,所以如果我理解正確,你只對輸入源/語言的一小部分感興趣。如果是這樣,你能舉出一個原始問題的例子:ANTLR _can_有一個小的機會。 –

+0

嗯,我目前使用Antlr,但規則變得太大,它無法有效處理。基本上我想要一些需要一些規則作爲輸入,併產生一個樹作爲輸出。 因此,舉例來說,如果我給它有規則: 'S:NP VP NP:DT ADJ + NN VP:VB *' ,並將它傳遞了這樣一句話: 「快速躍升狐狸」;然後 我想獲得: (S (NP(DT的) (ADJ快捷) (NN狐狸) ) (VP(VBD一躍)) ) 感謝 – Lezan