DATA4
Автор статьи: Александр крайнов

Подходы к извлечению информации из текста

Создание полноценного, "сильного" искусственного интеллекта — задача, далекая от завершения. Современная область ИИ, в том числе и обработка естественного языка, представляет, скорее, инструментарий со множеством подходов и методов.

В нашей прошлой статье [1], посвященной пониманию текстов, мы упоминали о существовании в NLP двух базовых подходов к анализу неструктурированной информации:

  1. Глубокие (deep) методы анализа стремятся сначала структурировать заданный текст целиком, привести его к нормальной форме, и только затем выявлять части (слова, словосочетания), подлежащие обработке.

  2. Поверхностные (shallow) методы ориентируются на анализ отдельных частей текста, а также статистических метриках.

В недавней статье на Хабрахабре [2] рассматривались технологии синтаксического анализа текстов (парсинга). Полноценный парсинг языка относится к глубоким методам обработки текстов, так как при этом строится дерево разбора, включающее взаимосвязи между вспомогательными словами. Применение таких тяжелых методов невыгодно для реальных бизнес-задач, так как любое приложение рано или поздно (а в ИИ — почти всегда рано) сталкивается с ограничениями производительности.
Как правило, объемы текстов в задачах извлечения информации (information extraction, IE) особенно большие. Это могут быть коллекции новостей, исторических записей, научных статей, собранных за десятилетия. Среди этих документов требуется найти имена, события, факты, даты, наименования организаций и т. д. Именно поэтому задача извлечения информации чаще всего решается с помощью поверхностных методов NLP. Далее мы рассмотрим эти методы от простых к сложным.

Регулярные выражения

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

IBM - Армонк, Нью-Йорк, США - Сентябрь 2003 - Ноябрь 2005

Microsoft Corp. | Редмонд, Вашингтон, США | с 04.2008 по 09.2009

Google Inc.<TAB>Маунтин-Вью, Калиф.<TAB> с сент. 2011 по янв. 2014

В этом случае даты мы можем извлечь даты начала и окончания работы на организацию с помощью регулярного выражения вида:

((\d{1,2}|\w{3,}).? ?(\d{2,4})) (-|по) ((\d{1,2}|\w{3,}).? ?(\d{2,4}))


Этот подход будет эффективным в большинстве случаев, и вы даже сможете обойтись без сложных инструментов наподобие DateParser [4]. Кроме того, регулярные выражения могут применяться для предобработки текста. Например, зная, что даты обычно располагаются в первой строке описания каждого места работы кандидата, мы можем сегментировать исходный текст, а затем работать с каждой из частей по отдельности, что увеличит производительность.

Извлечение именованных сущностей

Более сложная проблема — извлечение имен и фамилий, городов, стран, а также названий организаций. Они начинаются с заглавной буквы, состоят из последовательности слов (между которыми часто встречаются запятые), каждое из которых может быть сколь угодно длинным. Перечисленные выше понятия в NLP принято называть именованными сущностями (named entities), а соответствующие задачи обозначаются как извлечение именованных сущностей (named entity recognition, NER) и связывание сущностей (entity linking, NEL).

Базовым решением к проблеме NER служит газеттир. В узком смысле это словарь географических названий, а в широком — любой словарь часто встречающихся слов и словосочетаний. Зачастую именно от качества словарей зависит результат. Примером такого инструмента является пакет GeoText [5], предназначенный для выявления городов и соответствующих стран в тексте.

