Я хочу добавить адреса (и, возможно, другие объекты, основанные на правилах) в конвейер 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, чтобы заставить это работать, а не возиться со свойствами и файлами ресурсов, если это необходимо.