Вы правы: ANTLR не очень подходит для таких вещей.
У меня нет опыта работы с NLTK, но я пытался сделать "тяжелую работу" через Jython, которая тоже не удаласьну.
У Stanford Natural Language Processing Group есть хороший анализатор NL.То есть я слышал об этом много хорошего, я ни в коем случае не эксперт по НЛП!
Вот как вы можете разобрать простое английское предложение, например "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 и грамматику для различных языков можно скачать здесь .