当前位置: 首页 > 面试题库 >

使用Stanford CoreNLP的共指解析

曹德明
2023-03-14
问题内容

我是Stanford CoreNLP工具包的新手,正在尝试将其用于解决新闻文本中的共同引用的项目。为了使用Stanford
CoreNLP共参考系统,我们通常会创建一个管道,该管道需要标记化,句子拆分,词性标记,词缀化,命名实体识别和解析。例如:

Properties props = new Properties();
props.setProperty("annotators", "tokenize, ssplit, pos, lemma, ner, parse, dcoref");
StanfordCoreNLP pipeline = new StanfordCoreNLP(props);

// read some text in the text variable
String text = "As competition heats up in Spain's crowded bank market, Banco Exterior de Espana is seeking to shed its image of a state-owned bank and move into new activities.";

// create an empty Annotation just with the given text
Annotation document = new Annotation(text);

// run all Annotators on this text
pipeline.annotate(document);

然后,我们可以使用以下命令轻松获得句子注释:

List<CoreMap> sentences = document.get(SentencesAnnotation.class);

但是,我使用其他工具进行预处理,只需要一个独立的共指解析系统。创建标记并解析树注释并将它们设置为注释非常容易:

// create new annotation
Annotation annotation = new Annotation();

// create token annotations for each sentence from the input file
List<CoreLabel> tokens = new ArrayList<>();
for(int tokenCount = 0; tokenCount < parsedSentence.size(); tokenCount++) {

        ArrayList<String> parsedLine = parsedSentence.get(tokenCount);
        String word = parsedLine.get(1);
        String lemma = parsedLine.get(2);
        String posTag = parsedLine.get(3);
        String namedEntity = parsedLine.get(4); 
        String partOfParseTree = parsedLine.get(6);

        CoreLabel token = new CoreLabel();
        token.setWord(word);
        token.setWord(lemma);
        token.setTag(posTag);
        token.setNER(namedEntity);
        tokens.add(token);
    }

// set tokens annotations to annotation
annotation.set(TokensAnnotation.class, tokens);

// set parse tree annotations to annotation
Tree stanfordParseTree = Tree.valueOf(inputParseTree);
annotation.set(TreeAnnotation.class, stanfordParseTree);

但是,创建句子注释非常棘手,因为据我所知,没有文档可以对其进行详细说明。我能够为句子注释创建数据结构并将其设置为注释:

List<CoreMap> sentences = new ArrayList<CoreMap>();
annotation.set(SentencesAnnotation.class, sentences);

我敢肯定这不会那么困难,但是没有文档说明如何从标记注释创建句子注释,即如何用实际的句子注释填充ArrayList。

有任何想法吗?

顺便说一句,如果我使用处理工具提供的标记和语法分析树注释,并且仅使用StanfordCoreNLP管道提供的句子注释并应用StanfordCoreNLP独立的共指解析系统,我将获得正确的结果。因此,完整的独立共指解析系统唯一缺少的部分是能够从标记注释中创建句子注释。


问题答案:

如果您有已标记化的句子列表,则有一个带参数的Annotation
构造List<CoreMap> sentences函数可设置文档。

您要为每个句子创建一个CoreMap对象,如下所示。(请注意,我还分别向每个句子和标记对象添加了一个句子和标记索引。)

int sentenceIdx = 1;
List<CoreMap> sentences = new ArrayList<CoreMap>();
for (parsedSentence : parsedSentences) {
    CoreMap sentence = new CoreLabel();
    List<CoreLabel> tokens = new ArrayList<>();
    for(int tokenCount = 0; tokenCount < parsedSentence.size(); tokenCount++) {

        ArrayList<String> parsedLine = parsedSentence.get(tokenCount);
        String word = parsedLine.get(1);
        String lemma = parsedLine.get(2);
        String posTag = parsedLine.get(3);
        String namedEntity = parsedLine.get(4); 
        String partOfParseTree = parsedLine.get(6);

        CoreLabel token = new CoreLabel();
        token.setWord(word);
        token.setLemma(lemma);
        token.setTag(posTag);
        token.setNER(namedEntity);
        token.setIndex(tokenCount + 1);
        tokens.add(token);
    }

    // set tokens annotations and id of sentence 
    sentence.set(TokensAnnotation.class, tokens);
    sentence.set(SentenceIndexAnnotation.class, sentenceIdx++);

    // set parse tree annotations to annotation
    Tree stanfordParseTree = Tree.valueOf(inputParseTree);
    sentence.set(TreeAnnotation.class, stanfordParseTree);

    // add sentence to list of sentences
    sentences.add(sentence);
}

然后,您可以Annotation使用sentences列表创建一个实例:

Annotation annotation = new Annotation(sentences);


 类似资料:
  • 假设我有+10000个句子,我想像这个例子一样分析。有可能并行处理这些和多线程吗?

  • 如果我使用TokenizerNotator、WordsToSentencesAnnotator、POSTaggerAnnotator和sutime创建一个AnnotationPipeline,我会将TimexAnnotations附加到生成的注释上。 但是,如果我创建一个StanfordCoreNLP管道,并将“annotators”属性设置为“tokenize,ssplit,pos,lemma,

  • 我已经尝试使用斯坦福CorenLP。但是,我似乎无法启动解析器。我已经使用Eclipse在我的项目中导入了所有包含的JAR,并为JVM(-xmx3g)分配了3GB。 错误很尴尬: 线程“main”java.lang.NosuchMethoderror:edu.stanford.nlp.parser.lexparser.lexicalizedParser.loadModel(ljava/lang/s

  • 本文向大家介绍解析C++中指向对象的指针使用,包括了解析C++中指向对象的指针使用的使用技巧和注意事项,需要的朋友参考一下 C++指向对象的常指针 将指针变量声明为const型,这样指针值始终保持为其初值,不能改变。 如: 定义指向对象的常指针的一般形式为: 也可以在定义指针变量时使之初始化,如将上面第2, 3行合并为: 请注意,指向对象的常指针变量的值不能改变,即始终指向同一个对象,但可以改变其

  • 我试图创建一个Pig UDF,它使用通过sista Scala API接口的Stanford CoreNLP包提取tweet中提到的位置。它在本地使用“SBT run”运行时工作良好,但在从PIG调用时抛出“java.lang.NosuchMethodError”异常: 从标签器edu/stanford/nlp/models/pos-tagger/english-left3words/englis

  • 我正在尝试使用MapReduce处理大量文档,其想法是在mapper中将文件拆分为文档,并在reducer阶段应用stanford coreNLP注释器。 我有一个相当简单(标准)的“tokenize、ssplit、pos、lemma、ner”管道,reducer只调用一个函数,将这些注释器应用于reducer传递的值,并返回注释(作为字符串列表),但生成的输出是垃圾。 我已经观察到,如果我从映射