SlideShare a Scribd company logo
Одесса, 13 мая 2013 года
Татьяна Ландо, Наталья Остапук
Томита-парсер
инструмент для извлечения фактов
Вступление
Инструмент для извлечения фактов
Томита-парсер
• В основе парсера лежит алгоритм GLR – парсинга
(http://ru.wikipedia.org/wiki/GLR-парсер)
• Автор алгоритма - Масару Томита, мы назвали
парсер в его честь.
• Извлечение фактов - извлечение структурированных
данных из текста на естественном языке.
• Извлечение фактов происходит при помощи
контекстно-свободных грамматик и словарей
ключевых слов.
Презентация - http://nlpseminar.ru/lecture69/
Исходные файлы - http://nlpseminar.ru/tomita.zip
Как писать грамматики?
Что делает томита-парсер?
tomitaparser.exe
Тяжёлый труд
облагораживает
хорошего человека
Исходный текст
Томита-парсер
Факты
тяжёлый | труд
хороший | человек
словари
и грамматики
Заполнение «карточки фильма»
информацией, извлеченной из
текста на естественном языке
Наша задача
название
жанр
год
оригинальное название
режиссер
Откуда берется исходный текст?
• из одного текстового файла
• из нескольких текстовых файлов
• папка
• .tar архив
• из STDIN
Фильм Оливера Стоуна "Александр" основан на
реальной жизни одного из самых выдающихся людей в
истории.
«Титаник» (Titanic) — фильм-катастрофа 1997
года, снятый Джеймсом Кэмероном, в котором
показана гибель легендарного лайнера «Титаник».
Главные роли в фильме исполнили Кейт Уинслет (Роза
Дьюитт Бьюкейтер) и Леонардо Ди Каприо (Джек
Доусон).
«Неприкасаемые» (Intouchables) — трагикомедийный
фильм 2011 года, основанный на реальных событиях.
Главные роли исполняют Франсуа Клюзе и Омар
Си, удостоенный за эту актёрскую работу национальной
премии «Сезар».
Исходный текст input.txt
Грамматика состоит из правил, которые
описывают цепочки
В правиле есть левая и правая
часть, разделенные символом ->
В левой части стоит один нетерминал, правая
состоит из терминалов и нетерминалов.
S -> Noun;
Правила в Томите
Превращаем правила в
грамматику
#encoding "utf-8"
#GRAMMAR_ROOT S
S -> Noun;
Грамматика film.cxx
encoding "utf8";
import "base.proto"; всегда
import "articles_base.proto"; копируем
TAuxDicArticle "фильм" эту статью будем
{ запускать
key = { "tomita:film.cxx" type=CUSTOM }
}
Корневой словарь mydic.gzt
● Откуда читать текст? - секция Input (File, ...)
● В какой кодировке? - Input.Encoding
● Куда записывать факты? - секция Output
● В каком формате и кодировке? - там же
+
● Какие грамматики запускать? - Articles
● Какие факты записывать? - Facts
Конфигурация парсера
encoding "utf8";
TTextMinerConfig {
Dictionary = "mydic.gzt"; корневой словарь
(обязательный параметр)
Input = {File = "input.txt"} входной файл
Output = {File = "output.txt" сюда записываем
Format = text} результат
Articles = [ ссылка на статью
{ Name = "фильм" } из словаря
]
}
Файл конфигурации config.proto
Запускаем!
Windows:
tomitaparser.exe config.proto
Linux / *BSD (bash)
./tomitaparser config.proto
Фильм Оливера Стоуна "Александр" основан на реальной
жизни одного из самых выдающихся людей в истории .
"Титаник" ( Titanic ) — фильм-катастрофа 1997 года
, снятый Джеймсом Кэмероном , в котором показана
гибель легендарного лайнера "Титаник" .
Главные роли в фильме исполнили Кейт Уинслет ( Роза
Дьюитт Бьюкейтер ) и Леонардо Ди Каприо ( Джек Доусон
) .
«Неприкасаемые" ( Intouchables ) — трагикомедийный
фильм 2011 года , основанный на реальных событиях .
Главные роли исполняют Франсуа Клюзе и Омар Си
, удостоенный за эту актёрскую работу национальной
премии "Сезар" .
Результат output.txt
Но если мы посмотрим на
отладочный вывод…
encoding "utf8";
TTextMinerConfig {
Dictionary = "mydic.gzt";
PrettyOutput = "pretty.html";
Input = {File = "input.txt"}
Output = {File = "output.txt"
Format = text}
Articles = [ { Name = "фильм" } ]
}
Файл конфигурации config.proto
Подробный результат pretty.html
Регистр: h-reg1, h-reg2, h-reg3, l-reg
Многословная сущность: mw
Первое слово в предложении: fw
Вершина синтаксической группы: rt
И другие
Пометы-ограничения
Теперь мы можем выделять
имена собственные
#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
Не обязательно писать одно и
то же несколько раз
* — символ повторяется 0 или более раз
S -> Adj* Noun;
=
S -> Noun;
S -> Adj Noun;
S -> Adj Adj Noun;
…
Позволяют получить более удобную сокращенную
запись правил грамматики
Операторы
+ — символ повторяется 1 или более раз
S -> Adj+ Noun;
=
S -> Adj Noun;
S -> Adj Adj Noun;
S -> Adj Adj Adj Noun;
…
Операторы
() — символ входит в правило 0 или 1 раз
S -> (Adj) Noun;
=
S -> Noun;
S -> Adj Noun;
Операторы
#encoding "utf-8"
#GRAMMAR_ROOT S
Name -> Word<h-reg1, ~fw> Word<h-reg1>*;
S -> Name;
Грамматика film.cxx
Имена собственные уже не
стыдно интерпретировать в
факты
import "base.proto"; всегда
import "facttypes_base.proto"; копируем
message Film: NFactType.TFact имя факта
{
required string Title = 1; поля факта
}
Описание фактов
facttypes.proto
encoding "utf8";
import "base.proto";
import "articles_base.proto";
import "facttypes.proto";
TAuxDicArticle "фильм"
{
key = { "tomita:film.cxx" type=CUSTOM }
}
Корневой словарь mydic.gzt
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
#encoding "utf-8"
#GRAMMAR_ROOT S
Name -> Word<h-reg1, ~fw> Word<h-reg1>*;
S -> Name interp (Film.Title);
Грамматика film.cxx
Фильм Оливера Стоуна "Александр" основан на реальной жизни одного из
самых выдающихся людей в истории .
Film
{
Name = Оливер Стоуна "Александр“
}
"Титаник" ( Titanic ) — фильм-катастрофа 1997 года , снятый Джеймсом
Кэмероном , в котором показана гибель легендарного лайнера "Титаник" .
Film
{
Name = Titanic
}
Film
{
Name = 1997
}
Film
{
Name = Джеймс Кэмероном
}
Результат output.txt
Главные роли в фильме исполнили Кейт Уинслет (
Роза Дьюитт Бьюкейтер ) и Леонардо Ди Каприо (
Джек Доусон ) .
Film { Name = Кейт Уинслет}
Film { Name = Роза Дьюитт Бьюкейтер}
Film { Name = Леонардо Ди Каприо}
Film { Name = Джек Доусон}
Результат output.txt
Результат pretty.html
?,,?
Что это?
Согласование
По роду, числу и падежу: gnc-agr
По числу и падежу: nc-agr
По роду и падежу: gc-agr
По падежу: c-agr
И другие
Согласование
#encoding "utf-8"
#GRAMMAR_ROOT S
Name -> Word<h-reg1, ~fw, nc-agr[1]> Word<h-reg1, nc-
agr[1]>*;
S -> Name interp (Film.Title);
Грамматика film.cxx
Результат pretty.html
Переходим к делу
#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.Title);
Файл film.cxx
Выделяем название фильма
Результат pretty.html
1. «Неприкасаемые» нормализовались
2. В качестве названия фильма
выделилось название судна и
название премии
Что нам не нравится?
Файл 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.Title::not_norm);
Результаты pretty.html
Нужно, чтобы перед или после названия фильма
стоял дескриптор.
Для дескрипторов удобнее всего создать словарь.
Решаем проблему лишних
срабатываний
Словари
encoding "utf8";
TAuxDicArticle "жанр"
{
key = "комедия"
key = "комедийный фильм"
key = "трагикомедийный фильм"
key = "фильм ужасов"
key = "фильм-катастрофа"
key = "триллер"
}
Словарь genre.gzt
encoding "utf8";
import "base.proto";
import "articles_base.proto";
import "facttypes.proto";
import "genre.gzt";
TAuxDicArticle "фильм"
{
key = { "tomita:film.cxx" type=CUSTOM }
}
Корневой словарь mydic.gzt
Фильм Оливера Стоуна "Александр" основан на реальной
жизни одного из самых выдающихся людей в истории.
"Титаник" (Titanic) — фильм-катастрофа 1997 года, снятый
Джеймсом Кэмероном, в котором показана гибель
легендарного лайнера «Титаник». Главные роли в фильме
исполнили Кейт Уинслет (Роза Дьюитт Бьюкейтер) и
Леонардо Ди Каприо (Джек Доусон).
«Неприкасаемые»(Intouchables) — трагикомедийный
фильм 2011 года, основанный на реальных событиях.
Главные роли исполняют Франсуа Клюзе и Омар Си,
удостоенный за эту актёрскую работу национальной
премии «Сезар».
Посмотрим еще раз на входной
файл
1. После названия фильма на русском может идти
оригинальное название в скобках. А может и не
идти
2. Между названием и дескриптором может стоять
тире
3. Дескриптор может быть как после, так и перед
названием
Надо учесть:
#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.Title::not_norm) (LBracket)
(OriginalName) (RBracket);
S -> FilmName interp (Film.Title::not_norm) (LBracket) (OriginalName)
(RBracket) (Hyphen) Descr;
Грамматика film.cxx
Результат pretty.html
Кстати, оригинальное
название и жанр — тоже
полезная информация!
import "base.proto";
import "facttypes_base.proto";
message Film: NFactType.TFact
{
required string Title = 1;
optional string Style = 2;
optional string OriginalTitle = 3;
}
Описание фактов
facttypes.proto
Genre -> Word<kwtype="жанр"> interp (Film.Style);
Film -> 'фильм';
Descr -> Genre | Film;
S -> Descr FilmName interp (Film.Title::not_norm)
(LBracket) (OriginalName interp (Film.OriginalTitle))
(RBracket);
S -> FilmName interp (Film.Title::not_norm)
(LBracket) (OriginalName interp (Film.OriginalTitle))
(RBracket) (Hyphen) Descr;
Грамматика film.cxx
Результат pretty.output
Извлекаем режиссера
1. Родительный падеж после дескриптора
2. Дескриптор + снятый + ФИО в творительном
падеже
Нужна морфология
Конструкции:
Проверяет значения грамматических характеристик
<gram> = "им, муж, ед"
<gram> = "прич"
<gram> = "brev"
Пометы gram
import "base.proto";
import "facttypes_base.proto";
message Film: NFactType.TFact
{
required string Title = 1;
optional string Style = 2;
optional string OriginalTitle = 3;
optional string DirectorFio = 4;
}
Описание фактов
facttypes.proto
Name -> Word<h-reg1, ~fw, nc-agr[1]> Word<h-reg1, nc-agr[1]>*;
….
Director -> Name<gram="род"> interp (Film.DirectorFio);
Director -> Comma 'снять'<gram="прич"> Name<gram="твор">
interp (Film.DirectorFio);
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
Результат pretty.html
Даты
Правила, которые могут использоваться во многих
грамматиках, целесообразно выделять в отдельную
грамматику.
Например, грамматика дат.
Включение грамматик
#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
TAuxDicArticle "фильм"
{
key = { "tomita:film.cxx" type=CUSTOM }
}
TAuxDicArticle "даты"
{
key = { "tomita:date.cxx" type=CUSTOM }
}
Корневой словарь mydic.gzt
optional string Year = 5;
facttypes.proto
Date -> AnyWord<kwtype="даты">;
Director -> Name<gram="род"> interp (Film.DirectorFio);
Director -> Comma 'снять'<gram="прич">
Name<gram="твор"> interp (Film.DirectorFio);
DescrDirector -> Descr (Date interp (Film.Year)) (Director);
Грамматика film.cxx
Результат pretty.output
http://api.yandex.ru/tomita/
Подробнее тут:
http://download.cdn.yandex.net/tomita/tomita-ukr-
linux64.bz2 - Linux
http://download.cdn.yandex.net/tomita/tomita-ukr-
win32.zip - Windows
Томита-парсер для украинского
языка можно скачать здесь:
Ура, получилось!
Что можно извлечь?
Томита-парсер
Объект 1 Объект 2 Тип связи
Яндекс Аркадий Волож директор
Объекты в тексте:
- даты
- адреса
- телефоны
- ФИО
- название товара
- действие
- тональность…
Связи между этими объектами:
- События
- Мнения и отзывы
- Контактные данные
- Объявления
В проекте Яндекс.Новости
для геопривязки
сюжетов
для выделения
компаний и персон
для извлечения адресов
Извлечение фактов в Яндексе
В проекте Яндекс.Работа
Извлечение фактов в Яндексе
для пополнения фильтров
http://news.yandex.ru/people/el1tsin_boris.html
даты рождения и смерти
свободные определения
место работы и должность
Томита-парсер: Аналоги
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
Вопросы?
Группа извлечения фактов
Отдел лингвистических технологий
tomita@yandex-team.ru
Татьяна Ландо, Наталья Остапук

