tomita 4марта

80
NLPseminar, Санкт-Петербург, 15 декабря 2012 года Дмитрий Панкратов , Наталья Остапук Томита-парсер инструмент для извлечения фактов

Upload: natalia-ostapuk

Post on 16-Jun-2015

261 views

Category:

Documents


11 download

TRANSCRIPT

Page 1: Tomita 4марта

NLPseminar, Санкт-Петербург, 15 декабря 2012 года

Дмитрий Панкратов , Наталья Остапук

Томита-парсеринструмент для извлечения фактов

Page 2: Tomita 4марта

Вступление

Page 3: Tomita 4марта

Инструмент для извлечения фактовТомита-парсер

• В основе парсера лежит алгоритм GLR – парсинга (http://ru.wikipedia.org/wiki/GLR-парсер)

• Автор алгоритма - Масару Томита, мы назвали парсер в его честь.

• Извлечение фактов - извлечение структурированных данных из текста на естественном языке.

• Извлечение фактов происходит при помощи контекстно-свободных грамматик и словарей ключевых слов.

Page 4: Tomita 4марта

Как писать грамматики?

Page 5: Tomita 4марта

Что делает томита-парсер?

tomitaparser.exe

Тяжёлый труд облагораживает хорошего человека

Исходный текст

Томита-парсер

Факты

тяжёлый | трудхороший | человек

словарии грамматики

Page 6: Tomita 4марта

Заполнение «карточки фильма» информацией, извлеченной из текста на естественном языке

Наша задача

название

жанр

год

оригинальное название

режиссер

Page 7: Tomita 4марта

Откуда берется исходный текст?• из одного текстового файла• из нескольких текстовых файлов

•папка•.tar архив

• из STDIN

Page 8: Tomita 4марта

Фильм Оливера Стоуна "Александр" основан на реальной жизни одного из самых выдающихся людей в истории.«Титаник» (Titanic) — фильм-катастрофа 1997 года, снятый Джеймсом Кэмероном, в котором показана гибель легендарного лайнера «Титаник». Главные роли в фильме исполнили Кейт Уинслет (Роза Дьюитт Бьюкейтер) и Леонардо Ди Каприо (Джек Доусон).«Неприкасаемые» (Intouchables) — трагикомедийный фильм 2011 года, основанный на реальных событиях. Главные роли исполняют Франсуа Клюзе и Омар Си, удостоенный за эту актёрскую работу национальной премии «Сезар».

Исходный текст input.txt

Page 9: Tomita 4марта

Грамматика состоит из правил, которые описывают цепочки

В правиле есть левая и правая часть, разделенные символом ->В левой части стоит один нетерминал, правая состоит из терминалов и нетерминалов.

S -> Noun;

Правила в Томите

Page 10: Tomita 4марта

Превращаем правила в грамматику

Page 11: Tomita 4марта

#encoding "utf-8"

#GRAMMAR_ROOT S

S -> Noun;

Грамматика film.cxx

Page 12: Tomita 4марта

encoding "utf8";import "base.proto"; всегдаimport "articles_base.proto"; копируем

TAuxDicArticle "фильм" эту статью будем { запускать key = { "tomita:film.cxx" type=CUSTOM }}

Корневой словарь mydic.gzt

Page 13: Tomita 4марта

● Откуда читать текст? - секция Input (File, ...)● В какой кодировке? - Input.Encoding● Куда записывать факты? - секция Output● В каком формате и кодировке? - там же

+● Какие грамматики запускать? - Articles● Какие факты записывать? - Facts

Конфигурация парсера

Page 14: Tomita 4марта

encoding "utf8";TTextMinerConfig { Dictionary = "mydic.gzt"; корневой словарь

(обязательный параметр) Input = {File = "input.txt";} входной файл Output = {File = "output.txt"; сюда записываем Format = text;} результат Articles = [ ссылка на статью { Name = "фильм" } из словаря ]}

Файл конфигурации config.proto

Page 15: Tomita 4марта

Запускаем!

Windows: tomitaparser.exe config.proto

Linux / *BSD (bash) ./tomitaparser config.proto

Page 16: Tomita 4марта

Фильм Оливера Стоуна "Александр" основан на реальной жизни одного из самых выдающихся людей в истории . "Титаник" ( Titanic ) — фильм-катастрофа 1997 года , снятый Джеймсом Кэмероном , в котором показана гибель легендарного лайнера "Титаник" . Главные роли в фильме исполнили Кейт Уинслет ( Роза Дьюитт Бьюкейтер ) и Леонардо Ди Каприо ( Джек Доусон ) . «Неприкасаемые" ( Intouchables ) — трагикомедийный фильм 2011 года , основанный на реальных событиях . Главные роли исполняют Франсуа Клюзе и Омар Си , удостоенный за эту актёрскую работу национальной премии "Сезар" .

Результат output.txt

Page 17: Tomita 4марта

Но если мы добавим отладочный вывод…

Page 18: Tomita 4марта

encoding "utf8";TTextMinerConfig { Dictionary = "mydic.gzt";

PrettyOutput = "pretty.html";

Input = {File = "input.txt";}

Output = {File = "output.txt";

Format = text}

Articles = [ { Name = "фильм" } ]}

Файл конфигурации config.proto

Page 19: Tomita 4марта

Подробный результат pretty.html

Page 20: Tomita 4марта

Регистр: h-reg1, h-reg2, h-reg3, l-reg

Многословная сущность: mw

Первое слово в предложении: fw

Вершина синтаксической группы: rt

И другие

Пометы-ограничения

Page 21: Tomita 4марта

Теперь мы можем выделять имена собственные

Page 22: Tomita 4марта

#encoding "utf-8" #GRAMMAR_ROOT S

Name -> Word<h-reg1, ~fw>;Name -> Word<h-reg1, ~fw> Word<h-reg1>;Name -> Word<h-reg1, ~fw> Word<h-reg1> Word<h-reg1>;

S -> Name;

Грамматика film.cxx

Page 23: Tomita 4марта

Не обязательно писать одно и то же несколько раз

Page 24: Tomita 4марта

* — символ повторяется 0 или более раз

S -> Adj* Noun; = S -> Noun;S -> Adj Noun;S -> Adj Adj Noun;…

Позволяют получить более удобную сокращенную запись правил грамматики

Операторы

Page 25: Tomita 4марта

+ — символ повторяется 1 или более раз

S -> Adj+ Noun; = S -> Adj Noun;S -> Adj Adj Noun;S -> Adj Adj Adj Noun;…

Операторы

Page 26: Tomita 4марта

() — символ входит в правило 0 или 1 раз

S -> (Adj) Noun; = S -> Noun;S -> Adj Noun;

Операторы

Page 27: Tomita 4марта

#encoding "utf-8"#GRAMMAR_ROOT S

Name -> Word<h-reg1, ~fw> Word<h-reg1>*;

S -> Name;

Грамматика film.cxx

Page 28: Tomita 4марта

Имена собственные уже не стыдно интерпретировать в факты

Page 29: Tomita 4марта

import "base.proto"; всегдаimport "facttypes_base.proto"; копируем

message Film: NFactType.TFact имя факта{ required string Name = 1; поля факта}

Описание фактов facttypes.proto

Page 30: Tomita 4марта

encoding "utf8";import "base.proto";import "articles_base.proto";

import "facttypes.proto";

TAuxDicArticle "фильм"{key = { "tomita:film.cxx" type=CUSTOM }}

Корневой словарь mydic.gzt

Page 31: Tomita 4марта

encoding "utf8";TTextMinerConfig { Dictionary = "mydic.gzt"; PrettyOutput = "pretty.html";

Input = {File = "input.txt";} Output = {File = "output.txt"; Format = text;}

Articles = [ { Name = "фильм" } ] Facts = [ { Name = "Film" } ]}

Файл конфигурации config.proto

Page 32: Tomita 4марта

#encoding "utf-8"#GRAMMAR_ROOT S

Name -> Word<h-reg1, ~fw> Word<h-reg1>*;

S -> Name interp (Film.Name);

Грамматика film.cxx

Page 33: Tomita 4марта

Фильм Оливера Стоуна "Александр" основан на реальной жизни одного из самых выдающихся людей в истории . Film

{Name = Оливер Стоуна "Александр“

}"Титаник" ( Titanic ) — фильм-катастрофа 1997 года , снятый Джеймсом Кэмероном , в котором показана гибель легендарного лайнера "Титаник" . Film

{Name = Titanic

}Film{

Name = 1997}Film{

Name = Джеймс Кэмероном}

Результат output.txt

Page 34: Tomita 4марта

Главные роли в фильме исполнили Кейт Уинслет ( Роза Дьюитт Бьюкейтер ) и Леонардо Ди Каприо ( Джек Доусон ) .

Film { Name = Кейт Уинслет}

Film { Name = Роза Дьюитт Бьюкейтер}

Film { Name = Леонардо Ди Каприо}

Film { Name = Джек Доусон}

Результат output.txt

Page 35: Tomita 4марта

Результат pretty.html

Page 36: Tomita 4марта

?,,?

Что это?

Page 37: Tomita 4марта

Согласование

Page 38: Tomita 4марта

По роду, числу и падежу: gnc-agr

По числу и падежу: nc-agr

По роду и числу: gc-agr

По падежу: n-agr

И другие

Согласование

Page 39: Tomita 4марта

#encoding "utf-8"

#GRAMMAR_ROOT S

Name -> Word<h-reg1, ~fw, nc-agr[1]> Word<h-reg1, nc-agr[1]>*;

S -> Name interp (Film.Name);

Грамматика film.cxx

Page 40: Tomita 4марта

Результат pretty.html

Page 41: Tomita 4марта

Переходим к делу

Page 42: Tomita 4марта

#encoding "utf-8"

#GRAMMAR_ROOT S

//Name -> Word<h-reg1, ~fw, nc-agr[1]> Word<h-reg1, nc-agr[1]>*;

FilmName -> Word<h-reg1, quoted>;FilmName -> Word<h-reg1, l-quoted> Word* Word<r-quoted>;

S -> FilmName interp (Film.Name);

Файл film.cxx

Выделяем название фильма

Page 43: Tomita 4марта

Результат pretty.html

Page 44: Tomita 4марта

1. «Неприкасаемые» нормализовались

2. В качестве названия фильма выделилось название судна и название премии

Что нам не нравится?

Page 45: Tomita 4марта

Файл film.cxx

Решаем проблему нормализации

#encoding "utf-8"

#GRAMMAR_ROOT S

//Name -> Word<h-reg1, ~fw, nc-agr[1]> Word<h-reg1, nc-agr[1]>*;

FilmName -> Word<h-reg1, quoted>;FilmName -> Word<h-reg1, l-quoted> Word* Word<r-quoted>;

S -> FilmName interp (Film.Name::not_norm);

Page 46: Tomita 4марта

Результаты pretty.html

Page 47: Tomita 4марта

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

Для дескрипторов удобнее всего создать словарь.

Решаем проблему лишних срабатываний

Page 48: Tomita 4марта

Словари

Page 49: Tomita 4марта

encoding "utf8";

TAuxDicArticle "жанр" { key = "комедия" key = "комедийный фильм" key = "трагикомедийный фильм" key = "фильм ужасов" key = "фильм-катастрофа" key = "триллер"}

Словарь genre.gzt

Page 50: Tomita 4марта

encoding "utf8";

import "base.proto";import "articles_base.proto";

import "facttypes.proto";

import "genre.gzt";

TAuxDicArticle "фильм"{key = { "tomita:film.cxx" type=CUSTOM }}

Корневой словарь mydic.gzt

Page 51: Tomita 4марта

Фильм Оливера Стоуна "Александр" основан на реальной жизни одного из самых выдающихся людей в истории.

"Титаник" (Titanic) — фильм-катастрофа 1997 года, снятый Джеймсом Кэмероном, в котором показана гибель легендарного лайнера «Титаник». Главные роли в фильме исполнили Кейт Уинслет (Роза Дьюитт Бьюкейтер) и Леонардо Ди Каприо (Джек Доусон).

«Неприкасаемые»(Intouchables) — трагикомедийный фильм 2011 года, основанный на реальных событиях. Главные роли исполняют Франсуа Клюзе и Омар Си, удостоенный за эту актёрскую работу национальной премии «Сезар».

Посмотрим еще раз на входной файл

Page 52: Tomita 4марта

1. После названия фильма на русском может идти оригинальное название в скобках. А может и не идти

2. Между названием и дескриптором может стоять тире

3. Дескриптор может быть как после, так и перед названием

Надо учесть:

Page 53: Tomita 4марта

#encoding "utf-8" #GRAMMAR_ROOT S//Name -> Word<h-reg1, ~fw, nc-agr[1]> Word<h-reg1, nc-agr[1]>*;FilmName -> Word<h-reg1, quoted>;FilmName -> Word<h-reg1, l-quoted> Word* Word<r-quoted>;OriginalName -> Word<h-reg1, lat> Word<lat>*;

Genre -> Word<kwtype="жанр">;Film -> 'фильм';Descr -> Genre | Film;

S -> Descr FilmName interp (Film.Name::not_norm) (LBracket) (OriginalName) (RBracket);S -> FilmName interp (Film.Name::not_norm) (LBracket) (OriginalName) (RBracket) (Hyphen) Descr;

Грамматика film.cxx

Page 54: Tomita 4марта

Результат pretty.html

Page 55: Tomita 4марта

Кстати, оригинальное название и жанр — тоже полезная информация!

Page 56: Tomita 4марта

import "base.proto"; import "facttypes_base.proto";

message Film: NFactType.TFact { required string Name = 1; optional string Genre = 2; optional string OriginalName = 3;}

Описание фактов facttypes.proto

Page 57: Tomita 4марта

Genre -> Word<kwtype="жанр"> interp (Film.Genre);Film -> 'фильм';Descr -> Genre | Film;

S -> Descr FilmName interp (Film.Name::not_norm) (LBracket) (OriginalName interp (Film.OriginalName)) (RBracket);S -> FilmName interp (Film.Name::not_norm) (LBracket) (OriginalName interp (Film.OriginalName)) (RBracket) (Hyphen) Descr;

Грамматика film.cxx

Page 58: Tomita 4марта

Результат pretty.output

Page 59: Tomita 4марта

Извлекаем режиссера

Page 60: Tomita 4марта

1. Родительный падеж после дескриптора

2. Дескриптор + снятый + ФИО в творительном падеже

Нужна морфология

Конструкции:

Page 61: Tomita 4марта

Проверяет значения грамматических характеристик

<gram> = "им, муж, ед"

<gram> = "прич"

<gram> = "brev"

Пометы gram

Page 62: Tomita 4марта

import "base.proto"; import "facttypes_base.proto";

message Film: NFactType.TFact { required string Name = 1; optional string Genre = 2; optional string OriginalName = 3; optional string Director = 4;}

Описание фактов facttypes.proto

Page 63: Tomita 4марта

Name -> Word<h-reg1, ~fw, nc-agr[1]> Word<h-reg1, nc-agr[1]>*;….Director -> Name<gram="род"> interp (Film.Director);Director -> Comma 'снять'<gram="прич"> Name<gram="твор"> interp (Film.Director);

DescrDirector -> Descr (Director); //дескриптор фильма+имя режиссёра

S -> DescrDirector FilmName interp (Film.Name::not_norm) (LBracket) (OriginalName interp (Film.OriginalName)) (RBracket);S -> FilmName interp (Film.Name::not_norm) (LBracket) (OriginalName interp (Film.OriginalName)) (RBracket) (Hyphen) DescrDirector;

Грамматика film.cxx

Page 64: Tomita 4марта

Результат pretty.html

Page 65: Tomita 4марта

Даты

Page 66: Tomita 4марта

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

Например, грамматика дат.

Включение грамматик

Page 67: Tomita 4марта

#encoding "utf-8" #GRAMMAR_ROOT S

Date -> Word<wff="(19[0-9]{2})|(20[0-1][0-9])">;Descr -> 'год';

S -> Date Descr<gram='род'>;

Грамматика date.cxx

Page 68: Tomita 4марта

TAuxDicArticle "фильм"{key = { "tomita:film.cxx" type=CUSTOM }}

TAuxDicArticle "даты"{key = { "tomita:date.cxx" type=CUSTOM }}

Корневой словарь mydic.gzt

Page 69: Tomita 4марта

optional string Date = 5;

facttypes.proto

Page 70: Tomita 4марта

Date -> AnyWord<kwtype="даты">;

Director -> Name<gram="род"> interp (Film.Director);Director -> Comma 'снять'<gram="прич"> Name<gram="твор"> interp (Film.Director);DescrDirector -> Descr (Date interp (Film.Date)) (Director);

Грамматика film.cxx

Page 71: Tomita 4марта

Результат pretty.output

Page 72: Tomita 4марта

Ура, получилось!

Page 73: Tomita 4марта

http://api.yandex.ru/tomita/

Подробнее тут:

Page 74: Tomita 4марта

Что можно извлечь?Томита-парсер

Объект 1 Объект 2 Тип связи

Яндекс Аркадий Волож директор

Объекты в тексте:- даты - адреса - телефоны - ФИО - название товара- действие - тональность…

Связи между этими объектами: - События

- Мнения и отзывы

- Контактные данные

- Объявления

Page 75: Tomita 4марта

В проекте Яндекс.Новости

для геопривязки

сюжетов

для выделениякомпаний и персон

для извлечения адресов

Извлечение фактов в Яндексе

Page 76: Tomita 4марта

В проекте Яндекс.РаботаИзвлечение фактов в Яндексе

для пополнения фильтров

Page 77: Tomita 4марта

http://news.yandex.ru/people/el1tsin_boris.html

даты рождения и смерти

свободные определения

место работы и должность

Page 78: Tomita 4марта

Томита-парсер: Аналоги JAPE (Java Annotation Patterns Engine)

• Конечный автомат над множеством регулярок• Часть GATE – фреймворка для лингвистических задач• http://gate.ac.uk/

AGFL (Affix Grammars Over a Finite Lattice)• Контекстно-свободные грамматики ограничены набором

предопределенных значений категорий• http://www.agfl.cs.ru.nl/

LSPL (LexicoSyntactic Pattern Language)• язык, на котором можно записывать лексико-синтаксические

шаблоны• http://www.lspl.ru/index.php

AIRE (Artificial Intelligence Information Retrieval Engine)• универсальный базовый компонент систем информационного

поиска и автоматического перевода• http://clck.ru/4JKhe

Page 79: Tomita 4марта

Вопросы?

Page 80: Tomita 4марта

Группа извлечения фактовОтдел лингвистических технологий

[email protected]

Дмитрий Панкратов, Наталья Остапук