在Stanford CoreNLP中使用“关系”注释器来输出预测的关系

时间:2018-08-01 10:07:19

标签: java stanford-nlp

我正在尝试找到一种方法来轻松查看由关系提取器预测的关系。当我使用默认属性文件(即

)中选择的注释器运行它时
annotators = pos, lemma, parse

我在控制台上得到了巨大的输出,该输出可能长达数十万行。我希望有一种方法可以轻松地仅输出所做的预测,而不必编写脚本来解释该输出。

Stanford RE page上说

  

在斯坦福大学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,但现在我得到了一个N​​ullPointerException,如this所示。

它试图使用一个不存在的构造函数的事实并没有给我太大希望,这个函数可以很容易地解决,但是有什么我可以尝试使其工作的呢?还是有其他方法可以输出预测的关系?

0 个答案:

没有答案