Разрешение по 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);