如何使用Stanford Parser?;在java中,不是命令行

如何使用Stanford Parser?;在java中,不是命令行,java,nlp,stanford-nlp,Java,Nlp,Stanford Nlp,我一直在尝试在Java程序中使用Stanford解析器来解析一些中文句子。因为我对Java和Stanford解析器都是新手,所以我使用了“ParseDemo.Java”来练习。代码可以很好地处理英语句子,并输出正确的结果。然而,当我将模型改为'chinesePCFG.ser.gz'并试图解析一些分段的中文句子时,事情就出了问题 这是我的Java代码 classparserdemo{ 公共静态void main(字符串[]args){ LexicalizedParser lp=Lexicalize

我一直在尝试在Java程序中使用Stanford解析器来解析一些中文句子。因为我对Java和Stanford解析器都是新手,所以我使用了“ParseDemo.Java”来练习。代码可以很好地处理英语句子,并输出正确的结果。然而,当我将模型改为'chinesePCFG.ser.gz'并试图解析一些分段的中文句子时,事情就出了问题

这是我的Java代码

classparserdemo{
公共静态void main(字符串[]args){
LexicalizedParser lp=LexicalizedParser.loadModel(“edu/stanford/nlp/models/lexparser/chinesePCFG.ser.gz”);
如果(args.length>0){
解调器(lp,args[0]);
}否则{
德莫阿皮(有限合伙);
}
}
公共静态void解调器(LexicalizedParser lp,字符串文件名){
//此选项显示加载和句子段以及标记化
//使用文档预处理器的文件
TreebankLanguagePack tlp=新的PennTreebankLanguagePack();
语法结构工厂gsf=tlp.grammaticStructureFactory();
//您还可以在这里创建一个标记器(如下所示)并传递它
//文档预处理器
for(列表语句:新文档预处理器(文件名)){
树解析=lp.apply(句子);
parse.pennPrint();
System.out.println();
语法结构gs=gsf.newgrammaticstructure(parse);
集合tdl=gs.TypedDependenciescpProcessed(真);
系统输出打印LN(tdl);
System.out.println();
}
}
公共静态void demoAPI(LexicalizedParser lp){
//此选项显示如何解析正确标记的单词列表
已发送字符串[]={”我", "是", "一名", "学生" };
List rawWords=句子。toCoreLabelList(已发送);
树解析=lp.apply(rawWords);
parse.pennPrint();
System.out.println();
TreebankLanguagePack tlp=新的PennTreebankLanguagePack();
语法结构工厂gsf=tlp.grammaticStructureFactory();
语法结构gs=gsf.newgrammaticstructure(parse);
List tdl=gs.typedDependenciescpProcessed();
系统输出打印LN(tdl);
System.out.println();
TreePrint tp=新的TreePrint(“penn,TypedPendenciesCollapsed”);
打印树(parse);
}
私有ParserDemo(){}//仅限静态方法
}
它与ParserDemo.java基本相同,但当我运行它时,会得到以下结果:

从序列化文件加载解析器 edu/stanford/nlp/models/lexparser/chinesePCFG.ser.gz…完成[2.2] 秒](根(IP) (NP(PN我)) (副总裁(VC)是) (NP) (QP(CD)一名)) (NP(NN)学生))))))

线程“main”java.lang.RuntimeException中的异常:未能 公开 英语语法结构(edu.stanford.nlp.trees.Tree) 在 GrammaticStructureFactory.NewGrammaticStructureFactory(grammaticStructureFactory.java:104) 位于parserdemo.parserdemo.demoAPI(parserdemo.java:65) parserdemo.parserdemo.main(parserdemo.java:23)

第65行的代码是:

 GrammaticalStructure gs = gsf.newGrammaticalStructure(parse);

我的猜测是chinesePCFG.ser.gz遗漏了一些与“edu.stanford.nlp.trees.EnglishGrammaticStructure”相关的内容。由于解析器通过命令行正确解析中文,我自己的代码肯定有问题。我一直在搜索,结果发现很少有类似的情况,其中一些提到使用正确的模型,但我没有真的知道如何将代码修改为“正确的模型”。希望有人能帮助我。我是Java和斯坦福语法分析器的新手,所以请具体点。谢谢!

问题是语法结构工厂是从一个为英语Penn TreebanklanguagePack构建的东南(两处)

并且适当地导入这个

import edu.stanford.nlp.trees.international.pennchinese.ChineseTreebankLanguagePack;
但是,我们通常也建议对中文使用带因数的解析器(因为它的效果要比英文好得多,尽管它会消耗更多的内存和时间)


谢谢!非常好用。另外,谢谢你关于使用分解解析器的建议。我真的学到了很多。
import edu.stanford.nlp.trees.international.pennchinese.ChineseTreebankLanguagePack;
LexicalizedParser lp = LexicalizedParser.loadModel("edu/stanford/nlp/models/lexparser/chineseFactored.ser.gz");