More Related Content

What's hot

Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python Meetup
 
Groovy jug-moscow-part 1
Groovy jug-moscow-part 1Groovy jug-moscow-part 1
Groovy jug-moscow-part 1
Evgeny Borisov
 
Oop java.generics
Oop java.genericsOop java.generics
Oop java.generics
muqaddas_m
 
DOC Использование особенностей языка запросов поиска Яндекса для исследований...
DOC Использование особенностей языка запросов поиска Яндекса для исследований...DOC Использование особенностей языка запросов поиска Яндекса для исследований...
DOC Использование особенностей языка запросов поиска Яндекса для исследований...
Eugene Trofimenko
 
Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей. Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей.
Levon Avakyan
 
Трущобы Application Security
Трущобы Application SecurityТрущобы Application Security
Трущобы Application Security
Positive Development User Group
 
Реляционные базы данных
Реляционные базы данныхРеляционные базы данных
Реляционные базы данных
Levon Avakyan
 
Spring data jee conf
Spring data jee confSpring data jee conf
Spring data jee conf
Evgeny Borisov
 
Универсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHPУниверсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHP
Иван Кочуркин
 
Проект
ПроектПроект
Стажировка 2016-08-11 01 Юлия Ашаева. Техники тест-анализа
Стажировка 2016-08-11 01 Юлия Ашаева. Техники тест-анализаСтажировка 2016-08-11 01 Юлия Ашаева. Техники тест-анализа
Стажировка 2016-08-11 01 Юлия Ашаева. Техники тест-анализа
SmartTools
 
