Nlp Jython的Antlr vs NLTK

Nlp Jython的Antlr vs NLTK,nlp,antlr,nltk,text-mining,Nlp,Antlr,Nltk,Text Mining,我目前正在用java编写一个NLP项目,用于标记和解析文本。我的主要问题是解析组件,它目前正在使用Antlr将标记文本转换为解析树。由于Antlr主要不是作为NL解析工具编写的,因此它占用大量内存,并且不容易修改语法。我想在jython中使用NLTK来解决这个问题,特别是考虑到这是一个分布式项目,还是有一个整洁的java等价物来生成这些解析树,建议使用NLTK 谢谢你说得对:ANTLR不太适合这种情况 我没有NLTK方面的经验,但我尝试过通过Jython进行一些“繁重的提升”,但效果不太好 他们

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


谢谢

你说得对:ANTLR不太适合这种情况

我没有NLTK方面的经验,但我尝试过通过Jython进行一些“繁重的提升”,但效果不太好

他们有一个好的NL解析器。也就是说,我听说过关于它的好消息,我绝对不是NLP方面的专家

下面是如何解析一个简单的英语句子,如“我目前正在用Java编写一个NLP项目,用于标记和解析文本。”:

import edu.stanford.nlp.ling.*;
导入edu.stanford.nlp.objectbank.*;
导入edu.stanford.nlp.parser.lexparser.*;
导入edu.stanford.nlp.process.*;
导入edu.stanford.nlp.trees.*;
导入java.io.*;
导入java.util.*;
公共类StanfordParserDemo{
公共静态void main(字符串[]args)引发异常{
//englishPCFG.ser.gz在下载中。
LexicalizedParser=新的LexicalizedParser(“/path/to/englishPCFG.ser.gz”);
TokenizerFactory tokenFactory=PTBTokenizer.factory(false,新单词tokenFactory());
String句子=“我目前正在用Java编写一个NLP项目,用于标记和解析文本。”;
System.out.println(“句子:”+句子);
List words=tokenFactory.getTokenizer(新的StringReader(句子)).tokenize();
parser.parse(单词);
Tree-Tree=parser.getBestParse();
TreePrint treePrinter=新的TreePrint(“penn,TypedPendenciesCollapsed”);
TreePrintTree(树);
}
}
其中打印:

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)))))) (. .))) 我目前正在用java编写一个NLP项目,用于标记和解析文本。 (根 (S) (NP(PRP I)) (副总裁(VBP am) (高级顾问(目前为经常预算)) (副总裁(VBG写作) (NP(DT an)(NNP NLP)(NN项目)) (PP(IN) (NP(NN-java))) (SBAR)(在该项中) (S) (NP(NNS标签) (抄送及) (NNS解析) (副总裁(VBZ文本(()()))) (. .)))
可以下载各种语言的JAR和语法。

谢谢!我已经研究了斯坦福解析器,但我的问题是它是基于模型的;我也找不到一种方法来添加我自己的语法规则,就像NLTK的块解析器一样。@LEzan,啊,所以如果我理解正确的话,你只对输入源/语言的一小部分感兴趣。如果是这样的话,你能在你最初的问题中举个例子吗:ANTLR使用的可能性很小。我目前正在使用ANTLR,但是规则太大了,它无法有效地处理。基本上,我想要的是以一些规则作为输入并生成一棵树作为输出的东西。例如,如果我给它一些规则:
S:npvpnp:dtadj+nnvp:VB*
,然后给它一句话:“快狐狸跳了”;然后我想得到:(S(NP(DT The)(ADJ quick)(NN fox))(VP(VBD jumped)))Thanks@Lezan,不,只有在解析自然语言的一小部分时,才能使用ANTLR。你的最新评论并不表明这一点,在这种情况下,我不建议你使用ANTLR。谢谢你,是的,我知道ANTLR在NL领域很广的情况下被证明是相当困难的,但我还没有找到其他方法可以做到这一点。将形式语言的解析工具(如ANTLR)强制转换为NLP工具从来都不起作用。它们不是为了处理自然语言中出现的歧义,更不用说频繁更新语法了。 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)))))) (. .)))