Что такое NER и почему вам это нужно?

Что такое распознавание именованных сущностей (NER)?

Это процесс определения собственных существительных из фрагмента текста и их классификации по соответствующим категориям. Эти категории могут быть общими, например «Организация», «Лицо», «Местоположение» и т. Д., Или они могут быть адаптированы для конкретного приложения, например «Язык программирования», «Сайт блогов» и т. Д.

Проще говоря, если вы хотите узнать «кто», «что», «когда», «где» из предложения, тогда ваша задача - NER.

Возьмите следующий пример (или попробуйте сами здесь):

Почему это вообще проблема?

Когда я впервые услышал о NER, это прозвучало ужасно скучно и даже банально. Вы можете подумать: «Разве это не простая задача поиска? Зачем нам вообще нужен ML? » и так далее. Позвольте мне убедить вас в обратном:

1. «Могу я просто найти имена?»

Вы можете и часто делаете. Вы можете подумать, что просто будете вести гигантский список всех существующих в мире имен собственных. Но когда вы читаете предложение, вроде

«Мистер Лунатик делает комплимент профессору Снейпу и умоляет его держать свой необычно большой нос подальше от чужих дел "

вы все еще можете сделать вывод из контекста, что «Лунатик» и «Снейп» - это имена людей, даже если вы, возможно, никогда не слышали эти имена в реальной жизни. Итак, в проблеме NER должно быть что-то большее, чем просто поиск.

2. "Разве я не могу просто использовать правила, созданные вручную?"

Опять же, вы можете, и часто вы это делаете. Вы можете выбрать все слова в заглавном регистре или слова в верхнем регистре.

Однако, как вы понимаете, это явно чревато ошибками, если текст не отформатирован должным образом. Это может быть особенно проблемой, когда текст получен из таких приложений, как распознавание речи.

Даже если вам удастся изолировать все сущности с помощью подобных правил, их все равно придется классифицировать по соответствующим категориям.

Как мне сформулировать это в терминах машинного обучения?

Итак, предполагая, что теперь вы убеждены в том, что проблема стоит решения, давайте сформулируем ее более конкретными терминами машинного обучения: учитывая предложение, классифицируйте каждое слово в категорию собственных существительных. Если слово не является существительным собственным, отнесите его к категории «Другое».

Таким образом, это проблема маркировки последовательностей .

Здесь нужно добавить некоторые более тонкие детали. Сначала классификация будет выполняться по токенам, а не по словам.

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

«Почему Энтони Гонсалес, Роберт Дауни-младший и Сачин Тендулкар в Париже?»

будут помечены как:

Обычно это называется схемой IOB, где B означает начало, I означает внутри, а O означает снаружи. Существуют даже более детализированные схемы, такие как схема BILUO, где L означает Последний, U означает Единица. SpaCy использует последнюю схему. Схема BILUO имеет такую ​​же выразительность, что и схема IOB, но эта статья показывает, что BILUO легче обучать, чем IOB.

Какие особенности?

Что дает нам информацию о том, является ли слово именованным объектом или нет? Может быть:

  1. Заглавные буквы
  2. Префикс Суффикс
  3. POS-тег
  4. Относительное расположение в предложении (начало, конец и т. Д.)
  5. Другие слова в предложении.
  6. Является ли слово "OOV" (вне словарного запаса)

Какие алгоритмы я могу использовать?

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

1. На основе традиционного машинного обучения:

  • Условные случайные поля (CRF) [scikit-learn предоставляет очень удобную структуру под названием sklearn_crfsuite]
  • Марковская модель максимальной энтропии

2. На основе нейронных сетей:

  • LSTM, bi-LSTM (хороший фреймворк - Flair)
  • CNN (SpaCy использует архитектуру на основе CNN)
  • Трансформеры (Spacy недавно запустила его здесь)

Где взять данные для обучения?

Для обучения NER доступно несколько наборов данных с открытым исходным кодом. У каждого из них есть свои особенности. Некоторые из них:

  1. CoNLL-2003
  2. W-NUT 2017 (Этот набор больше ориентирован на новые, появляющиеся сущности)
  3. OntoNotes 5 (содержит несколько жанров речи)

Для более обширной коллекции наборов данных обратитесь к этому репозиторию github.

Как мне узнать, хорошо ли работает моя модель?

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

1. Традиционные показатели

В качестве задачи классификации эффективность NER обычно измеряется с помощью показателей классификации (по всем токенам), таких как точность, отзывчивость, F-оценка, точность и т. Д. Это нормально, если вы просто хотите сравнить разные модели простым способом.

Имейте в виду, что в любых данных NER будет серьезный дисбаланс классов, потому что большинство слов в любом корпусе не являются именами собственными (как правило, только тег 'O' составляет более 75% теги). Поэтому, на мой взгляд, среднее макросреднее по всем классам более уместно, чем среднее микро (для любого показателя).

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

2. Новые разработки

Однако упомянутые выше простые показатели мало что говорят нам. Они агрегированы по всему набору данных, и мы не можем дать содержательную характеристику сильных и слабых сторон модели. Эта недавняя статья пытается решить эту проблему, разбивая набор данных на разные части на основе объяснимых критериев и исследуя производительность модели по каждому фрагменту отдельно.

Подробнее об этом вы можете прочитать в этом посте, который я написал недавно.

Подводя итоги

NER - это проблема классификации слов в предложении по категориям имен собственных. Это не решается полностью с помощью поиска или созданных вручную правил, но они помогают. Для ее решения существуют различные алгоритмы, основанные на традиционном машинном обучении, а также на основе глубокого обучения. Такие фреймворки, как sklearn_crfsuite, SpaCy, Flair и т. Д., Действительно упрощают реализацию этих алгоритмов.