Дмитрий Прокопцев "Memory-mapped storage: ещё один подход к сериализации данных"
Дмитрий Прокопцев "Memory-mapped storage: ещё один подход к сериализации данных"Дмитрий Прокопцев "Memory-mapped storage: ещё один подход к сериализации данных"
Дмитрий Прокопцев "Memory-mapped storage: ещё один подход к сериализации данных"
Yandex
 
Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014
Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014
Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014it-people
 
NLTK и Python для работы с текстами
NLTK и Python для работы с текстами  NLTK и Python для работы с текстами
NLTK и Python для работы с текстами
NLProc.by
 
встроен функции
встроен функциивстроен функции
встроен функции
LidiKashka
 
Корпусная лингвистика:
компиляция корпуса устной речи
Корпусная лингвистика:
компиляция корпуса устной речиКорпусная лингвистика:
компиляция корпуса устной речи
Корпусная лингвистика:
компиляция корпуса устной речи
NLProc.by
 
Лекция 3: Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 3: Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 3: Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 3: Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Mikhail Kurnosov
 

What's hot (17)

Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
 
Groovy jug-moscow-part 1
Groovy jug-moscow-part 1Groovy jug-moscow-part 1
Groovy jug-moscow-part 1
 
Oop java.generics
Oop java.genericsOop java.generics
Oop java.generics
 
