我正在尝试找到一种方法来轻松查看由关系提取器预测的关系。当我使用默认属性文件(即
)中选择的注释器运行它时annotators = pos, lemma, parse
我在控制台上得到了巨大的输出,该输出可能长达数十万行。我希望有一种方法可以轻松地仅输出所做的预测,而不必编写脚本来解释该输出。
在斯坦福大学CoreNLP管道中使用注释器“关系”, 结果保存在注释中 MachineReadingAnnotations.RelationMentionsAnnotation.class
这听起来像是解决我的问题的可能方法,但是当我尝试使用关系注释器运行CoreNLP Relation Extractor时遇到了问题。根据{{3}}上列出的依赖关系,我的属性文件中的注释符为:
annotators = tokenize, ssplit, pos, lemma, ner, depparse, relation
使用来自this page的示例Roth和Yih数据以及最新下载的CoreNLP 3.9.1副本,我正在CoreNLP目录中运行以下命令:
java -Xmx4g -cp "*" edu.stanford.nlp.ie.machinereading.MachineReading --add-modules java.se.ee -arguments relationship-extractor.properties
这将导致NoSuchMethodException。具体来说,输出看起来像Stanford RE page。因此,似乎正在尝试将RothEntityExtractor类的构造函数与作为参数传入的字符串一起使用。
检查RothEntityExtractor类表明,实际上没有构造函数将字符串作为参数,或者根本没有任何参数。只有一个看起来像这样的构造函数:
public RothEntityExtractor() {
super(null, USE_SUB_TYPES, null, true, new EntityMentionFactory(), true);
entityTagForNer = new HashMap<>();
// entityTagForNer.put("person", "Peop");
// entityTagForNer.put("organization", "Org");
// entityTagForNer.put("location", "Loc");
entityTagForNer.put("person", "PEOPLE");
entityTagForNer.put("organization", "ORGANIZATION");
entityTagForNer.put("location", "LOCATION");
}
这与下载中的内容完全一样,注释掉的行就是这样。
为解决该问题,我尝试了一个非常棘手的解决方案,添加了第二个构造函数,该构造函数执行的操作完全相同,但是该构造函数将字符串作为参数(对此不执行任何操作)。
这似乎使我摆脱了NoSuchMethodException,但现在我得到了一个NullPointerException,如this所示。
它试图使用一个不存在的构造函数的事实并没有给我太大希望,这个函数可以很容易地解决,但是有什么我可以尝试使其工作的呢?还是有其他方法可以输出预测的关系?