Извлечение фактов
Задача извлечения информации из текста сама по себе не нова: в этом направлении проделано довольно много работы как со стороны крупных компаний aka Яndex и Google, так и со стороны независимых разработчиков. Однако, говорить о том, что данная задача окончательно решена, увы, не приходится. В этой статье я хочу немного упорядочить свои знания по данному вопросу, поверхностно разобрав наработки, с которыми мне недавно пришлось столкнуться.
Существующие решения
И так, пусть нам дано предложение «Визит Президента в Данию придаст новое дыхание диалогу двух стран». Для вычленения фактов из этого предложения потребуется пройти следующие этапы:
I. Токенизация
На данном этапе предстоит разбить предложение на отдельные слова. Проблем тут возникнуть не должно.
II. Морфологический анализ
После разбивки, для каждого слова необходимо получить морфологическую информацию о нём (часть речи, род, падеж, число и т.д.) и всевозможные атрибуты (например, является ли слово именем или географическим месторасположением). Для данной задачи необходимо наличие специальных словарей: в качестве реестра русских слов можно использовать словарь Зализняка или его проприетарные производные. В качестве готового решения можно рассмотреть утилиту Mystem от Яndex.
В случае использования утилиты Mystem исходное предложение будет разобрано следующим образом:
krestyaninov@localhost# echo "Визит Президента в Данию придаст новое дыхание диалогу двух стран" | ./mystem -niwg Визит{визит=S,муж,неод=(им,ед|вин,ед)} Президента{президент=S,муж,од=(род,ед|вин,ед)} в{в=PR=|в=S,сокр=(им,ед|им,мн|род,ед|род,мн|дат,ед|дат,мн|вин,ед|вин,мн|твор,ед|твор,мн|пр,ед|пр,мн)} Данию{дания=S,гео,жен,неод=вин,ед} придаст{придавать=V=непрош,ед,изъяв,3-л,сов} новое{новое=S,сред,неод=(им,ед|вин,ед)|новый=A=(им,ед,полн,сред|вин,ед,полн,сред)} дыхание{дыхание=S,сред,неод=(им,ед|вин,ед)} диалогу{диалог=S,муж,неод=дат,ед} двух{два=NUM=(род|вин,жен,од|вин,муж,од|пр)} стран{страна=S,жен,неод=род,мн}
III. Синтаксический разбор
На данном этапе определяются связанные подгруппы слов в предложении. Например, СУЩЕСТВИТЕЛЬНОЕ-ГЛАГОЛ: «визит-предаст». Установление этих связей позволит нам определится с неоднозначностями в морфологическом анализе. Так например, из словосочетания «новое дыхание» видно, что «новое» — это прилагательное, а не существительное (в чём не было уверенности после морфологического анализа).
IV. Семантический разбор
Задача семантического анализа заключается в построении полноценного дерева связей слов в предложении. Данный процесс имеет множество нюансов и в целом довольно сложен, для того, что бы быть описанным в этой статье. Подробней о семантическом анализе можно почитать здесь.
V. Извлечение фактов
Сформировав дерево связи слов в предложении, мы можем перейти непосредственно к извлечению фактов. Для этого можно использовать следующие инструменты:
— Поиск опорного элемента: В тексте ищется некоторое слово (например, «Президент»), на основе которого исходя из дерева связей строится факт;
— Поиск по шаблону: Поиск данных по регулярному выражению (например, вычленение даты);
— Поиск по онтологии: Поиск данных на основе предикативных правил, описанных на специальном языке. Пример.
Подробнее об извлечении фактов можно посмотреть по перечисленным ниже адресам:
— Презентация «Яндекс.Пресс-портреты»;
— Презентация: «Автоматическое извлечение фактов из текста»;
Существующие решения
Из существующих сколь-либо приемлемо работающих свободно распространяемых систем извлечения фактов мне удалось найти лишь систему под названием GATE. Система довольно интересная и многообещающая, однако нативной поддержки русского языка она, к сожалению, не имеет. Попробовать её в действии можно с помощь этого мануала.
Из платных систем можно отметить отечественную разработку RCO (спасибо rg_software).
Дополнительные ссылки по теме
— Извлечение ключевых слов с помощью Wikipedia;
— Обзор Text Mining систем;
— Обзор лингвистической системы «Semantix».
P.S.
Как уже было сказано выше, статья является компиляцией тех данных по теме извлечения информации, что мне удалось найти и понять. Если у Вас есть информация/идеи/наработки по теме — буду рад увидеть их в комментариях.