StanfordNLP для обнаружения сложных сущностей с предлогами - PullRequest
3 голосов
/ 16 января 2020

В основном, в предложении:

<Lord of the bracelets> is a fantasy movie.

Я хотел бы обнаружить соединение Lord of the bracelets как одну сущность (которая также может быть связана в аннотаторе entitylink). Это означает обнаружение структур с помощью POS-тегов такой формы, как NNP DT NNP или NN IN DT NNP.

Возможно ли это с помощью CoreNLP?

Моя текущая настройка не обнаруживает их, и я не смог найти способ сделать это.


  public NamedEntityRecognition() {
    Properties props = new Properties();
    props.setProperty("annotators", "tokenize,ssplit,pos,lemma,ner,entitylink");
    props.setProperty("tokenize.options", "untokenizable=noneDelete");

    pipeline = new StanfordCoreNLP(props);
  }


  public CoreDocument recogniseEntities(String text) {
    CoreDocument doc = new CoreDocument(text);
    pipeline.annotate(doc);
    return doc;
  }

Спасибо!

Ответы [ 2 ]

1 голос
/ 21 января 2020

Вы можете сделать это с TokensRegex, (возможно, RegexNER, хотя я так не думаю). Вы можете указать в правиле, что хотите пометить определенные шаблоны тегов части речи как сущность.

Полное описание TokensRegex приведено здесь:

https://stanfordnlp.github.io/CoreNLP/tokensregex.html

0 голосов
/ 11 февраля 2020

Хотя ответ @ StanfordNLPHelp оказался полезным, я подумал, что хотел бы добавить еще несколько деталей в мое окончательное решение.

Вариант 1:

Добавить TokensRegex аннотатор , как указано в предыдущем ответе. Это добавляет в конвейер более настраиваемый аннотатор, и вы можете указать свои собственные правила в текстовом файле.

Вот как выглядит мой файл правил (extended_ner.rules):

# these Java classes will be used by the rules
ner = { type: "CLASS", value: "edu.stanford.nlp.ling.CoreAnnotations$NamedEntityTagAnnotation" }
tokens = { type: "CLASS", value: "edu.stanford.nlp.ling.CoreAnnotations$TokensAnnotation" }

# rule for recognizing compound names
{ ruleType: "tokens", pattern: ([{tag:"NN"}] [{tag:"IN"}] [{tag:"DT"}] [{tag:"NNP"}]), action: Annotate($0, ner, "COMPOUND"), result: "COMPOUND_RESULT" }

Вы можете увидеть разбивку правил синтаксиса здесь .

Примечание: После аннотатора NER необходимо добавить аннотатор TokensRegex . В противном случае результаты будут перезаписаны.

Вот как будет выглядеть код Java:

 public NamedEntityRecognition() {
    Properties props = new Properties();
    props.setProperty("annotators", "tokenize,ssplit,pos,lemma,ner,tokensregex,entitylink");
    props.setProperty("tokensregex.rules", "extended_ner.rules");
    props.setProperty("tokenize.options", "untokenizable=noneDelete");

    pipeline = new StanfordCoreNLP(props);
  }

Вариант 2 (выбранный)

Вместо добавления другой аннотатор, файл правил может быть отправлен нер аннотатору через свойство de "ner.additional.tokensregex.rules". Здесь - документы.

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

Файл правил точно такой же, как в варианте 1, код java теперь выглядит так:

 public NamedEntityRecognition() {
    Properties props = new Properties();
    props.setProperty("annotators", "tokenize,ssplit,pos,lemma,ner,entitylink");
    props.setProperty("ner.additional.tokensregex.rules", "extended_ner.rules");

    props.setProperty("tokenize.options", "untokenizable=noneDelete");

    pipeline = new StanfordCoreNLP(props);
  }

Примечание: Чтобы это работало, свойство "ner.applyFineGrained" должно быть истинным (значение по умолчанию ).

...