【问题标题】:Running the Stanford NLP Pipeline in stages分阶段运行斯坦福 NLP 流水线
【发布时间】:2019-06-08 12:06:05
【问题描述】:

我正在尝试分多个步骤运行核心管道,以减少昂贵的解析和注释步骤。

我有一组文档,目前我正在使用管道对它们进行标记和句子分解。这很好用,我可以在一定程度上利用这些信息做我需要做的事情。

根据我对标记化句子的处理,有些需要依赖解析,有些需要 NER,有些可以因为不重要而被丢弃。

我可以看到依赖解析器可以接收一个句子的 CoreMap 并将依赖图返回给我。但是在线阅读我发现拥有 POS 标记会改进解析,这当然是有道理的。 NER 也最有可能需要 POS?

对我来说,需要 NER 的句子不需要进行依赖解析。

虽然 POS 标注器似乎无法接收表示标记化句子的 CoreMap。

有没有一种方法可以运行 POS 标记,然后对来自核心管道的标记化句子进行 NER 或依赖解析,仅运行标记化和 ssplit?

【问题讨论】:

标签: java nlp stanford-nlp


【解决方案1】:

对于您的问题,我可以给出两个答案。在通常的 CoreNLP 界面中,您可以设置一个仅包含某些步骤的注释管道,另一个具有后续步骤的注释管道,并且在代码中的不同点通过每个管道传递文本。例如,第一个可以有注释器“tokenize,ssplit,pos”,第二个可以有注释器“ner”。一旦你通过第一个管道传递了Annotation,它就可以通过第二个管道运行:

Annotation ann = new Annotation("this is a sentence");
StanfordCoreNLP stage1 = new StanfordCoreNLP(new Properties(){{
  setProperty("annotators", "tokenize,ssplit,pos");
}});
stage1.annotate(ann);
// <DO OTHER THINGS>
StanfordCoreNLP stage1 = new StanfordCoreNLP(new Properties(){{
  setProperty("annotators", "ner");
  setProperty("enforceRequirements", "true");
}});
stage2.annotate(ann);

我还可以厚颜无耻地插入一个我在业余时间一直在研究的 CoreNLP 包装器:https://github.com/stanfordnlp/CoreNLP/tree/master/src/edu/stanford/nlp/simple。好处之一是它对注释的惰性计算。因此,您可以执行以下操作:

import edu.stanford.nlp.simple.*
Sentence s = new Sentence("this is a sentence");
// Loads the POS tagger, but nothing else
String[] tags = s.posTags();
// <DO OTHER THINGS>
// Now, load the NER tagger
String[] nerTags = s.ners();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    相关资源
    最近更新 更多