Как сгруппировать теги NER, чтобы получить данные из предложения в целом?

Через библиотеку CoreNLP при вызове ner() для CoreLabel я получаю строку, указывающую его именованный тег объекта (например, PERSON или DATE).

Однако я не знаю способа сравнить токены в предложении друг с другом. Например: (текст токенов, заключенный в обратные кавычки)

`Ellen` PERSON
`Wexler `PERSON
`,` O
`February` DATE
`9` DATE
`,` DATE
`2016` DATE

Как с помощью CoreNLP сгруппировать теги людей, чтобы получить имя Ellen Wexler? Или теги даты, чтобы получить February 9, 2016, или другое представление, которое я мог бы в конечном итоге превратить в объект Date/Calendar в Java? Я рассмотрел приведенный пример здесь, однако это находит теги ner только для каждой отдельной основной метки. Это не дает мне возможности группировать последовательные идентичные теги ner вместе.

Что я пробовал: я написал цикл for, который выполняет итерацию по предложению и находит X последовательных идентичных тегов ner (то есть, если X равно 2, а тег ner равен PERSON, он найдет 2 последовательные ЛИЦА). В данном сценарии это Ellen Wexler. Однако это нарушается, когда в игру вступает пунктуация, поскольку пунктуации, в зависимости от контекста, присваивается тег ner соседних с ним токенов. Кроме того, должен быть какой-то способ сделать это через CoreNLP.

Мое исследование: На этот аналогичный вопрос ответа нет. Домашняя страница CoreNLP не дает ответа, поскольку предоставляет только пример анализа отдельных основных меток/токенов.


person Mario Ishac    schedule 10.02.2018    source источник


Ответы (1)


Более традиционно вы хотите использовать аннотатор entitymentions.

В версии 3.9.0, которая только что была выпущена бета-версией, аннотатор ner будет автоматически создавать упоминания объектов, которые связывают вместе токены, принадлежащие одному и тому же упоминанию объекта.

Вы можете увидеть несколько примеров использования нового API, чтобы увидеть, как легко получить доступ к упоминаниям объектов. Некоторые функции этого класса отсутствуют в бета-версии 3.9.0 на сайте, но очень скоро будут добавлены в обновленной версии.

Полезный демо-код:

https://github.com/stanfordnlp/CoreNLP/blob/master/src/edu/stanford/nlp/examples/BasicPipelineExample.java

person StanfordNLPHelp    schedule 11.02.2018
comment
Спасибо, это прекрасно работает. Однако можете ли вы пояснить разницу между CoreMap и CoreSentence? Старые вопросы, в которых используются упоминания сущностей, используют CoreMap, однако в вашем примере в дополнение к моей программе используется CoreSentence. - person Mario Ishac; 11.02.2018
comment
CoreSentence — это новый класс, который был добавлен недавно. Старые ответы должны по-прежнему работать, но был добавлен новый синтаксис, чтобы упростить работу с конвейерами. - person StanfordNLPHelp; 12.02.2018
comment
CoreSentence — это просто оболочка вокруг CoreMap, если вы посмотрите на код CoreSentence, вы заметите, что он содержит базовый CoreMap. - person StanfordNLPHelp; 12.02.2018
comment
В будущем цель состоит в том, чтобы CoreSentence был подклассом CoreMap, а не оболочкой, но это потребовало бы слишком много работы, и мы хотели получить эти новые удобные классы в выпуске 3.9.0. - person StanfordNLPHelp; 12.02.2018