我目前正在用 Java 编写一个标记和解析文本的 NLP 项目。我的主要问题是解析组件,它目前正在使用 Antlr 将标记的文本转换为解析树。由于 Antlr 主要不是作为 NL 解析工具编写的,因此它会占用大量内存并且不容易适应修改语法。我想在 jython 中使用 NLTK 来解决这个问题,特别是考虑到这是一个分布式项目,或者是否有一个简洁的 java 等价物来生成这些解析树,是否建议这样做。
谢谢
我目前正在用 Java 编写一个标记和解析文本的 NLP 项目。我的主要问题是解析组件,它目前正在使用 Antlr 将标记的文本转换为解析树。由于 Antlr 主要不是作为 NL 解析工具编写的,因此它会占用大量内存并且不容易适应修改语法。我想在 jython 中使用 NLTK 来解决这个问题,特别是考虑到这是一个分布式项目,或者是否有一个简洁的 java 等价物来生成这些解析树,是否建议这样做。
谢谢
你是对的:ANTLR 不太适合这样的事情。
我没有使用 NLTK 的经验,但尝试通过 Jython 做一些“繁重的工作”,但效果不太好。
斯坦福自然语言处理小组有一个很好的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);
}
}
打印:
句子:我目前正在用java编写一个标记和解析文本的NLP项目。 (根 (S (NP (PRP I)) (副总裁(VBP 上午) (ADVP(目前为RB)) (副总裁(VBG写作) (NP (DT an) (NNP NLP) (NN 项目)) (PP (在) (NP (NN java))) (SBAR(在那) (S (NP(NNS标签) (抄送和) (NNS 解析)) (副总裁(VBZ 文本)))))) (. .)))
各种语言的 JAR 和语法可以在这里下载。