我尝试了在线演示和下载版本的依赖解析器。在线演示的增强依赖能够得到准确的结果。例如,“你能给我推荐一部由詹姆斯·卡梅隆和莱昂纳多·DiCaprio执导的电影吗?”产生的结果如下:
根(根-0,推荐-3)辅助(推荐-3,可以-1) nsubj (推荐-3,你-2) nsubj (电影-6,me-4 )(电影-6,a-5 ) det (推荐-3,电影-6) nsubjpass (导演-9,其中-7) nsubjpass (执行-14,其中-7)(额外)辅助传递(导演-9,是-8) acl:relcl (电影-6,导演-9)案例( Cameron-12,by-10 )复合( Cameron-12,詹姆斯-11)nmod:特工(导演-9,卡梅隆-12) cc (导演-9,-13) acl:relcl (电影-6,表演-14)(额外)conj:和(导演-9,代理-14)案件( DiCaprio-17,by-15 )化合物( DiCaprio-17,Leonardo-16 ) nmod:by (代理-14,DiCaprio-17 )
虽然两个动词“直接”和“行为”是用几个单词分开的,但在线演示能够识别它们都是指名词“电影”(acl:relcl (电影-6,导演-9 ),acl:relcl (电影-6,表演-14)(额外))。
然而,下面是我从斯坦福网站下载的jar文件的结果。CoreNLP版本为3.6.0:
根(ROOT-0,推荐-3)辅助(推荐-3,Can-1) nsubj(推荐-3,you-2) nsubj(电影-7,me-4) det(电影-7,a-5) amod(电影-7,浪漫-6)dobj(推荐-3,电影-7)nsubjpass(导演-10,电影-7)参考(电影-7,其中-8)辅助通行证(导演-10,是acl:relcl(电影-7,导演-10)案例(Cameron-13,by-11)复合(Cameron-13,by-11)詹姆斯-12)nmod:特工(导演-10,卡梅隆-13)cc(卡梅隆-13,-14)nmod:特工(指示-10,行动-15)conj:和(Cameron-13,代理-15)案件(DiCaprio-18,by-16)化合物(DiCaprio-18,Leonardo-17) nmod:by(执行-15,DiCaprio-18) t(建议-3,-19)
在这种情况下,解析器无法获得依赖acl:relcl (file-6,action-14)(额外)。
这是我的构造函数代码:
public CoreNlpParser() {
props = new Properties();
props.put("annotators", "tokenize, ssplit, pos, parse, lemma, depparse, ner");
props.setProperty("depparse.extradependencies", "MAXIMAL");
pipeline = new StanfordCoreNLP(props);
}我认为,通过将"depparse.extradependencies“设置为”最大“,我应该能够获得与在线演示程序相同的结果。我所缺少的是什么,我应该如何正确配置注释器?非常感谢
发布于 2016-03-27 05:31:34
这段代码应该更接近在线演示。您希望使用PCFG解析器,而不是NN依赖解析器。
import java.io.*;
import java.util.*;
import java.util.Properties;
import java.util.zip.*;
import edu.stanford.nlp.io.IOUtils;
import edu.stanford.nlp.ling.*;
import edu.stanford.nlp.pipeline.*;
import edu.stanford.nlp.semgraph.*;
import edu.stanford.nlp.trees.*;
import edu.stanford.nlp.util.*;
public class EnhancedDependenciesDemo {
public static void main (String[] args) {
Properties props = StringUtils.argsToProperties(args);
StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
Annotation ann = new Annotation("Can you recommend me a movie " +
"which was directed by James Cameron and acted by Leonardo DiCaprio?");
pipeline.annotate(ann);
for (CoreMap sentence : ann.get(CoreAnnotations.SentencesAnnotation.class)) {
Tree tree = sentence.get(TreeCoreAnnotations.TreeAnnotation.class);
TreePrint treePrint = new TreePrint("typedDependenciesCollapsed");
treePrint.printTree(tree);
}
}
}https://stackoverflow.com/questions/36243749
复制相似问题