我尝试在多个步骤中运行核心流水线,以减少昂贵的解析和注释步骤。
我有一个文档集合,目前我正在使用管道对它们进行标记化和断句。这很有效,在一定程度上,我可以用这些信息做我需要做的事情。
根据我对标记化句子的处理,一些需要依赖解析,一些需要NER,一些可以作为无关紧要的句子丢弃。
我可以看到,依存关系解析器可以接受句子的CoreMap,并返回依存关系图。但是通过在线阅读,我发现使用POS标签可以提高解析效率,这当然是有意义的。NER最有可能也需要POS?
对于我来说,需要NER的句子不需要被依赖关系解析。
但是,词性标记器似乎不能接受表示标记化句子的CoreMap。
有没有一种方法,我可以运行POS标签,然后对核心流水线中的标记化句子运行NER或依存关系解析,只运行tokenize和ssplit?
发布于 2015-08-25 17:42:15
对于你的问题,我可以给出两个答案。在通常的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();https://stackoverflow.com/questions/32103302
复制相似问题