DOC Использование особенностей языка запросов поиска Яндекса для исследований...
DOC Использование особенностей языка запросов поиска Яндекса для исследований...DOC Использование особенностей языка запросов поиска Яндекса для исследований...
DOC Использование особенностей языка запросов поиска Яндекса для исследований...
 
Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей. Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей.
 
Трущобы Application Security
Трущобы Application SecurityТрущобы Application Security
Трущобы Application Security
 
Реляционные базы данных
Реляционные базы данныхРеляционные базы данных
Реляционные базы данных
 
Spring data jee conf
Spring data jee confSpring data jee conf
Spring data jee conf
 
Универсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHPУниверсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHP
 
Проект
ПроектПроект
Проект
 
Стажировка 2016-08-11 01 Юлия Ашаева. Техники тест-анализа
Стажировка 2016-08-11 01 Юлия Ашаева. Техники тест-анализаСтажировка 2016-08-11 01 Юлия Ашаева. Техники тест-анализа
Стажировка 2016-08-11 01 Юлия Ашаева. Техники тест-анализа
 
Дмитрий Прокопцев "Memory-mapped storage: ещё один подход к сериализации данных"
Дмитрий Прокопцев "Memory-mapped storage: ещё один подход к сериализации данных"Дмитрий Прокопцев "Memory-mapped storage: ещё один подход к сериализации данных"
Дмитрий Прокопцев "Memory-mapped storage: ещё один подход к сериализации данных"
 
Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014
Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014
Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014
 
