扩展Stanford CoreNLP的SentenceAnnotator时重写方法遇问题
解决Stanford CoreNLP SentenceAnnotator扩展中重写方法的问题
嘿,我明白扩展SentenceAnnotator时卡在requires()和requirementsSatisfied()这两个方法上的烦恼——这俩是CoreNLP流水线管理依赖的关键,搞清楚它们的作用和正确写法就好办了!
先给你理清楚这两个方法的核心职责:
requires():告诉CoreNLP,你的注解器运行前必须已经存在哪些注解(也就是依赖的前置处理结果)。比如如果你的逻辑需要先有分词后的单词列表,就得在这里返回对应的注解类型。requirementsSatisfied():告诉CoreNLP,你的注解器运行后会生成哪些新的注解,方便后续注解器依赖这些结果。
正确的方法重写示例
下面是无依赖、不生成新注解的基础写法(也是大多数示例里的标准写法),注意避免旧的Collections.EMPTY_SET,改用类型安全的Collections.emptySet():
import java.util.Collections; import java.util.Set; import edu.stanford.nlp.pipeline.SentenceAnnotator; import edu.stanford.nlp.ling.CoreAnnotation; // 你的自定义注解器类 public class CustomSentenceAnnotator extends SentenceAnnotator { @Override public Set<Class<? extends CoreAnnotation>> requires() { // 情况1:无任何前置依赖,返回空集合 return Collections.emptySet(); // 情况2:依赖分词后的单词注解(示例) // return Collections.singleton(WordsAnnotation.class); } @Override public Set<Class<? extends CoreAnnotation>> requirementsSatisfied() { // 情况1:不生成新注解,返回空集合 return Collections.emptySet(); // 情况2:生成自定义的句子级注解(示例) // return Collections.singleton(MyCustomSentenceAnnotation.class); } // 别忘了重写doAnnotate()方法实现你的核心逻辑 @Override protected void doAnnotate(Annotation annotation) { // 你的注解处理逻辑 } }
常见问题解决
泛型警告问题:如果用旧的
Collections.EMPTY_SET,编译器会报泛型不匹配的警告。解决方法就是用Collections.emptySet(),或者显式指定泛型:return Collections.<Class<? extends CoreAnnotation>>emptySet();自定义注解的处理:如果你的注解器要生成新注解,得先定义一个继承自
CoreAnnotation的注解类,比如:import edu.stanford.nlp.ling.CoreAnnotation; import java.util.Map; public class SentenceKeywordAnnotation implements CoreAnnotation<Map<String, Integer>> { @Override public Class<Map<String, Integer>> getType() { return (Class<Map<String, Integer>>) (Class<?>) Map.class; } }然后把这个类放到
requirementsSatisfied()的返回集合里,CoreNLP就会识别到你的注解器提供了这个新注解。依赖前置注解:如果你的逻辑需要用到其他注解器的结果,比如词性标注、句法分析,就在
requires()里返回对应的注解类型,比如PartOfSpeechAnnotation.class或者TreeAnnotation.class,CoreNLP会确保这些注解在你的注解器运行前已经被处理好。
内容的提问来源于stack exchange,提问作者Yash Pandya
相关产品推荐
相关产品推荐

