我目前正在用Java编写一个NLP项目,用于标记和解析文本。我的主要问题是解析组件,它当前正在使用Antlr将标记的文本转换为解析树。由于Antlr并非主要是作为NL解析工具编写的,因此它占用了大量内存,并且不容易适应于修改语法。我想在jython中使用NLTK来解决此问题,是否建议特别考虑到这是一个分布式项目,或者是否有一个等效的纯Java来生成这些解析树的建议。

谢谢

最佳答案

您是对的: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);
  }
}

打印:

句子:我目前正在用Java编写一个NLP项目,用于标记和解析文本。
(根
(S
(NP(PRP I))
(副总裁(VBP上午)
(ADVP(目前为RB))
(副总裁(VBG写作)
(NP(DT an)(NNP NLP)(NN项目))
(PP(IN英寸)
(NP(NN java)))
(SBAR(在那)
(S
(NP(NNS标签)
(抄送和)
(NNS解析))
(VP(VBZ文字))))))
(..)))

可以下载各种语言的JAR和语法here

关于nlp - Jython的Antlr和NLTK,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6705972/

10-12 23:24