NLTK и Python для работы с текстами
NLTK и Python для работы с текстами  NLTK и Python для работы с текстами
NLTK и Python для работы с текстами
 
встроен функции
встроен функциивстроен функции
встроен функции
 
Корпусная лингвистика:
компиляция корпуса устной речи
Корпусная лингвистика:
компиляция корпуса устной речиКорпусная лингвистика:
компиляция корпуса устной речи
Корпусная лингвистика:
компиляция корпуса устной речи
 
Лекция 3: Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 3: Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 3: Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 3: Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 

More from Natalia Ostapuk

Nlp seminar.kolomiyets.dec.2013
Nlp seminar.kolomiyets.dec.2013Nlp seminar.kolomiyets.dec.2013
Nlp seminar.kolomiyets.dec.2013Natalia Ostapuk
 
Mt engine on nlp semniar
Mt engine on nlp semniarMt engine on nlp semniar
Mt engine on nlp semniarNatalia Ostapuk
 
Клышинский 8.12
Клышинский 8.12Клышинский 8.12
Клышинский 8.12Natalia Ostapuk
 
место онтологий в современной инженерии на примере Iso 15926 v1
место онтологий в современной инженерии на примере Iso 15926 v1место онтологий в современной инженерии на примере Iso 15926 v1
место онтологий в современной инженерии на примере Iso 15926 v1Natalia Ostapuk
 
2011 04 troussov_graph_basedmethods-weakknowledge
2011 04 troussov_graph_basedmethods-weakknowledge2011 04 troussov_graph_basedmethods-weakknowledge
2011 04 troussov_graph_basedmethods-weakknowledgeNatalia Ostapuk
 

More from Natalia Ostapuk (20)

Gromov
GromovGromov
Gromov
 
Aist academic writing
Aist academic writingAist academic writing
Aist academic writing
 
Aist academic writing
Aist academic writingAist academic writing
Aist academic writing
 
Ponomareva
PonomarevaPonomareva
Ponomareva
 
Nlp seminar.kolomiyets.dec.2013
Nlp seminar.kolomiyets.dec.2013Nlp seminar.kolomiyets.dec.2013
Nlp seminar.kolomiyets.dec.2013
 
Mt engine on nlp semniar
Mt engine on nlp semniarMt engine on nlp semniar
Mt engine on nlp semniar
 
Tomita 4марта
Tomita 4мартаTomita 4марта
Tomita 4марта
 
Konyushkova
KonyushkovaKonyushkova
Konyushkova
 
Braslavsky 13.12.12
Braslavsky 13.12.12Braslavsky 13.12.12
Braslavsky 13.12.12
 
Клышинский 8.12
Клышинский 8.12Клышинский 8.12
Клышинский 8.12
 
Zizka synasc 2012
Zizka synasc 2012Zizka synasc 2012
Zizka synasc 2012
 
Zizka immm 2012
Zizka immm 2012Zizka immm 2012
Zizka immm 2012
 
Zizka aimsa 2012
Zizka aimsa 2012Zizka aimsa 2012
Zizka aimsa 2012
 
Analysis by-variants
Analysis by-variantsAnalysis by-variants
Analysis by-variants
 
место онтологий в современной инженерии на примере Iso 15926 v1
место онтологий в современной инженерии на примере Iso 15926 v1место онтологий в современной инженерии на примере Iso 15926 v1
место онтологий в современной инженерии на примере Iso 15926 v1
 
Text mining
Text miningText mining
Text mining
 
Additional2
Additional2Additional2
Additional2
 
Additional1
Additional1Additional1
Additional1
 
Seminar1
Seminar1Seminar1
Seminar1
 
2011 04 troussov_graph_basedmethods-weakknowledge
2011 04 troussov_graph_basedmethods-weakknowledge2011 04 troussov_graph_basedmethods-weakknowledge
2011 04 troussov_graph_basedmethods-weakknowledge
 

