Ахантер не всегда был таким, каким он выглядит для пользователей сейчас. Он непрерывно эволюционирует. Эта эволюция не сильно заметна, если просто рассматривать историю его версий, поэтому в этой статье мы решили выделить поколения сервиса и рассказать, какие изменения происходили в Ахантере при их смене.
Начальной точкой отсчета для нашего сервиса является 2007 год. Тогда мы занимались исследованием и разработкой методов распознавания контактных данных в произвольных текстовых документах. Решалась исключительно научно-исследовательская задача для целей, напрямую не связанных со стандартизацией и исправлением контактных данных как таковых. В первую очередь нужно было распознавать и извлекать топонимы в текстах новостного характера, чтобы при обработке новостей иметь под рукой сведения об адресных объектах, к которым, так или иначе, относится текст новости.
В этот период как такого Ахантера в том виде, в котором он представлен сейчас, не существовало. Был некий задел в виде математических моделей и методов и их экспериментальная реализация. Часть этих методов была включена в результаты кандидатской диссертации одного из разработчиков Ахантера.
Часть подходов по извлечению информации из текстов, разработанных в той диссертации, показала, что есть категория задач, в рамках которых распознавание целевых данных в тексте должно происходить с использованием эталонной базы. То есть, чтобы обнаружить некий объект в тексте, необходимо заранее иметь эталонное описание этого объекта в эталонной базе. На основании этого эталона осуществляется сканирование текста в поисках упоминаний объекта.
Мы решили детально исследовать данный подход и разработали метод извлечения данных по эталону, который в 2009 году обсудили на конференции RCDL и опубликовали в соответствующей статье. К слову сказать, данный метод, так или иначе, используют все наши конкуренты при разработке аналогичных Ахантеру сервисов, просто потому, что других альтернатив этому методу пока никто не придумал.
Чтобы апробировать данный метод, мы взяли эталонный справочник почтовых адресов России (КЛАДР) и разработали онлайн-сервис, позволяющий обнаруживать в произвольных текстах упоминания почтовых адресов, имеющихся в КЛАДРе. Исходя из своего назначения, сервис получил название «Охотник за адресами». Англоязычная версия этого названия «Address hunter» была сокращена до «Ahunter» и сейчас используется в транслитерированном виде в качестве сокращенного названия сервиса - Ахантер.
«Охотник за адресами» стал уникальным в своем роде сервисом, ничего аналогичного в Интернете к моменту его запуска не существовало. Да и сейчас подобных онлайн сервисов, позволяющих распознавать почтовые адреса в текстах документов, в Интернете нет.
В нулевом поколении Ахантера присутствовала бонусная функция обработки текста, состоящего из одной строки и содержащего почтовый адрес. Эта функция фактически позволяла обработать адрес, записанный в произвольной форме, и привести его к стандартному виду, принятому в КЛАДР. В отличие от основной функции распознавания в сплошных текстах, данная бонусная функция учитывала наличие опечаток и неточностей, которые человек допускает при написании почтового адреса.
Реализация этой функции оказалась весьма удачной, поскольку позволяла приводить к нормальному виду адрес, записанный в произвольной форме и с произвольным следованием адресных компонентов. В результате обработки адрес приводился к эталонной форме, поэтому дополнительно данная бонусная функция фактически решала задачу восстановления незаполненных адресных полей и почтового индекса.
В данный период своего развития «Охотник за адресами» работал в Интернете в основном для того, чтобы мы могли исследовать узкие места нашего метода, нарабатывать статистику использования и получать отзывы от пользователей. Мы активно анализировали оценки, которые пользователи сервиса ставили при обработке того или иного адреса, учитывали их и вносили улучшения в алгоритмы и в сам метод.
По мере того, как Ахантер набирал популярность, к нам начали обращаться пользователи, основной задачей которых была именно стандартизация почтовых адресов. Оказалось, что у многих компаний почтовые адреса клиентов и контрагентов хранятся в виде произвольных строк, которые к тому же со временем теряют актуальность. Какие-то адреса уже перестали существовать, у каких-то изменился индекс, а у некоторых его изначально не было, потому что клиенты его просто не помнили.
Получилось, что бонусная функция сервиса по нормализации и исправлению адресов стала более востребованной, нежели основная функция по распознаванию адресов в текстах. Мы начали развивать сервис в этом направлении. Добавили возможность пакетной онлайн обработки файлов с почтовыми адресами. Теперь наши пользователи смогли загружать Excel-файлы на сервис, запускать их обработку и по ее завершению скачивать результат в виде таблицы с проверенными и исправленными адресами. Одним из первых пользователей сервиса в таком режиме стала компания МТС.
Кроме этого мы открыли доступ к API сервиса. Ранее API использовался исключительно для наших внутренних нужд, теперь же мы предоставили возможность пользователям автоматически выполнять обработку адресов, выполняя API вызовы к нашему сервису из своих приложений через Интернет. Одним из крупных пользователей в таком качестве стала компания Связной. Также мы подготовили внедряемую версию сервиса – ahunterES, которую наши крупные заказчики могли устанавливать в своей инфраструктуре и использовать без необходимости отсылать запросы через Интернет. В таком виде мы осуществили внедрение сервиса в таких компаниях как Верофарм, Ростелеком, Интерфакс, Русский стандарт страхование.
В этот период мы обнаружили аналоги нашего сервиса за рубежом. Похожую задачу по приведению в порядок почтовых адресов решал аналогичный сервис www.correctaddress.com, разработанный в США.
Также в этот период мы начали расширять возможности сервиса в части обработки контактных данных. Кроме почтовых адресов была добавлена возможность по стандартизации телефонных номеров. За основу мы взяли план нумерации России, так что наш сервис получил возможность определять по номеру телефона оператора связи, а также географическую принадлежность номера. Мы соединили обработку адресов и телефонов, это позволило уточнять почтовый адрес по телефону и наоборот – восстанавливать пропущенный код города у номера, на основании информации о почтовом адресе.
Оказалось, что и в этом направлении аналогичных онлайн сервисов в России также не существует.
В 2014 году мы начали работать над распознаванием ФИО в текстах. В соответствии с нашим подходом, нам требовалась эталонная база фамилий, имен и отчеств. В отличие от почтовых адресов и телефонов, единого открытого справочника ФИО не существовало. Кроме того, мы решили, что кроме распознавания компонентов ФИО было бы хорошо определять пол и национальность человека по его фамилии, имени и отчеству.
Для этих целей мы разработали обучаемую систему по сбору из открытых источников биографий известных персон. Мы остановились на биографиях, поскольку в них присутствуют реально существующие ФИО, к тому же эти ФИО записаны без ошибок. В рамках этой системы сбора мы реализовали метод автоматического распознавания пола персоны. Данный метод позволяет определить пол человека на основе анализа сопутствующей информации, представленной в тексте его биографии. Аналогичным образом мы встроили в эту систему сбора алгоритмы извлечения информации о принадлежности персон этническим группам. Разработанная система позволила нам построить и наполнить эталонную базу ФИО людей, в которой каждому имени, фамилии и отчеству поставлены в соответствие пол и национальность. Эту базу мы постоянно пополняем и обогащаем, в настоящий момент в ней представлены этносы практически со всего мира. На данный момент эта база является уникальной для России, аналогичные разработки нам не известны.
Построение базы ФИО позволило нам реализовать в рамках Ахантера наш метод извлечения по эталону применительно к фамилиям, именам и отчествам персон. В результате на сервисе появилась функция стандартизации ФИО, которая в сплошной строке выделяет отдельные компоненты фамилии, имени и отчества, исправляет опечатки, допущенные при написании этих элементов, а также снабжает распознанное ФИО информацией о поле и национальности человека.
Также в этом поколении сервиса появились функции автоматического дополнения для вводимых почтовых адресов, фамилий, имен и отчеств персон. Эти функции предлагают пользователю подсказки, когда тот вводит почтовый адрес или ФИО, так что у пользователя появляется возможность не выполнять ввод до конца, а вместо этого выбрать один из предложенных вариантов. Мы добавили эти функции в API сервиса и сделали их абсолютно бесплатными, чтобы любой желающий мог их использовать у себя на веб-сайте.
При реализации этих функций нам потребовалось максимально оптимизировать обработку, поскольку подсказки должны были формироваться в режиме реального времени. Медленные, долго думающие подсказки, никому не интересны, поскольку пользователь просто не станет ждать, пока сервис предложит варианты автодополнения. Чтобы формирование подсказок выполнялось мгновенно, нам пришлось полностью переработать архитектуру сервиса, фактически это привело к тому, что сервис был переписан полностью с нуля на C++.
В настоящее время наш сервис является самым быстрым при формировании подсказок для адресов. Все существующие самописные решения, встречающиеся на некоторых крупных сайтах, работают на пару порядков медленнее. Более того, при формировании подсказок по ФИО мы реализовали умный механизм, учитывающий пол и национальность вводимых данных. Если пользователь ввел немецкое имя, то сервис предложит в качестве подсказок немецкие фамилии.
Во втором поколении Ахантера мы также добавили функции определения GPS-координат по указанному адресу. Фактически мы реализовали собственный геокодер. Для этих целей нам потребовалось разработать отдельную систему по сбору и извлечению координатной информации из открытых карт OpenStreetMap, а также обучаемую систему по отображению (мэппингу) извлеченной из карт информации на объекты КЛАДР и ФИАС. Это была весьма сложная разработка, поскольку с одной стороны в силу размеров карты России требовалось максимально автоматизировать все этапы работы системы извлечения и мэппинга, а с другой стороны любая неточность в мэппинге приведет к тому, что какая-нибудь лесная тропинка, обозначенная на карте, будет по ошибке отображена на улицу Лесная ближайшей деревни или поселка. Здесь нам пришлось задействовать в полном объеме методы машинного обучения, чтобы система научилась выполнять правильный мэппинг по аналогии с тем, как это делает человек. Для обучения системы нам потребовалось подготовить порядка 50 тысяч обучающих примеров.
Сейчас наш геокодер является неотъемлемой частью сервиса, так что географические координаты возвращаются для любого почтового адреса наравне с прочей информацией в результате его стандартизации посредством API или при пакетной обработке в личном кабинете сервиса.
Ахантер третьего поколения развивается под знаком повышения надежности. Опыт работы предыдущих поколений сервиса показал, что узким местом в надежности являются дата-центры, на серверах которых размещается Ахантер. Исходя из нашей статистики, подавляющее большинство отказов нашего сервиса возникало по вине провайдера, у которого арендуется серверное оборудование для размещения сервиса. За восемь лет работы сервиса мы насчитали не более пяти сбоев, обусловленных нашими ошибками. Остальные случаи приходятся на технические проблемы с оборудованием и инфраструктурой дата-центров. Поэтому в третьем поколении Ахантера мы сделали упор на реализации кластерной архитектуры, позволяющей одновременно функционировать нескольким экземплярам сервиса на серверах в разных дата-центрах.
Такой подход позволяет полностью реплицировать все данные пользователей на независимых друг от друга серверах. Репликация всех данных, которыми располагает сервис, выполняется в режиме реального времени. Например, всякий раз, когда пользователь пополняет свой баланс, информация о поступивших деньгах автоматически тиражируется на всех серверах. Поэтому в случае внезапного сбоя на одном из используемых серверов, в том числе с полной потерей всех данных, сервис всё равно останется доступным и информация пользователей утрачена не будет. Новая кластерная архитектура Ахантера также позволяет осуществлять балансировку нагрузки. Часть пользователей может работать с одним сервером, а другая часть – с другим сервером.
Кроме вопросов надежности в третьем поколении Ахантера мы уделили внимание борьбе с ботами. На протяжении всего времени существования у нашего сервиса время от времени появляются пользователи, разрабатывающие ботов для использования бесплатной обработки в своих коммерческих целях. Такие боты не приносят нам ничего хорошего. Они нагружают сервера, тем самым мешают добросовестным пользователям работать с сервисом. В связи с этим мы были вынуждены развивать собственные средства по обнаружению ботов и их блокировке.
Несмотря на большие архитектурные изменения, мы полагаем, что третье поколение Ахантера пока находится в начале своего жизненного цикла. Прямо сейчас мы выполняем новые исследования в области обработки и сбора дополнительных открытых данных, использование которых поспособствует появлению новых возможностей у сервиса.