为什么我没有完全依赖

时间:2016-03-27 04:13:50

标签: stanford-nlp

我尝试了依赖解析器的在线演示和下载版本。在线演示的增强依赖关系能够获得准确的结果。例如,“你能推荐我一部由詹姆斯卡梅隆和莱昂纳多迪卡普里奥执导的电影吗?”生成如下结果:

root(ROOT-0,推荐-3) aux(推荐-3,Can-1) nsubj(推荐-3,你-2) nsubj(movie-6,me-4) det(movie-6,a-5) xcomp(推荐-3,电影-6) nsubjpass(定向-9,其中-7) nsubjpass(行动-14,其中-7)(额外) auxpass(定向-9,是-8) acl:relcl(movie-6,directed-9) 案例(Cameron-12,by-10) 化合物(Cameron-12,James-11) nmod:代理人(指导9,Cameron-12) cc(指示9和-13) acl:relcl(movie-6,act-14)(额外) conj:和(指示9,行动-14) 案例(DiCaprio-17,by-15) 化合物(DiCaprio-17,Leonardo-16) nmod:by(actted-14,DiCaprio-17)

虽然两个动词“指示”和“行动”被几个单词分开,但在线演示能够识别出他们都指的是名词“电影”(acl:relcl(movie-6,direct-) 9),acl:relcl(movie-6,act-14)(extra))。

但是,下面是我从斯坦福大学网站下载的jar文件的结果。 CoreNLP版本是3.6.0:

root(ROOT-0,推荐-3) aux(推荐-3,Can-1) nsubj(推荐-3,你-2) nsubj(movie-7,me-4) det(movie-7,a-5) amod(movie-7,romantic-6) dobj(推荐-3,电影-7) nsubjpass(direct-10,movie-7) ref(movie-7,-8) auxpass(定向-10,是-9) acl:relcl(movie-7,directed-10) 案件(Cameron-13,by-11) 化合物(Cameron-13,James-12) nmod:agent(指导-10,Cameron-13) cc(Cameron-13,和-14) nmod:agent(direct-10,actted-15) conj:和(Cameron-13,演员-15) 案件(DiCaprio-18,by-16) 化合物(DiCaprio-18,Leonardo-17) nmod:by(acted-15,DiCaprio-18) punct(推荐-3,? - 19)

在这种情况下,解析器无法获得依赖项acl:relcl(movie-6,act-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”设置为“MAXIMAL”我应该能够 获得与在线演示相同的结果。我错过了什么,我应该如何正确配置 注释者?非常感谢

1 个答案:

答案 0 :(得分:0)

此代码应与在线演示更紧密地匹配。您想使用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);
        }
    }
}