Могу ли я получить entityMention из результата совпадения TokensRegex в Stanford CoreNLP? - PullRequest
0 голосов
/ 21 сентября 2018

Я хочу добавить адреса (и, возможно, другие объекты, основанные на правилах) в конвейер NER, и регулярное выражение Tokens кажется очень полезным DSL для этого.После https://stackoverflow.com/a/42604225, я создал этот файл правил:

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

{ pattern: ([{ner:"NUMBER"}] [{pos:"NN"}|{pos:"NNP"}] /ave(nue)?|st(reet)?|boulevard|blvd|r(oa)?d/), action: Annotate($0, ner, "address") }

Вот сеанс scala repl, показывающий, как я пытаюсь настроить конвейер аннотаций.

@ import edu.stanford.nlp.pipeline.{StanfordCoreNLP, CoreDocument}

@ import edu.stanford.nlp.util.PropertiesUtils.asProperties

@ val pipe = new StanfordCoreNLP(asProperties(
  "customAnnotatorClass.tokensregex", "edu.stanford.nlp.pipeline.TokensRegexAnnotator",
  "annotators", "tokenize,ssplit,pos,lemma,ner,tokensregex",
  "ner.combinationMode", "HIGH_RECALL",
  "tokensregex.rules", "addresses.tregx"))
pipe: StanfordCoreNLP = edu.stanford.nlp.pipeline.StanfordCoreNLP@2ce6a051

@ val doc = new CoreDocument("Adam Smith lived at 123 noun street in Glasgow, Scotland")
doc: CoreDocument = Adam Smith lived at 123 noun street in Glasgow, Scotland

@ pipe.annotate(doc)

@ doc.sentences.get(0).nerTags
res5: java.util.List[String] = [PERSON, PERSON, O, O, address, address, address, O, CITY, O, COUNTRY]

@ doc.entityMentions
res6: java.util.List[edu.stanford.nlp.pipeline.CoreEntityMention] = [Adam Smith, 123, Glasgow, Scotland]

Как видите, адрес правильно помечен в nerTags для предложения, но в документах он не отображается entityMentions.Есть ли способ сделать это?

Кроме того, есть ли способ из документа отличить два соседних совпадения токен-регулярного выражения от одного совпадения (при условии, что у меня есть более сложный набор регулярных выражений; в текущем примере Iсоответствует только 3 токенам, так что я могу просто считать их)?

Я пытался приблизиться к нему, используя regexner с регулярным выражением токенов, описанным здесь https://stanfordnlp.github.io/CoreNLP/regexner.html,, но я не мог этого получитьработает.

Так как я работаю в Scala, я буду рад погрузиться в Java API, чтобы заставить это работать, а не возиться со свойствами и файлами ресурсов, если это необходимо.

1 Ответ

0 голосов
/ 22 сентября 2018

Да, я недавно добавил некоторые изменения (в версии GitHub), чтобы сделать это проще!Обязательно загрузите последнюю версию с GitHub.Хотя мы намерены выпустить Stanford CoreNLP 3.9.2 довольно скоро, и он будет иметь эти изменения.

Если вы прочитаете эту страницу, вы сможете получить представление о полном конвейере NER, выполняемом NERCombinerAnnotator.

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

Кроме того, здесь есть много записей о TokensRegex:

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

В основном вы хотите запустить ner аннотатор, и используйте его TokensRegex субаннотатор.Представьте, что у вас есть несколько именованных правил сущностей в файле с именем my_ner.rules.

. Вы можете выполнить команду, подобную этой:

java -Xmx5g edu.stanford.nlp.pipeline.StanfordCoreNLP -annotators tokenize,ssplit,pos,lemma,ner -ner.additional.tokensregex.rules my_ner.rules -outputFormat text -file example.txt

. Во время выполнения субаннотатор TokensRegex будет запущен.полный процесс распознавания именованных объектов.Затем, когда будет выполнен последний шаг упоминаний сущностей, он будет работать с правилами, извлеченными именованными сущностями, и создаст из них упоминания сущностей.

...