StanfordNLP-ArrayIndexOutOfBoundsException в TokensRegexNERAnnotator.readEntries(TokensRegexNERAnnotator.java:696)




corenlp ner tags (2)

Вы должны использовать TokensRegexAnnotator, а не TokensRegexNERAnnotator.

Вы должны просмотреть эти темы для получения дополнительной информации:

Правила TokensRegex для получения правильного вывода для именных объектов

Получение вывода в желаемом формате с использованием TokenRegex

Я хочу идентифицировать следующий как SKILL, используя TokensRegexNERAnnotator от stanfordNLP.

AREAS OF EXPERTISE Areas of Knowledge Computer Skills Technical Experience Technical Skills

Существует гораздо больше последовательности текста, как указано выше.

Код -

    Properties props = new Properties();
    props.put("annotators", "tokenize, ssplit, pos, lemma, ner");
    StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
    pipeline.addAnnotator(new TokensRegexNERAnnotator("./mapping/test_degree.rule", true));
    String[] tests = {"Bachelor of Arts is a good degree.", "Technical Skill is a must have for Software Developer."};
    List tokens = new ArrayList<>();

    // traversing each sentence from array of sentence.
    for (String txt : tests) {
         System.out.println("String is : " + txt);

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

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

         /* Next we can go over the annotated sentences and extract the annotated words,
         Using the CoreLabel Object */
      for (CoreMap sentence : sentences) {
         for (CoreLabel token : sentence.get(TokensAnnotation.class)) {
             System.out.println("annotated coreMap sentences : " + token);
             // Extracting NER tag for current token
             String ne = token.get(NamedEntityTagAnnotation.class);
             String word = token.get(CoreAnnotations.TextAnnotation.class);
             System.out.println("Current Word : " + word + " POS :" + token.get(PartOfSpeechAnnotation.class));
             System.out.println("Lemma : " + token.get(LemmaAnnotation.class));
             System.out.println("Named Entity : " + ne);
    }
  }

Мой файл правил регулярного выражения -

$ SKILL_FIRST_KEYWORD = "/ область / | / областей / | / technical / | / computer / | / professional /" $ SKILL_KEYWORD = "/ knowledge / | / skill / | / skills / | / experience / | / experience /"

tokens = {type: "CLASS", value: "edu.stanford.nlp.ling.CoreAnnotations $ TokensAnnotation"}

{ruleType: "tokens", pattern: ($ SKILL_FIRST_KEYWORD + $ SKILL_KEYWORD), результат: "SKILL"}

Я получаю ошибку ArrayIndexOutOfBoundsException . Я думаю, что что-то не так с моим файлом правила. Может кто-нибудь, пожалуйста, укажите мне, где я делаю ошибку?

Желаемый результат -

ОБЛАСТИ ЭКСПЕРТИЗЫ - НАВЫКИ

Области знаний - НАВЫКИ

Компьютерные навыки - НАВЫК

и так далее.

Заранее спасибо.


Выше принятый ответ @StanfordNLPHelp помог мне решить эту проблему. Весь кредит идет к нему.

Я просто завершаю, как будет выглядеть конечный код, чтобы получить результат в нужном формате в надежде, что он поможет кому-то.

Сначала я изменил файл правила

$SKILL_FIRST_KEYWORD = "/area of|areas of|Technical|computer|professional/" $SKILL_KEYWORD = "/knowledge|skill|skills|expertise|experience/"

Затем в коде

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

for (String txt : tests) {
     System.out.println("String is : " + txt);

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

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

     Env env = TokenSequencePattern.getNewEnv();
     env.setDefaultStringMatchFlags(NodePattern.CASE_INSENSITIVE);
     env.setDefaultStringPatternFlags(Pattern.CASE_INSENSITIVE);

     CoreMapExpressionExtractor extractor = CoreMapExpressionExtractor.createExtractorFromFiles(env, "test_degree.rules");
     for (CoreMap sentence : sentences) {
         List<MatchedExpression> matched = extractor.extractExpressions(sentence);
         for(MatchedExpression phrase : matched){
             // Print out matched text and value
             System.out.println("MATCHED ENTITY: " + phrase.getText() + " VALUE: " + phrase.getValue().get());
         }
    }
}