Немалую пользу в реальных приложениях приносит анализ слов текста на принадлежность к определенным частям речи (частеречная разметка, part-of-speech tagging, POS-tagging). Современные инструменты NLP, такие как Stanford NLP, spaCy и NLTK умеют различать имена собственные (proper nouns, тег "NNP") и нарицательные (common nouns, тег "NN"). Например, объединив идущие подряд слова с тегом "NN" (см. рисунок) мы получим список всех именованных сущностей в тексте — останется только определить, что есть что.
Подпишись на рассылку новостей о AI
Только полезные материалы о машинном обучении и искусственном интеллекте. Мы уважительно относимся к нашим читателям и рассылаем письма не чаше 1 раза в неделю!
Рис. 1. Пример разметки текста для определения частей речи и поиска именованных сущностей в системе Brat
Здесь читатели могут остановиться и задать логичный вопрос. Что если расширить регулярные выражения таким образом, чтобы мы оперировали не группами символов (такими как \d или \W), а частями речи, плюс объединить это все с газеттиром?

Мы получим поверхностный, но быстрый парсер грамматик! В последнее время такие парсеры получают все большую популярность в области NLP, особенным вниманием пользуются парсеры, работающие по алгоритму Эрли (Earley parsers) [6]. Примерами поверхностных парсеров для английского языка являются IEPy и Lark, а для русского — Томита-Парсер [7] и Yargy [8].

В парсерах грамматик подобное правило для поиска локаций может выглядеть так:

State = Gazetteer("state")

Oblast = Gazetteer("oblast")

Country = Gazetteer("country")

City = RegExp("[A-Z][a-z]+")

UsLocation = City + ","? + State + ","? + "USA"?

RuLocation = "г."? + City + ","? + Oblast + ","? + "Россия"?

RuLocationInverse = Oblast + ","? + "г."? + City

Location = UsLocation | RuLocation | RuLocationInverse

Вероятностные парсеры

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

Но что делать со словами "Владимир" (город и имя) или "Вашингтон" (фамилия и штат)? Для выявления сущностей этих слов необходимо учитывать контекст. На помощь приходят контекстные вероятностные парсеры, и, в первую очередь, условные случайные поля (conditional random fields, CRF) [9]. Этот метод позволяет оценивать вероятности по признакам и самих слов, и соседних. Например, если одно из соседних со словом "Владимир" слов имеет окончание на "-ов" и начинается с заглавной буквы, то с большой вероятностью это — фамилия и имя человека, а если перед "Владимиром" стоит сокращение "г." — то это город.

Вероятностные парсеры помогают там, где информация достаточно структурированная, но часто содержит ошибки или искажения. Возвращаясь к примеру с резюме, хорошо обученный парсер определит, что перед датой идет локация, а перед ней — наименование работодателя. И это несмотря на то, что соискатели могут забыть написать город или полное название компании, что было бы важно для газеттира.

Итоги

Как мы увидели, средств извлечения информации из текстов много — при том, что значительную часть (например, нейросети) мы даже не рассмотрели. Для каждой задачи приходится выбирать свой подход, но основное правило, которого здесь стоит придерживаться — не усложнять используемые методы, пока в этом не возникнет необходимость.

Читайте наши статьи:

Капсульные нейронные сети

Нейронные сети, фундаментальные принципы работы и топология

Применение речевой аналитики в бизнесе

Литература

  1. Александр Крайнов. Понимание естественного языка // Data4 Blog. URL: http://data4.ru/flu

  2. Денис Кирьяновю Изучаем синтаксические парсеры для русского языка // Хабрахабр.

  3. Sara Robinson, Guillaume Laforge. New features in the Google Cloud Natural Language API, thanks to your feedback // Google Cloud Blog.

  4. DateParser Documentation // ReadTheDocs.

  5. Python PyPI: geotext // PyPI.

  6. Джеффри Кеглер. История синтаксического анализа // Tproger.

  7. Томита-парсер — Инструкция для начинающих // Технологии Яндекса.

  8. Александр Кукушкин. Наташа — библиотека для извлечения структурированной информации из текстов на русском языке // Хабрахабр.

  9. Никита Никитинский. Условные случайные поля (CRF): краткий обзор // NLPx. 2016.

DATA4

Сделаем будущее настоящим!
Связаться с нами
Напишите контактные данные, чтобы мы связались с вами.