Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Tomita

9,386 views

Published on

  • Здравствуйте! Очень интересная статья. Но при парсинге html-файла все вываливается с ошибкой: Error in CProcessor: Init blablabla.html with RdOnly!
    Из-за чего это может быть?
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Tomita

  1. 1. Томита-парсеринструмент для извлечения фактовДмитрий Панкратов, Наталья Остапук,Виктор БочаровNLPseminar, Санкт-Петербург, 15 декабря 2012 года
  2. 2. Вступление
  3. 3. Томита-парсерИнструмент для извлечения фактов• В основе парсера лежит алгоритм GLR – парсинга (http://ru.wikipedia.org/wiki/GLR-парсер)• Автор алгоритма - Масару Томита, мы назвали парсер в его честь.• Извлечение фактов - извлечение структурированных данных из текста на естественном языке.• Извлечение фактов происходит при помощи контекстно-свободных грамматик и словарей ключевых слов.
  4. 4. Томита-парсерЧто можно извлечь?Объекты в тексте: Связи между этими объектами:- даты - События- адреса- телефоны - Мнения и отзывы- ФИО- название товара - Контактные данные- действие- тональность… - Объявления Объект 1 Объект 2 Тип связи Яндекс Аркадий Волож директор
  5. 5. Извлечение фактов в ЯндексеВ проекте Яндекс.Новости для извлечения адресов для геопривязки сюжетов для выделения компаний и персон
  6. 6. Извлечение фактов в ЯндексеВ проекте Яндекс.Работа для пополнения фильтров
  7. 7. даты рождения и смерти свободные определения место работы и должностьhttp://news.yandex.ru/people/el1tsin_boris.html
  8. 8. Томита-парсер: Аналоги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.phpAIRE (Artificial Intelligence Information Retrieval Engine) • универсальный базовый компонент систем информационного поиска и автоматического перевода • http://clck.ru/4JKhe
  9. 9. Как запустить Томита-парсер?
  10. 10. Что делает томита-парсер? Томита-парсерТяжёлый трудоблагораживает тяжёлый | труд tomitaparser.exe хороший | человекхорошего человека Исходный текст Факты словари и грамматики
  11. 11. Откуда берется исходный текст?• из одного текстового файла • один файл — один документ • одна строка — один документ (dpl)• из нескольких текстовых файлов • папка • .tar архив• из STDINКодировка символов: UTF-8, Windows-1251
  12. 12. Вывод фактовКуда сохраняются факты?• в файл• в STDOUTФорматы:• для автоматической обработки • Facts XML • Google Protobuf• чтобы «смотреть глазами» • текстовый форматКодировка символов: UTF-8, Windows-1251
  13. 13. Конфигурация парсера● Откуда читать текст?● В какой кодировке?● Куда записывать факты?● В каком формате и кодировке? +● Какие грамматики запускать?● Какие факты записывать?
  14. 14. Что делает Томита-парсер? Томита-парсерТяжёлый трудоблагораживает тяжёлый | труд tomitaparser.exe хороший | человекхорошего человека Исходный текст Факты словари файл и грамматики конфигурации
  15. 15. Запуск парсера Windows: tomitaparser.exe config.proto Linux / *BSD (bash) ./tomitaparser config.proto
  16. 16. Файл конфигурации● Формат — Google Protobuf● Кодировка — UTF-8● Обязательные параметры: – корневой словарь (Dictionary = …)● Передаётся в качестве аргумента при запуске парсера
  17. 17. Простой файл конфигурации encoding "utf8"; TTextMinerConfig { Dictionary = "mydic.gzt"; }
  18. 18. Простой файл конфигурацииДействия парсера: • скомпилирует и загрузит словарь mydic.gzt • прочитает текст из STDINДля полноценной работы нужно указать: • статьи корневого словаря, которые нужно запустить • факты, которые нужно записать
  19. 19. Какие грамматики и статьисловаря запускать?
  20. 20. СловариСловари состоят из статей • Формат — Google Protobuf • Кодировка — UTF-8Корневой словарь • всегда один • содержит ссылки на остальные словари и грамматики
  21. 21. Статьи корневого словаря Articles = [ { Name = "статья1" } { Name = "статья2" } // можно указать // несколько статей ]
  22. 22. Корневой словарьencoding "utf8";import "base.proto";import "articles_base.proto";TAuxDicArticle "грамматика1"{ key = { "tomita:first.cxx" type=CUSTOM }}
  23. 23. Файл конфигурации encoding "utf8"; TTextMinerConfig { Dictionary = "mydic.gzt"; Articles = [ { Name = "грамматика1" } ] }
  24. 24. Что делает Томита-парсер? Томита-парсерТяжёлый трудоблагораживает тяжёлый | труд tomitaparser.exe хороший | человекхорошего человека Исходный текст Факты корневой файл словарь конфигурации другие словари и грамматики
  25. 25. Какие факты записывать?
  26. 26. Факты Facts = [ { Name = "факт1" } { Name = "факт2" } // можно указать // несколько фактов ]
  27. 27. encoding "utf8";TTextMinerConfig { Dictionary = "mydic.gzt"; Articles = [ { Name = "дата" } ] Facts = [ { Name = "Date" } ]}
  28. 28. Куда и в каком форматезаписывать факты?
  29. 29. Секция Output● File — в какой файл сохранять● Format — в каком формате – xml, protobuf или text● Mode: append/overwrite● EncodingПо умолчанию:STDOUT, xml, append, utf-8
  30. 30. ... Facts = [ { Name = "Date" } ] Output = { File = facts.txt; Format = "text"; }}
  31. 31. Откуда читать текст?
  32. 32. Секция Input● File / Dir● Format (plain или html)● Type (no, dpl, tar, …)● EncodingПо умолчанию:STDIN, plain, no, utf-8
  33. 33. ... Input = { File = test.txt; }}
  34. 34. Конфигурация парсера● Откуда читать текст? - секция Input (File, ...)● В какой кодировке? - Input.Encoding● Куда записывать факты? - секция Output● В каком формате и кодировке? - там же +● Какие грамматики запускать? - Articles● Какие факты записывать? - Facts
  35. 35. Что ещё?
  36. 36. Хозяйке на заметку:Ускорение работы парсера • NumThreads — количество потоковОтладка словарей и грамматик • PrettyOutput — подробности разбора • PrintTree — деревья разбора • PrintRules — сработавшие правилаРазное • ForceRecompile — перекомпиляция грамматик
  37. 37. Как писать грамматики?
  38. 38. Наша задачаЗаполнение «карточки фильма»информацией, извлеченной изтекста на естественном языке название жанр год оригинальное название режиссер
  39. 39. Исходный текст input.txtФильм Оливера Стоуна "Александр" основан нареальной жизни одного из самых выдающихся людей вистории.«Титаник» (Titanic) — фильм-катастрофа 1997года, снятый Джеймсом Кэмероном, в которомпоказана гибель легендарного лайнера «Титаник».Главные роли в фильме исполнили Кейт Уинслет (РозаДьюитт Бьюкейтер) и Леонардо Ди Каприо (ДжекДоусон).«Неприкасаемые» (Intouchables) — трагикомедийныйфильм 2011 года, основанный на реальных событиях.Главные роли исполняют Франсуа Клюзе и ОмарСи, удостоенный за эту актёрскую работу национальнойпремии «Сезар».
  40. 40. Правила в ТомитеГрамматика состоит из правил, которыеописывают цепочкиВ правиле есть левая и правая часть,разделенные символом ->В левой части стоит один нетерминал, праваясостоит из терминалов и нетерминалов. S -> Noun;
  41. 41. Превращаем правила вграмматику
  42. 42. Грамматика film.cxx#encoding "utf-8"#GRAMMAR_ROOT SS -> Noun;
  43. 43. Корневой словарь mydic.gztencoding "utf8";import "base.proto"; всегдаimport "articles_base.proto"; копируемTAuxDicArticle "фильм" эту статью будем{ запускатьkey = { "tomita:film.cxx" type=CUSTOM }}
  44. 44. Файл конфигурации config.protoencoding "utf8";TTextMinerConfig { Dictionary = "mydic.gzt"; корневой словарь Input = {File = "input.txt";} входной файл Output = {File = "output.txt"; сюда записываем Format = text;} результат Articles = [ ссылка на статью { Name = "фильм" } из словаря ]}
  45. 45. Запускаем!tomitaparser.exe config.proto
  46. 46. Результат output.txtФильм Оливера Стоуна "Александр" основан на реальнойжизни одного из самых выдающихся людей в истории ."Титаник" ( Titanic ) — фильм-катастрофа 1997 года ,снятый Джеймсом Кэмероном , в котором показанагибель легендарного лайнера "Титаник" .Главные роли в фильме исполнили Кейт Уинслет ( РозаДьюитт Бьюкейтер ) и Леонардо Ди Каприо ( Джек Доусон).«Неприкасаемые" ( Intouchables ) — трагикомедийныйфильм 2011 года , основанный на реальных событиях .Главные роли исполняют Франсуа Клюзе и Омар Си ,удостоенный за эту актёрскую работу национальнойпремии "Сезар" .
  47. 47. Но если мы добавимотладочный вывод…
  48. 48. Файл конфигурации config.protoencoding "utf8";TTextMinerConfig { Dictionary = "mydic.gzt"; PrettyOutput = "pretty.html"; Input = {File = "input.txt";} Output = {File = "output.txt"; Format = text} Articles = [ { Name = "фильм" } ]}
  49. 49. Подробный результат pretty.html
  50. 50. Пометы-ограниченияРегистр: h-reg1, h-reg2, h-reg3, l-regМногословная сущность: mwПервое слово в предложении: fwВершина синтаксической группы: rtИ другие
  51. 51. Теперь мы можем выделятьимена собственные
  52. 52. Грамматика film.cxx#encoding "utf-8"#GRAMMAR_ROOT SName -> 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;
  53. 53. Не обязательно писать одно ито же несколько раз
  54. 54. ОператорыПозволяют получить более удобную сокращеннуюзапись правил грамматики* — символ повторяется 0 или более раз S -> Adj* Noun; = S -> Noun; S -> Adj Noun; S -> Adj Adj Noun; …
  55. 55. Операторы+ — символ повторяется 1 или более раз S -> Adj+ Noun; = S -> Adj Noun; S -> Adj Adj Noun; S -> Adj Adj Adj Noun; …
  56. 56. Операторы() — символ входит в правило 0 или 1 раз S -> (Adj) Noun; = S -> Noun; S -> Adj Noun;
  57. 57. Грамматика film.cxx#encoding "utf-8"#GRAMMAR_ROOT SName -> Word<h-reg1, ~fw> Word<h-reg1>*;S -> Name;
  58. 58. Имена собственные уже нестыдно интерпретировать вфакты
  59. 59. Описание фактовfacttypes.protoimport "base.proto"; всегдаimport "facttypes_base.proto"; копируемmessage Film: NFactType.TFact имя факта{ required string Name = 1; поля факта}
  60. 60. Корневой словарь mydic.gztencoding "utf8";import "base.proto";import "articles_base.proto";import "facttypes.proto";TAuxDicArticle "фильм"{key = { "tomita:film.cxx" type=CUSTOM }}
  61. 61. Файл конфигурации config.protoencoding "utf8";TTextMinerConfig { Dictionary = "mydic.gzt"; PrettyOutput = "pretty.html"; Input = {File = "input.txt";} Output = {File = "output.txt"; Format = text;} Articles = [ { Name = "фильм" } ] Facts = [ { Name = "Film" } ]}
  62. 62. Грамматика film.cxx#encoding "utf-8“#GRAMMAR_ROOT SName -> Word<h-reg1, ~fw> Word<h-reg1>*;S -> Name interp (Film.Name);
  63. 63. Результат output.txtФильм Оливера Стоуна "Александр" основан на реальной жизни одного изсамых выдающихся людей в истории . Film { Name = Оливер Стоуна "Александр“ }"Титаник" ( Titanic ) — фильм-катастрофа 1997 года , снятый ДжеймсомКэмероном , в котором показана гибель легендарного лайнера "Титаник" . Film { Name = Titanic } Film { Name = 1997 } Film { Name = Джеймс Кэмероном }
  64. 64. Результат output.txtГлавные роли в фильме исполнили Кейт Уинслет (Роза Дьюитт Бьюкейтер ) и Леонардо Ди Каприо (Джек Доусон ) .Film { Name = Кейт Уинслет}Film { Name = Роза Дьюитт Бьюкейтер}Film { Name = Леонардо Ди Каприо}Film { Name = Джек Доусон}
  65. 65. Результат pretty.html
  66. 66. Что это? ? ?,,
  67. 67. Согласование
  68. 68. СогласованиеПо роду, числу и падежу: gnc-agrПо числу и падежу: nc-agrПо роду и числу: gc-agrПо падежу: n-agrИ другие
  69. 69. Грамматика film.cxx#encoding "utf-8"#GRAMMAR_ROOT SName -> Word<h-reg1, ~fw, nc-agr[1]> Word<h-reg1, nc-agr[1]>*;S -> Name interp (Film.Name);
  70. 70. Результат pretty.html
  71. 71. Переходим к делу
  72. 72. Выделяем название фильмаФайл film.cxx#encoding "utf-8"#GRAMMAR_ROOT S//Name -> Word<h-reg1, ~fw, nc-agr[1]> Word<h-reg1, nc-agr[1]>*;FilmName -> AnyWord<h-reg1, l-quoted> Word*(Word<r-quoted>);S -> FilmName interp (Film.Name);
  73. 73. Результат pretty.html
  74. 74. Что нам не нравится?1. «Неприкасаемые» нормализовались2. В качестве названия фильма выделилось название судна и название премии
  75. 75. Решаем проблему нормализацииФайл film.cxx#encoding "utf-8"#GRAMMAR_ROOT S//Name -> Word<h-reg1, ~fw, nc-agr[1]> Word<h-reg1,nc-agr[1]>*;FilmName -> AnyWord<h-reg1, l-quoted> Word*<r-quoted>;S -> FilmName interp (Film.Name::not_norm);
  76. 76. Результаты pretty.html
  77. 77. Решаем проблему лишнихсрабатыванийНужно, чтобы перед или после названия фильмастоял дескриптор.Для дескрипторов удобнее всего создать словарь.
  78. 78. Словари
  79. 79. Словарь genre.gztencoding "utf8";TAuxDicArticle "жанр"{ key = "комедия" key = "комедийный фильм" key = "трагикомедийный фильм" key = "фильм ужасов" key = "фильм-катастрофа" key = "триллер"}
  80. 80. Корневой словарь mydic.gztencoding "utf8";import "base.proto";import "articles_base.proto";import "facttypes.proto";import "genre.gzt";TAuxDicArticle "фильм"{key = { "tomita:film.cxx" type=CUSTOM }}
  81. 81. Посмотрим еще раз на входнойфайлФильм Оливера Стоуна "Александр" основан на реальнойжизни одного из самых выдающихся людей в истории."Титаник" (Titanic) — фильм-катастрофа 1997 года, снятыйДжеймсом Кэмероном, в котором показана гибельлегендарного лайнера «Титаник». Главные роли в фильмеисполнили Кейт Уинслет (Роза Дьюитт Бьюкейтер) иЛеонардо Ди Каприо (Джек Доусон).«Неприкасаемые»(Intouchables) — трагикомедийныйфильм 2011 года, основанный на реальных событиях.Главные роли исполняют Франсуа Клюзе и Омар Си,удостоенный за эту актёрскую работу национальнойпремии «Сезар».
  82. 82. Надо учесть:1. После названия фильма на русском может идти оригинальное название в скобках. А может и не идти2. Между названием и дескриптором может стоять тире3. Дескриптор может быть как после, так и перед названием
  83. 83. Грамматика film.cxx#encoding "utf-8"#GRAMMAR_ROOT S//Name -> Word<h-reg1, ~fw, nc-agr[1]> Word<h-reg1, nc-agr[1]>*;FilmName -> AnyWord<h-reg1, l-quoted> Word* (Word<r-quoted>);OriginalName -> (LBracket) Word<h-reg1, lat> Word<lat>* (RBracket);Genre -> Word<kwtype="жанр">;Film -> фильм;Descr -> Genre | Film;S -> Descr FilmName interp (Film.Name::not_norm) (OriginalName);S -> FilmName interp (Film.Name::not_norm) (OriginalName) (Hyphen)Descr;
  84. 84. Результат pretty.html
  85. 85. Кстати, оригинальноеназвание и жанр — тожеполезная информация!
  86. 86. Описание фактовfacttypes.protoimport "base.proto";import "facttypes_base.proto";message Film: NFactType.TFact{ required string Name = 1; optional string Genre = 2; optional string OriginalName = 3;}
  87. 87. Грамматика film.cxx#encoding "utf-8"#GRAMMAR_ROOT S//Name -> Word<h-reg1, ~fw, nc-agr[1]> Word<h-reg1, nc-agr[1]>*;FilmName -> AnyWord<h-reg1, l-quoted> Word<r-quoted>*;OriginalName -> Word<h-reg1, lat> Word<lat>*;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;
  88. 88. Результат pretty.output
  89. 89. Извлекаем режиссера
  90. 90. Конструкции:1. Родительный падеж после дескриптора2. Дескриптор + снятый + ФИО в творительном падеже Нужна морфология
  91. 91. Пометы gramПроверяет значения грамматических характеристикотдельно для каждого<gram> = "им, муж, ед"<gram> = "прич"<gram> = "brev"
  92. 92. Описание фактовfacttypes.protoimport "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;}
  93. 93. Грамматика film.cxxName -> 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;
  94. 94. Результат pretty.html
  95. 95. Даты
  96. 96. Включение грамматикПравила, которые могут использоваться во многихграмматиках, целесообразно выделять в отдельнуюграмматику.Например, грамматика дат.
  97. 97. Грамматика date.cxx#encoding "utf-8"#GRAMMAR_ROOT SDate -> Word<wff="(19[0-9]{2})|(20[0-1][0-9])">;Descr -> год;S -> Date Descr<gram=род>;
  98. 98. Корневой словарь mydic.gztTAuxDicArticle "фильм"{key = { "tomita:film.cxx" type=CUSTOM }}TAuxDicArticle "даты"{key = { "tomita:date.cxx" type=CUSTOM }}
  99. 99. facttypes.protooptional string Date = 5;
  100. 100. Грамматика film.cxxDate -> AnyWord<kwtype="даты">;Director -> Name<gram="род"> interp (Film.Director);Director -> Comma снять<gram="прич">Name<gram="твор"> interp (Film.Director);DescrDirector -> Descr (Date interp (Film.Date)) (Director);
  101. 101. Результат pretty.output
  102. 102. Ура, получилось!
  103. 103. Подробнее тут:http://api.yandex.ru/tomita/
  104. 104. Вопросы?
  105. 105. Дмитрий Панкратов, Наталья Остапук,Виктор БочаровГруппа извлечения фактовОтдел лингвистических технологийtomita@yandex-team.ru

×