#java #stanford-nlp
#java #stanford-nlp
Вопрос:
Как правильно использовать конвейер Stanford NLP для двухфазного аннотирования?
На первом этапе мне нужна только токенизация и разделение предложений, поэтому я использую этот код:
private Annotation annotatedDocument = null;
private StanfordCoreNLP pipeline = null;
...
public void firstPhase() {
Properties props = new Properties();
props.setProperty("annotators", "tokenize, ssplit");
pipeline = new StanfordCoreNLP(props);
annotatedDocument = new Annotation(textDocument);
}
Вторая фаза необязательна, поэтому я не использую all annotator на первой фазе. Код второй фазы:
public void secondPhase() {
POSTaggerAnnotator posTaggerAnot = new POSTaggerAnnotator();
posAnot.annotate(annotatedDocument);
// Lemmatization
MorphaAnnotator morphaAnot = new MorphaAnnotator();
morphaAnot.annotate(annotatedDocument);
}
Первый вопрос: является ли этот подход правильным с использованием «автономных» аннотаторов на втором этапе? Или есть способ использовать существующий конвейер?
Второй вопрос: у меня проблема с аннотатором корреляций. Я хотел бы использовать его на втором этапе следующим образом:
CorefAnnotator coref = new CorefAnnotator(new Properties());
Но этот конструктор, похоже, никогда не заканчивается. Конструктора без свойств не существует, верно? Необходима ли какая-то настройка свойств?
Ответ №1:
Есть [как минимум] 3 способа, которыми вы можете это сделать:
-
Так, как вы описали. Вполне допустимо просто вызывать отдельные аннотаторы и объединять их в цепочку. Аннотатор coref должен работать с пустыми свойствами — возможно, вам нужно больше памяти? Загружается немного медленно, а модели не маленькие.
-
Если вы хотите продолжать использовать конвейер, вы можете создать частичный конвейер и задать свойство
enforceRequirements=false
. Это выполнит цепочку аннотаторов за вас, но не требует выполнения их требований — т. Е., если вы знаете, что некоторые аннотации уже есть, вам не нужно повторно запускать соответствующие им аннотаторы. -
Это большее изменение, но simple api на самом деле выполняет такого рода отложенную оценку автоматически. Итак, вы можете просто создать
Document
объект, и когда вы запрашиваете различные аннотации, он будет лениво их вводить.
Комментарии:
1. Вы правы, проблема с аннотатором Coref — java.lang. Исключение OutOfMemmoryError.