Tomita одесса

  • 1. Одесса, 13 мая 2013 года Татьяна Ландо, Наталья Остапук Томита-парсер инструмент для извлечения фактов
  • 3. Инструмент для извлечения фактов Томита-парсер • В основе парсера лежит алгоритм GLR – парсинга (http://ru.wikipedia.org/wiki/GLR-парсер) • Автор алгоритма - Масару Томита, мы назвали парсер в его честь. • Извлечение фактов - извлечение структурированных данных из текста на естественном языке. • Извлечение фактов происходит при помощи контекстно-свободных грамматик и словарей ключевых слов.
  • 6. Что делает томита-парсер? tomitaparser.exe Тяжёлый труд облагораживает хорошего человека Исходный текст Томита-парсер Факты тяжёлый | труд хороший | человек словари и грамматики
  • 7. Заполнение «карточки фильма» информацией, извлеченной из текста на естественном языке Наша задача название жанр год оригинальное название режиссер
  • 8. Откуда берется исходный текст? • из одного текстового файла • из нескольких текстовых файлов • папка • .tar архив • из STDIN
  • 9. Фильм Оливера Стоуна "Александр" основан на реальной жизни одного из самых выдающихся людей в истории. «Титаник» (Titanic) — фильм-катастрофа 1997 года, снятый Джеймсом Кэмероном, в котором показана гибель легендарного лайнера «Титаник». Главные роли в фильме исполнили Кейт Уинслет (Роза Дьюитт Бьюкейтер) и Леонардо Ди Каприо (Джек Доусон). «Неприкасаемые» (Intouchables) — трагикомедийный фильм 2011 года, основанный на реальных событиях. Главные роли исполняют Франсуа Клюзе и Омар Си, удостоенный за эту актёрскую работу национальной премии «Сезар». Исходный текст input.txt
  • 10. Грамматика состоит из правил, которые описывают цепочки В правиле есть левая и правая часть, разделенные символом -> В левой части стоит один нетерминал, правая состоит из терминалов и нетерминалов. S -> Noun; Правила в Томите
  • 12. #encoding "utf-8" #GRAMMAR_ROOT S S -> Noun; Грамматика film.cxx
  • 13. encoding "utf8"; import "base.proto"; всегда import "articles_base.proto"; копируем TAuxDicArticle "фильм" эту статью будем { запускать key = { "tomita:film.cxx" type=CUSTOM } } Корневой словарь mydic.gzt
  • 14. ● Откуда читать текст? - секция Input (File, ...) ● В какой кодировке? - Input.Encoding ● Куда записывать факты? - секция Output ● В каком формате и кодировке? - там же + ● Какие грамматики запускать? - Articles ● Какие факты записывать? - Facts Конфигурация парсера
  • 15. encoding "utf8"; TTextMinerConfig { Dictionary = "mydic.gzt"; корневой словарь (обязательный параметр) Input = {File = "input.txt"} входной файл Output = {File = "output.txt" сюда записываем Format = text} результат Articles = [ ссылка на статью { Name = "фильм" } из словаря ] } Файл конфигурации config.proto
  • 17. Фильм Оливера Стоуна "Александр" основан на реальной жизни одного из самых выдающихся людей в истории . "Титаник" ( Titanic ) — фильм-катастрофа 1997 года , снятый Джеймсом Кэмероном , в котором показана гибель легендарного лайнера "Титаник" . Главные роли в фильме исполнили Кейт Уинслет ( Роза Дьюитт Бьюкейтер ) и Леонардо Ди Каприо ( Джек Доусон ) . «Неприкасаемые" ( Intouchables ) — трагикомедийный фильм 2011 года , основанный на реальных событиях . Главные роли исполняют Франсуа Клюзе и Омар Си , удостоенный за эту актёрскую работу национальной премии "Сезар" . Результат output.txt
  • 18. Но если мы посмотрим на отладочный вывод…
  • 19. encoding "utf8"; TTextMinerConfig { Dictionary = "mydic.gzt"; PrettyOutput = "pretty.html"; Input = {File = "input.txt"} Output = {File = "output.txt" Format = text} Articles = [ { Name = "фильм" } ] } Файл конфигурации config.proto
  • 21. Регистр: h-reg1, h-reg2, h-reg3, l-reg Многословная сущность: mw Первое слово в предложении: fw Вершина синтаксической группы: rt И другие Пометы-ограничения
  • 22. Теперь мы можем выделять имена собственные
  • 23. #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
  • 24. Не обязательно писать одно и то же несколько раз
  • 25. * — символ повторяется 0 или более раз S -> Adj* Noun; = S -> Noun; S -> Adj Noun; S -> Adj Adj Noun; … Позволяют получить более удобную сокращенную запись правил грамматики Операторы
  • 26. + — символ повторяется 1 или более раз S -> Adj+ Noun; = S -> Adj Noun; S -> Adj Adj Noun; S -> Adj Adj Adj Noun; … Операторы
  • 27. () — символ входит в правило 0 или 1 раз S -> (Adj) Noun; = S -> Noun; S -> Adj Noun; Операторы
  • 28. #encoding "utf-8" #GRAMMAR_ROOT S Name -> Word<h-reg1, ~fw> Word<h-reg1>*; S -> Name; Грамматика film.cxx
  • 29. Имена собственные уже не стыдно интерпретировать в факты
  • 30. import "base.proto"; всегда import "facttypes_base.proto"; копируем message Film: NFactType.TFact имя факта { required string Title = 1; поля факта } Описание фактов facttypes.proto
  • 31. encoding "utf8"; import "base.proto"; import "articles_base.proto"; import "facttypes.proto"; TAuxDicArticle "фильм" { key = { "tomita:film.cxx" type=CUSTOM } } Корневой словарь mydic.gzt
  • 32. 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
  • 33. #encoding "utf-8" #GRAMMAR_ROOT S Name -> Word<h-reg1, ~fw> Word<h-reg1>*; S -> Name interp (Film.Title); Грамматика film.cxx
  • 34. Фильм Оливера Стоуна "Александр" основан на реальной жизни одного из самых выдающихся людей в истории . Film { Name = Оливер Стоуна "Александр“ } "Титаник" ( Titanic ) — фильм-катастрофа 1997 года , снятый Джеймсом Кэмероном , в котором показана гибель легендарного лайнера "Титаник" . Film { Name = Titanic } Film { Name = 1997 } Film { Name = Джеймс Кэмероном } Результат output.txt
  • 35. Главные роли в фильме исполнили Кейт Уинслет ( Роза Дьюитт Бьюкейтер ) и Леонардо Ди Каприо ( Джек Доусон ) . Film { Name = Кейт Уинслет} Film { Name = Роза Дьюитт Бьюкейтер} Film { Name = Леонардо Ди Каприо} Film { Name = Джек Доусон} Результат output.txt
  • 39. По роду, числу и падежу: gnc-agr По числу и падежу: nc-agr По роду и падежу: gc-agr По падежу: c-agr И другие Согласование
  • 40. #encoding "utf-8" #GRAMMAR_ROOT S Name -> Word<h-reg1, ~fw, nc-agr[1]> Word<h-reg1, nc- agr[1]>*; S -> Name interp (Film.Title); Грамматика film.cxx
  • 43. #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.Title); Файл film.cxx Выделяем название фильма
  • 45. 1. «Неприкасаемые» нормализовались 2. В качестве названия фильма выделилось название судна и название премии Что нам не нравится?
  • 46. Файл 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.Title::not_norm);
  • 48. Нужно, чтобы перед или после названия фильма стоял дескриптор. Для дескрипторов удобнее всего создать словарь. Решаем проблему лишних срабатываний
  • 50. encoding "utf8"; TAuxDicArticle "жанр" { key = "комедия" key = "комедийный фильм" key = "трагикомедийный фильм" key = "фильм ужасов" key = "фильм-катастрофа" key = "триллер" } Словарь genre.gzt
  • 51. encoding "utf8"; import "base.proto"; import "articles_base.proto"; import "facttypes.proto"; import "genre.gzt"; TAuxDicArticle "фильм" { key = { "tomita:film.cxx" type=CUSTOM } } Корневой словарь mydic.gzt
  • 52. Фильм Оливера Стоуна "Александр" основан на реальной жизни одного из самых выдающихся людей в истории. "Титаник" (Titanic) — фильм-катастрофа 1997 года, снятый Джеймсом Кэмероном, в котором показана гибель легендарного лайнера «Титаник». Главные роли в фильме исполнили Кейт Уинслет (Роза Дьюитт Бьюкейтер) и Леонардо Ди Каприо (Джек Доусон). «Неприкасаемые»(Intouchables) — трагикомедийный фильм 2011 года, основанный на реальных событиях. Главные роли исполняют Франсуа Клюзе и Омар Си, удостоенный за эту актёрскую работу национальной премии «Сезар». Посмотрим еще раз на входной файл
  • 53. 1. После названия фильма на русском может идти оригинальное название в скобках. А может и не идти 2. Между названием и дескриптором может стоять тире 3. Дескриптор может быть как после, так и перед названием Надо учесть:
  • 54. #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.Title::not_norm) (LBracket) (OriginalName) (RBracket); S -> FilmName interp (Film.Title::not_norm) (LBracket) (OriginalName) (RBracket) (Hyphen) Descr; Грамматика film.cxx
  • 56. Кстати, оригинальное название и жанр — тоже полезная информация!
  • 57. import "base.proto"; import "facttypes_base.proto"; message Film: NFactType.TFact { required string Title = 1; optional string Style = 2; optional string OriginalTitle = 3; } Описание фактов facttypes.proto
  • 58. Genre -> Word<kwtype="жанр"> interp (Film.Style); Film -> 'фильм'; Descr -> Genre | Film; S -> Descr FilmName interp (Film.Title::not_norm) (LBracket) (OriginalName interp (Film.OriginalTitle)) (RBracket); S -> FilmName interp (Film.Title::not_norm) (LBracket) (OriginalName interp (Film.OriginalTitle)) (RBracket) (Hyphen) Descr; Грамматика film.cxx
  • 61. 1. Родительный падеж после дескриптора 2. Дескриптор + снятый + ФИО в творительном падеже Нужна морфология Конструкции:
  • 62. Проверяет значения грамматических характеристик <gram> = "им, муж, ед" <gram> = "прич" <gram> = "brev" Пометы gram
  • 63. import "base.proto"; import "facttypes_base.proto"; message Film: NFactType.TFact { required string Title = 1; optional string Style = 2; optional string OriginalTitle = 3; optional string DirectorFio = 4; } Описание фактов facttypes.proto
  • 64. Name -> Word<h-reg1, ~fw, nc-agr[1]> Word<h-reg1, nc-agr[1]>*; …. Director -> Name<gram="род"> interp (Film.DirectorFio); Director -> Comma 'снять'<gram="прич"> Name<gram="твор"> interp (Film.DirectorFio); 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
  • 67. Правила, которые могут использоваться во многих грамматиках, целесообразно выделять в отдельную грамматику. Например, грамматика дат. Включение грамматик
  • 68. #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
  • 69. TAuxDicArticle "фильм" { key = { "tomita:film.cxx" type=CUSTOM } } TAuxDicArticle "даты" { key = { "tomita:date.cxx" type=CUSTOM } } Корневой словарь mydic.gzt
  • 70. optional string Year = 5; facttypes.proto
  • 71. Date -> AnyWord<kwtype="даты">; Director -> Name<gram="род"> interp (Film.DirectorFio); Director -> Comma 'снять'<gram="прич"> Name<gram="твор"> interp (Film.DirectorFio); DescrDirector -> Descr (Date interp (Film.Year)) (Director); Грамматика film.cxx
  • 74. http://download.cdn.yandex.net/tomita/tomita-ukr- linux64.bz2 - Linux http://download.cdn.yandex.net/tomita/tomita-ukr- win32.zip - Windows Томита-парсер для украинского языка можно скачать здесь:
  • 76. Что можно извлечь? Томита-парсер Объект 1 Объект 2 Тип связи Яндекс Аркадий Волож директор Объекты в тексте: - даты - адреса - телефоны - ФИО - название товара - действие - тональность… Связи между этими объектами: - События - Мнения и отзывы - Контактные данные - Объявления
  • 77. В проекте Яндекс.Новости для геопривязки сюжетов для выделения компаний и персон для извлечения адресов Извлечение фактов в Яндексе
  • 78. В проекте Яндекс.Работа Извлечение фактов в Яндексе для пополнения фильтров
  • 79. http://news.yandex.ru/people/el1tsin_boris.html даты рождения и смерти свободные определения место работы и должность
  • 80. Томита-парсер: Аналоги 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
  • 82. Группа извлечения фактов Отдел лингвистических технологий tomita@yandex-team.ru Татьяна Ландо, Наталья Остапук