Stanford Relation Extractor自定义模型仅选择关系实体的一个标记

时间:2017-02-01 14:33:54

标签: nlp stanford-nlp

我已成功训练了一个Relation Extractor模型,并创建了一个.ser文件。

但是,我遇到的问题是模型成功找到关系,但如果其中一个实体包含多个令牌,则只选择一个令牌。 例如,对于名为 Friend_of 的关系,以及如下的句子:

  

Sam Tarly最好的朋友是Jon Snow。

模型将在以下实体之间找到Friend_of类型的关系:

  • Tarly
  • 乔恩

这导致我的测试将此标记为误报,并将模型整体标记为得分不佳。

我尝试使用相同的训练数据训练自定义NER模型,然后使用此自定义NER模型在我的道具文件中训练RelationExtractor模型以及以下属性:

trainUsePipelineNER=true
ner.model=path/to/custom-ner-model.ser.gz

但这并没有解决问题。

这只是一个训练数据不足的问题,还是我在这里缺少什么?

以下是我用来获取关系的Java代码:

Properties props = new Properties();
props.put("annotators", "tokenize, ssplit, pos, lemma, ner, parse, depparse, relation");
props.put("sup.relation.model", "lib/custom-relation-model-pipeline.ser");
props.put("pos.ptb3Escaping", "false");

StanfordCoreNLP pipeline = new StanfordCoreNLP(props);

List<Relation> foundRelations = new ArrayList<>();

for (String doc : documents) {
    Annotation document = new Annotation(doc);
    pipeline.annotate(document);
    List<CoreMap> sentences = document.get(CoreAnnotations.SentencesAnnotation.class);

    for (CoreMap sentence : sentences) {

        List<RelationMention> relationMentions = sentence.get(MachineReadingAnnotations.RelationMentionsAnnotation.class);

        for (RelationMention relation : relationMentions) {
            foundRelations.add(new Relation(relation.getArg(0).getValue(), relation.getType(), relation.getArg(1).getValue()));
        }

    }
}

谢谢!

西蒙。

3 个答案:

答案 0 :(得分:1)

我想您可能想尝试使用自定义关系培训KBPAnnotator&#34; friend_of&#34;。然后,您可以在管道中使用kbp而不是relation,并且kbp可以更好地支持处理完整提及。完成对模型文件的训练后,可以运行管道,并将-kbp.model设置为保存统计模型的路径。

1。)研究KBPStatisticalExtractor的主要方法,看看如何完成培训。

https://github.com/stanfordnlp/CoreNLP/blob/master/src/edu/stanford/nlp/ie/KBPStatisticalExtractor.java

2.)我认为您需要添加新的&#34; friend_of&#34;与KBPRelationExtractor.java中已知关系列表的关系

https://github.com/stanfordnlp/CoreNLP/blob/master/src/edu/stanford/nlp/ie/KBPRelationExtractor.java

3.)您需要将训练数据放入CoNLL格式。以下是CoNLL培训格式的示例句子。注意如何指定关系的主语和对象,并注意例句的第一行是&#34; per:employee_of&#34;。用空行分隔训练数据中的所有句子。请注意,每列都以制表符分隔。

per:employee_of DEE SUBJECT PERSON - - NNP PERSON compound 2 DEE SUBJECT PERSON - - NNP PERSON compound 2 MYERS SUBJECT PERSON - - NNP PERSON ROOT -1 , - - - - , O punct 2 White - - OBJECT ORGANIZATION NNP LOCATION compound 13 House - - OBJECT ORGANIZATION NNP LOCATION compound 13 Press - - - - NNP O dep 13 Secretary - - - - NNP O dep 13 The - - - - NNP O det 9 first - - - - JJ ORDINAL nsubj 13 is - - - - VBZ O cop 13 the - - - - DT O det 13 US - - - - NNP LOCATION compound 13 interests - - - - NNS O appos 2 in - - - - IN O case 15 Haiti - - - - NNP LOCATION nmod 13 and - - - - CC O cc 13 in - - - - IN O case 19 the - - - - DT O det 19 region - - - - NN O conj 13 . - - - - . O punct 2

如果您对此项目有任何建议或帮助,请告诉我们!

答案 1 :(得分:1)

所以我更多地研究了MachineReading关系提取。

我认为您希望将getValue()替换为getExtentString(),看看是否有帮助。

我使用默认模型运行了一个示例句子:

Joe Smith works at Google.

它运作正常。

答案 2 :(得分:0)

我知道这应该是一个评论,但我还没有能够满足。我也一直试图训练关系提取模型,但还没有成功。您是否有机会愿意分享GitHub回购或更多有关您如何添加新关系的信息?我试图做几乎完全相同的事情,但一直陷入困境。谢谢!