Трубопровод Stanford Core NLP - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь создать конвейер с пометкой NER.

Как получить пометки NER таким образом?

Строка, вызывающая ошибку: String nerrr = token.ner();

Код:

public class NLPpipeline {

public AnnotationPipeline buildPipeline() {

    Properties props = new Properties();
    AnnotationPipeline pl = new AnnotationPipeline();

    pl.addAnnotator( new TokenizerAnnotator( false ) );
    pl.addAnnotator( new WordsToSentencesAnnotator( false ) );
    pl.addAnnotator( new POSTaggerAnnotator( false ) );
    pl.addAnnotator( new MorphaAnnotator( false ) );
    pl.addAnnotator(new TimeAnnotator("sutime", props));


    return pl;
}


public static void main(String[] args) {


    NLPpipeline nlp = new NLPpipeline();
    AnnotationPipeline pipeline = nlp.buildPipeline();
    Annotation annotation = new Annotation( "Last summer, Sali and Nadav met every Tuesday afternoon, from 1:00 pm to 3:00 pm." );
    pipeline.annotate( annotation );


    for (CoreMap sentence : sentences) {
        for (CoreLabel token : sentence.get( CoreAnnotations.TokensAnnotation.class )) {

            String word = token.word();
            String pos = token.tag();
            String nerrr = token.ner();
            String role = token.lemma();


            System.out.println( "=====\n" + word );
            System.out.println( pos );
            System.out.println( nerrr );
            System.out.println( role );
        }
    }
}

Большое спасибо за ваш ответ. Я попытался создать канал, как вы описали, но он очень медленный, потому что у меня длинный текст, и мне нужно разделить его на предложения, и каждый раз, когда он загружает файлы NER, на каждое предложение уходит около 45 секунд. Мой проект преобразовывает пользовательские истории в тестовые случаи, и мне нужно идентифицировать объекты в пользовательских историях. Я понял, что у меня была возможность создать отдел однажды: SentimentAnalyzer sentimentAnalyzer = новый SentimentAnalyzer (); sentimentAnalyzer.initializeCoreNLP (); // запустить это только один раз И отправляю за раз, но я не понимаю, как мне это сделать

1 Ответ

0 голосов
/ 15 мая 2018

Вы не включили NERAnnotator в свой AnnotationPipeline. В общем, я рекомендую создавать конвейер с Properties, а не явно из классов аннотаторов. Это имеет ряд преимуществ:

  1. Вы получаете кеширование аннотатора бесплатно; будущие аннотаторы с теми же наборами свойств не нужно перезагружать.
  2. Вы получаете разумные значения по умолчанию для большинства свойств аннотатора.
  3. Вы можете, если хотите, сохранить файл свойств как файл ресурсов независимо от кода.
  4. Вы все еще можете настроить аннотаторы, установив соответствующие свойства.

В вашем случае вы должны выполнить:

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

Annotation annotation = new Annotation( "Last summer, Sali and Nadav met every Tuesday afternoon, from 1:00 pm to 3:00 pm." );
pipeline.annotate( annotation );

...

См. официальную документацию для получения дополнительной информации.

Также вы можете попробовать Simple API :

Document doc = new Document("Last summer, Sali and Nadav met every Tuesday afternoon, from 1:00 pm to 3:00 pm.")
doc.sentence(0).ner(3);  // returns 'PERSON'
doc.sentence(0).nerTags();  // returns [O, O, O, PERSON, O, PERSON, ...]

Или, если вы знаете, что вы вводите одно предложение, просто:

Sentence sent = new Document("Last summer, Sali and Nadav met every Tuesday afternoon, from 1:00 pm to 3:00 pm.")
    sent.ner(3);  // returns 'PERSON'
...