Разрешение по Coreference с использованием Stanford CoreNLP

Я новичок в наборе инструментов Stanford CoreNLP и пытаюсь использовать его для проекта по разрешению ссылок в новостных текстах. Чтобы использовать систему основ Stanford CoreNLP, мы обычно создаем конвейер, который требует токенизации, разделения предложений, тегов части речи, леммаризации, распознавания именованных объектов и анализа. Например:

Properties props = new Properties();
props.setProperty("annotators", "tokenize, ssplit, pos, lemma, ner, parse, dcoref");
StanfordCoreNLP pipeline = new StanfordCoreNLP(props);

// read some text in the text variable
String text = "As competition heats up in Spain's crowded bank market, Banco Exterior de Espana is seeking to shed its image of a state-owned bank and move into new activities.";

// create an empty Annotation just with the given text
Annotation document = new Annotation(text);

// run all Annotators on this text
pipeline.annotate(document);

Тогда мы можем легко получить аннотации предложений с помощью:

List<CoreMap> sentences = document.get(SentencesAnnotation.class);

Тем не менее, я использую другие инструменты для предварительной обработки и мне просто нужна отдельная система разрешения привязки. Довольно просто создать токены и проанализировать аннотации к дереву и установить для них аннотацию:

// create new annotation
Annotation annotation = new Annotation();

// create token annotations for each sentence from the input file
List<CoreLabel> tokens = new ArrayList<>();
for(int tokenCount = 0; tokenCount < parsedSentence.size(); tokenCount++) {

        ArrayList<String> parsedLine = parsedSentence.get(tokenCount);
        String word = parsedLine.get(1);
        String lemma = parsedLine.get(2);
        String posTag = parsedLine.get(3);
        String namedEntity = parsedLine.get(4); 
        String partOfParseTree = parsedLine.get(6);

        CoreLabel token = new CoreLabel();
        token.setWord(word);
        token.setWord(lemma);
        token.setTag(posTag);
        token.setNER(namedEntity);
        tokens.add(token);
    }

// set tokens annotations to annotation
annotation.set(TokensAnnotation.class, tokens);

// set parse tree annotations to annotation
Tree stanfordParseTree = Tree.valueOf(inputParseTree);
annotation.set(TreeAnnotation.class, stanfordParseTree);

Тем не менее, создание аннотаций предложений довольно сложно, потому что, насколько мне известно, нет документа, который объяснил бы его в деталях. Я могу создать структуру данных для аннотаций предложений и установить для нее аннотацию:

List<CoreMap> sentences = new ArrayList<CoreMap>();
annotation.set(SentencesAnnotation.class, sentences);

Я уверен, что это не может быть так сложно, но нет документации о том, как создать аннотацию предложения из аннотаций токенов, то есть, как заполнить ArrayList реальными аннотациями предложений.

Есть идеи?

Кстати, если я использую токены и аннотации к дереву аннотаций, предоставленные моими инструментами обработки, и использую только аннотации предложений, предоставленные конвейером StanfordCoreNLP, и применяю автономную систему разрешения разногласий StanfordCoreNLP, я получаю правильные результаты. Таким образом, единственная часть, отсутствующая в полной автономной системе разрешения привязок, - это возможность создавать аннотации предложений из аннотаций токенов.

1 ответ

Решение

E сть Annotation конструктор с List<CoreMap> sentences аргумент, который устанавливает документ, если у вас есть список уже токенизированных предложений.

Для каждого предложения вы хотите создать CoreMap Объект как следующий. (Обратите внимание, что я также добавил предложение и индекс токена для каждого предложения и объекта токена, соответственно.)

int sentenceIdx = 1;
List<CoreMap> sentences = new ArrayList<CoreMap>();
for (parsedSentence : parsedSentences) {
    CoreMap sentence = new CoreLabel();
    List<CoreLabel> tokens = new ArrayList<>();
    for(int tokenCount = 0; tokenCount < parsedSentence.size(); tokenCount++) {

        ArrayList<String> parsedLine = parsedSentence.get(tokenCount);
        String word = parsedLine.get(1);
        String lemma = parsedLine.get(2);
        String posTag = parsedLine.get(3);
        String namedEntity = parsedLine.get(4); 
        String partOfParseTree = parsedLine.get(6);

        CoreLabel token = new CoreLabel();
        token.setWord(word);
        token.setLemma(lemma);
        token.setTag(posTag);
        token.setNER(namedEntity);
        token.setIndex(tokenCount + 1);
        tokens.add(token);
    }

    // set tokens annotations and id of sentence 
    sentence.set(TokensAnnotation.class, tokens);
    sentence.set(SentenceIndexAnnotation.class, sentenceIdx++);

    // set parse tree annotations to annotation
    Tree stanfordParseTree = Tree.valueOf(inputParseTree);
    sentence.set(TreeAnnotation.class, stanfordParseTree);

    // add sentence to list of sentences
    sentences.add(sentence);
}

Тогда вы можете создать Annotation экземпляр с sentences список:

Annotation annotation = new Annotation(sentences);
Другие вопросы по тегам