Конвейер Stanford NLP – последовательная обработка (на Java)

#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 способа, которыми вы можете это сделать:

  1. Так, как вы описали. Вполне допустимо просто вызывать отдельные аннотаторы и объединять их в цепочку. Аннотатор coref должен работать с пустыми свойствами — возможно, вам нужно больше памяти? Загружается немного медленно, а модели не маленькие.

  2. Если вы хотите продолжать использовать конвейер, вы можете создать частичный конвейер и задать свойство enforceRequirements=false . Это выполнит цепочку аннотаторов за вас, но не требует выполнения их требований — т. Е., если вы знаете, что некоторые аннотации уже есть, вам не нужно повторно запускать соответствующие им аннотаторы.

  3. Это большее изменение, но simple api на самом деле выполняет такого рода отложенную оценку автоматически. Итак, вы можете просто создать Document объект, и когда вы запрашиваете различные аннотации, он будет лениво их вводить.

Комментарии:

1. Вы правы, проблема с аннотатором Coref — java.lang. Исключение OutOfMemmoryError.