2015-08-14 6 views
17

Я только что начал с OpenNLP. Мне нужно создать простую обучающую модель для распознавания сущностей.Как создать хорошую модель обучения NER в OpenNLP?

Чтение док здесь http://opennlp.apache.org/documentation/1.5.3/manual/opennlp.html#tools.namefind Я вижу это просто текст для обучения модели:

<START:person> Pierre Vinken <END> , 61 years old , will join the board as a nonexecutive director Nov. 29 . 
Mr . <START:person> Vinken <END> is chairman of Elsevier N.V. , the Dutch publishing group . 
<START:person> Rudolph Agnew <END> , 55 years old and former chairman of Consolidated Gold Fields PLC , 
    was named a director of this British industrial conglomerate . 

Вопросов два:

  • Почему я должен поставить имена лиц в текстовый (фразовый) контекст? Почему бы не написать имя человека по одному для каждой строки? например:

    <START:person> Robert <END> 
    
    <START:person> Maria <END> 
    
    <START:person> John <END> 
    
  • Как я могу добавить дополнительную информацию к этому имени? Например, я хотел бы сохранить информацию Male/Female для каждого имени.

(я знаю, что есть системы, которые пытаются понять прочитав последнее письмо, как «а» для Женского и т.д., но я хотел бы добавить это сам)

Спасибо.

ответ

17

Ответ на ваш первый вопрос заключается в том, что алгоритм работает с окружающим контекстом (токенами) в предложении; это не просто простой механизм поиска. OpenNLP использует максимальную энтропию, которая является формой многомерной логистической регрессии для построения ее модели. Причина этого заключается в том, чтобы уменьшить «двусмысленность смысла слова» и найти сущности в контексте. Например, если мое имя - апрель, я легко смущаюсь с апрелем, и, если меня зовут Май, я смущаюсь с майским месяцем, а также глаголом. Во второй части первого вопроса вы можете составить список имен, которые известны, и использовать эти имена в программе, которая просматривает ваши предложения, и автоматически комментирует их, чтобы помочь вам создать учебный набор, однако, составив список имен в одиночку без контекста не будет готовить модель достаточно или вообще. Фактически, для этого используется аддон OpenNLP, называемый «addbuilder-конструктор»: вы даете ему файл имен, и он использует имена и некоторые ваши данные (предложения) для обучения модели. Если вы ищете конкретные имена вообще не двусмысленных сущностей, вам может быть лучше использовать список и что-то вроде регулярного выражения для поиска имен, а не NER.

Что касается вашего второго вопроса, то есть несколько вариантов, но в целом я не думаю, что NER - отличный инструмент для определения чего-то вроде пола, однако при достаточном количестве тренировочных предложений вы можете получить приличные результаты. Поскольку NER использует модель, основанную на окружающих токенах, в вашей тренировке предложений, устанавливающей существование именованного объекта, она не может многое сделать с точки зрения определения пола. Возможно, вам лучше найти все имена людей, а затем указать индекс имен, которые, как вы знаете, являются мужчинами или женщинами, чтобы получить соответствие. Кроме того, некоторые имена, такие как Пэт, являются как мужчинами, так и женщинами, и в большинстве текстовых данных не будет никаких указаний на то, что оно ни для человека, ни для машины. При этом вы могли бы создать модель для мужчин и женщин отдельно, или вы могли бы создать разные типы сущностей в одной и той же модели. Вы могли бы использовать аннотацию, подобную этой (используя разные имена типов сущностей male.person и female.person). Я никогда не пробовал это, но это может сделать нормально, вам придется проверить его на ваших данных.

<START:male.person> Pierre Vinken <END> , 61 years old , will join the board as a nonexecutive director Nov. 29 . 
Mrs . <START:female.person> Maria <END> is chairman of Elsevier N.V. , the Dutch publishing group 

ЧПО = Названный Entity Recognition

HTH

+1

Спасибо! Да, я должен следовать вашему примеру, делая ** female.person ** и ** male.человек **, проблема здесь в том, что у меня есть много имен и фамилий (около 200 тыс.), поэтому в этом случае я должен писать одни и те же предложения снова и снова с другим именем каждый раз ?, например, <НАЧАТЬ: male.person> Pierre Vinken , 61 год .. ** затем ** John Travolta , 61 лет ... и т. Д. И т. Д.? – Dail

+2

интересная идея .... Я бы попробовал и посмотрел, что получится – markg

+0

нужно ли нам следовать этому пути? – Dail