Проблемы

  • Где взять источники с описанием микротопонимов Москвы
  • Словари, GLR-parser, машинное обучение?
  • Что делать с контекстами вроде "Он свернул с Маяковской на Тверскую"?
  • Как оценивать точность, полноту? Какой будет baseline?

Источники

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

12 стульев
В круге первом
Война и мир
Дети Арбата
Доктор Живаго

Дом на Набережной
Коронация, или Последний из романов
Мастер и Маргарита
Метро 2033
Метро 2034
Москва 2042
Москва Андрея Белого: Московский чудак, Москва под ударом, Маски
Московская сага
Ночной Дозор (роман)
Распознавание образов (роман)
Свечка (роман)
Смерть Ахиллеса
Статский советник (роман)
Теория Невероятности
Generation «П»

Томита-парсер от Яндекса - БОЛЬ

Особенно под OS X

  • Для адекватной работы с парсером нужно его собирать руками из исходников
  • Очень печально с документацией
  • Под OS X все очень плохо. Даже если удастся сбилдить проект, отсутствуют биндинги для mystem под OS X :( Единственный реальный вариант - Docker
  • Очень прожорливый: запаситесь 4 ядрами и 8 гб ОЗУ на контейнер (на 5 романов ~12-15мб)
  • Доступен только бинарник, тяжело интегрировать в пайплайн

Томита-парсер.Боль

TAbbreviation "д."
{
	key = { "abbreviation_д." type = CUSTOM }
	text = "д."
	type = NewerEOS
}
TAbbreviation "корп."
{
	key = { "abbreviation_корп." type = CUSTOM }
	text = "корп."
	type = NewerEOS
}
TAbbreviation "ул."
{
	key = { "abbreviation_ул." type = CUSTOM }
	text = "ул."
	type = NewerEOS
}

Томита-парсер.Боль

StreetW -> 'проспект' | 'проезд' | 'улица' | 'шоссе' | 'набережная' | 'площадь';
StreetSokr -> 'пр' | 'пр.' | 'просп' | 'просп.' | 'пр-д' | 'ул' | 'ул.' | 'ш' | 'ш.' | 'наб' | 'наб.' | 'пл' | 'пл.';

StreetDescr -> StreetW | StreetSokr;

StreetNameNoun -> (Adj<gnc-agr[1]>) Word<gnc-agr[1],rt> (Word<gram="род">);

NumberW_1 -> AnyWord<wff=/[1-9]?[0-9]-?((ый)|(ий)|(ой)|й)/> {outgram="муж,ед,им"};
NumberW_2 -> AnyWord<wff=/[1-9]?[0-9]-?((ая)|(яя)|(ья)|я)/> {outgram="жен,ед,им"};
NumberW_3 -> AnyWord<wff=/[1-9]?[0-9]-?((ее)|(ье)|(ое)|е)/> {outgram="сред,ед,им"};

NumberW -> NumberW_1 | NumberW_2 | NumberW_3;

StreetNameAdj -> Adj<h-reg1> Adj*;
StreetNameAdj -> NumberW<gnc-agr[1]> Adj<gnc-agr[1]>;


Street -> StreetDescr interp (Street.Descr) StreetNameNoun<gram="род", h-reg1> interp (Street.StreetName::not_norm);
Street -> StreetDescr interp (Street.Descr) StreetNameNoun<gram="им", h-reg1> interp (Street.StreetName::not_norm);

Street -> StreetNameAdj<gnc-agr[1]> interp (Street.StreetName) StreetW<gnc-agr[1]> interp (Street.Descr);
Street -> StreetNameAdj interp (Street.StreetName) StreetSokr interp (Street.Descr);
Street -> StreetW<gnc-agr[1]> interp (Street.Descr) StreetNameAdj<gnc-agr[1]> interp (Street.StreetName);
Street -> StreetSokr interp (Street.Descr) StreetNameAdj interp (Street.StreetName);

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

Нашлось 120 упоминаний улиц

Большой Пушкинской  улица
Денисовская   улица
Красная   площадь
Советская   улица
Советский   улица
Ленских событий   улица
Малая Арнаутской  улица
Малая Арнаутской  улица
Ленских событий   улица
Маркса  улица
Ленских событий   улица
Парижской Коммуны   площадь

 

Кооперативная   улица
Плеханова   улица
Плеханова   улица
Английская  набережная
Плеханова   улица
Лассаля   улица
замечательная   улица
Лубянская   площадь
Театральная   площадь
Лубянская   площадь
Арбатская   площадь
Театральная   площадь

 

Плеханова   улица
Плеханова   ул.
Виноградная   улица
Виноградная   улица
Театральная   площадь
Свердлова   площадь
Свердлова   площадь
Рождественская  улица
Свердловская  площадь

Нашлось 120 упоминаний улиц

{ 'Английская  набережная': 2,
  'Арбатская   площадь': 9,
  'Белинского  улица': 1,
  'Болотная  площадь': 1,
  'Большая Лубянскую   улица': 1,
  'Большой Калужской   улица': 1,
  'Большой Пушкинской  улица': 1,
  'Веснина   улица': 1,
  'Виноградная   улица': 2,
  'Владыкинский  шоссе': 1,
  'Герцена   улица': 3,
  'Горького  улица': 1,
  'Грановского   улица': 2,
  'Денисовская   улица': 1,
  'Дзержинского  улица': 1,
  'Драматический театр им  улица': 1,
  'Замоскворецкий  улица': 1,
  'Им  улица': 4,
  'Калужская   улица': 3,
  'Каменщиков  улица': 1,
  'Кооперативная   улица': 1,
  'Котельническая  набережная': 1,
  'Красная   площадь': 9,
  'Кремлевская   площадь': 1,
  'Кутузова  улица': 1,
  'Лассаля   улица': 1,
  'Ленских событий   улица': 3,
  'Лубянская   площадь': 5,
  'Малая Арнаутской  улица': 4,
  'Маркса  улица': 1,
  'Матросская Тишина   улица': 1,
  'Миусская  площадь': 1,
  'Москворецкая  улица': 1,
  'Москвы  улица': 4,
  'Москвы-реки   набережная': 1,
  'Мясницкая   улица': 1,
  'Наполеона   проезд': 1,
  'Неаполя   улица': 1,
  'Низкий арочные  проезд': 1,
  'Ногина  площадь': 1,
  'Парижской Коммуны   площадь': 1,
  'Петербурга  улица': 1,
  'Петровка  улица': 2,
  'Плеханова   ул.': 1,
  'Плеханова   улица': 4,
  'Поварской   улица': 1,
  'Покровка  улица': 1,
  'Рижского вокзала  площадь': 1,
  'Рождественская  улица': 1,
  'Саша  улица': 1,
  'Свердлова   площадь': 2,
  'Свердловская  площадь': 1,
  'Сенатская   площадь': 2,
  'Смоленская  площадь': 3,
  'Советская   улица': 1,
  'Советский   улица': 1,
  'Солянка   улица': 1,
  'Старая  площадь': 1,
  'Страстной   площадь': 1,
  'Таганская   площадь': 1,
  'Театральная   площадь': 5,
  'Театральный   проезд': 1,
  'Тимофея   улица': 1,
  'Триумфальная  площадь': 1,
  'Шота Руставели  проспект': 1,
  'вся   улица': 1,
  'замечательная   улица': 1,
  'неосвещенная  улица': 1,
  'окраинный московские  улица': 1,
  'привозная   площадь': 1 }

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

Проблемы

Французы   вошли   в   ворота   и   стали   размещаться   лагерем   на   Сенатской   площади   .   EOS 

Солдаты   выкидывали   стулья   из   окон   сената   на   площадь   и   раскладывали   огни   .   EOS 

Другие   отряды   проходили   через   Кремль   и   размещались   по   Маросейке   ,   Лубянке   ,   Покровке   .   EOS 

Третьи   размещались   по   Вздвиженке   ,   Знаменке   ,   Никольской   ,   Тверской   .   EOS 

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

Проблемы

Самый   большой   дом   на   Арбате     между   Никольским   и   Денежным   переулками   ,   теперь   они   называются   Плотников   переулок   и   улица   Веснина   .   EOS 

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

Проблемы

Как-то   он   встретил   на   улице   Тимофея   .   EOS 

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

Проблемы

По   утрам   ,   выпив   из   причудливого   (   морозного   ,   с   жилкой   )   стакана   свою   порцию   горячего   молока   ,   поданного   Клавдией   Ивановной   ,   он   выходил   из   полутемного   домика   на   просторную   ,   полную   диковинного   весеннего   света   улицу   "Им   .   тов   .   EOS 

 

Губернского"   .   EOS 

Улица "Им

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

Проблемы

Неосвещенная   улица   пустыми   глазами   смотрела   в   комнаты   .   EOS 

Комнаты   отвечали   тем   же   взглядом   .   EOS 

Вся   улица   была   застлана   тучей   черного   дыма   .   EOS 

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

Проблемы

Так   опять   проел   он   в   пути   свою   вторую   шубу   и   пиджачную   пару   ,   и   на   улицах   Москвы   появился   в   серой   папахе   ,   обмотках   и   вытертой   солдатской   шинели   ,   которая   превратилась   без   пуговиц   ,   споротых   до   одной   ,   в   запашной   арестантский   халат   .   EOS 

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

Проблемы

А   вот   и   Мясницкая   .   EOS 

 

Замечательная   улица   .   EOS 

 

Здесь   можно   подохнуть   с   голоду   .   EOS 

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

Проблемы

Окраинные   московские   улицы   тянулись   за   окнами   .   EOS 

Метод

  • Берем Томита-парсер и локальный справочник
  • Смотрим на предложение источника. Сначала ищем слова из нашего словаря, затем скармливаем контекст Томите, сохраняем все контексты улиц в районе 5 слов
  • Строим вектора полученных контекстов, кластеризуем
  • Самые одинокие/далекие кластеры - вероятные кандидаты на ошибку.
  • Улицами из самых популярных кластеров дополняем локальный словарь
  • Обходим источник еще раз

Метод

Что делать с контекстами вроде "Он свернул с Маяковской на Тверскую"?

Пока что кажется, что решит только локальный словарь.

 

С машинным обучением проблема в том, что:

- Нет корректно размеченных данных для обучения. Обучаемся только на результатах парсинга

- Сравнивать контексты - это в данном случае очень затратно. Очень. Нужны очень грамотные критерии для того, чтобы сравнивать только неоднозначные случаи - способ выявления этой неоднозначности (претендент - отсутствие дескрипторов и признака "с заглавной буквы")

Что с точностью и полнотой?

Все плохо.

Спасибо за внимание!

toponyms

By Artur Kenzhaev