Занимаюсь задачкой автоматической нормализации адресов. На первый взгляд - все просто. Есть справочник налоговой инспекции, ФИАС, в котором содержатся все существующие регионы, районы, населенные пункты и улицы России. Надо просто преобразовать в нужный вид и все готово.
В подобного рода задачках самый простой и очевидный способ дает весьма неплохие результаты относительно вложенных сил. Скажем, получается корректно нормализовать 75% адресов. Этот результат можно получить, скажем дня за 2-3. И как всегда, нет ничего удивительного, что на прирост в 20% уходит несколько месяцев.
Поначалу кажется, что модель данных адресов проста - есть регион, район, населенный пункт, улица и дом. Но потом выясняется, что оказывается, один населенный пункт может содержаться в другом. Например "г. Москва, поселок Мосрентген".
А еще нужно учитывать что русский - флективный язык. И "поселок Октябрьский" легко может оказаться "деревней Октябрьской" или даже чем-нибудь вроде "колхоза имени Красного Октября". И традиционная проблема - непоследовательность данных. Например, в Старом Осколе есть "ул. XXII партсъезда" и в нем же есть "ул. XXV съезда КПСС".
Для меня стало открытием, что оказывается, весьма часто в одном и том же городе есть две улицы с одинаковым названием, но разными типами. В Астрахани например есть "улица Николая Островского" и "проезд Николая Островского".
Неожиданным было и то, что в названии может содержаться тип улицы, и он отличается от формального типа улицы. Например, в Москве есть Мичуринский проспект. С ним все хорошо, это - честный проспект. А еще есть улица "Мичуринский проспект. Олимпийская деревня".
Как известно, подготовка и формализация данных - самый тяжелый процесс при решении задач автоматического анализа.
На днях купил родителям новую DECT-трубку. Раньше считалось, что хорошо кроме радиотрубки иметь еще и обычный стационарый телефон. Если вдруг в доме отключат электричество, то связь все равно бы была.
Сейчас это стало бессмысленным потому, что телефонную сеть перевели на GPON, который все равно дохнет без электричества. Ну и мобильные телефоны теперь есть у каждого.
Ходил сегодня послушать, что делали наши команды в The Allen AI Science Challenge. Все команды использовали примерно одинаковый набор техник: сначала индексировали разными способами коллекции документов в lucene, потом искали в построенных индексах пары вопрос - ответ (по нескольким индексам) и как-то сливали вместе полученный результат. Кто-то строил индексы на википедии, кто-то на материалах ck12, кто-то еще нашел учебники, и проиндексировал их. Ну и индексы также строились на различных представлениях: отдельных статьях, параграфах и предложениях.
Занятно, что во-первых "наш" хакатон был вроде как по deep learning, а в итоге его никто не использовал (или использовали без особого эффекта вследствие малого объема данных), а во-вторых все докладчики использовали IR-style подход, в котором лингвистика практически полностью игнорируется.
Кажется, что родной язык - это очень просто, ведь ты же на нем разговариваешь. Из-за этого создается ощущение, что анализ текстов - простая область, надо только чуть-чуть постараться. Но очень неожиданно узнать, что оказывается в русском языке не 6 падежей, а больше. "Лишние" падежи есть просто не у всех слов. И в целом нет ничего такого, что бы ты, как носитель языка, не знал. Просто обычно над этим не задумываешься.
И особенно забавно рассказывать это другим. Оказывается, не один я такой, не знающий.
Java местами очень поражает. Вот в JDK7 в регулярках появились именованные группы. Очень полезная фича, на мой взгляд, поскольку можно извлекать данные без привязки к порядку групп. Реализуется тоже очень просто. Надо всего лишь сохранять отображение name -> groupNumber, что в общем-то и сделано.
Все круто, но как определить, какие группы в некотором шаблоне есть? А никак. Есть Pattern::namedGroups(), но он имеет default visiblity, и так просто не вызвать.