Время прочтения: 4 мин.

Возможно, вам покажется, что получить адрес из отзыва несложно, достаточно разобрать текст и получить, по ключевым словам, город, улицу и дом. Но сложность заключается в том, что адрес нужно отделить от другого текста, ключевые слова могут отсутствовать, порядок – меняться, слова в тексте, которые подходят под адрес, имеют иное значение и т.д. Задача решается с помощью методов обработки естественного языка (Natural Language Processing).

Я разработала информационную систему, которая разбирает текст с учетом модели (структуры) адреса и возможных значений населенных пунктов, улиц и домов. Применение модели позволяет повысить качество работы системы.

Эта задача делится на этапы следующим образом:

  1. сбор данных;
  2. поиск адреса в тексте веб-страницы;
  3. геокодирование найденных адресов;
  4. отображение полученной информации на сайте.

Рассмотрим подробнее каждый этап.

В интернете множество сайтов с отзывами, например, otzovik.com, flamp.ru, Банки.ру и т.д. На этих сайтах отзывы уже содержат оценку. Поэтому начнем сбор данных с них. Т.е. нужно скачать веб-страницы, URL-адрес которых начинается с домена нужного сайта. Тексты веб-страниц сохраняются в файлы.

Алгоритм сбора данных

Выгружаем из базы данных информацию об адресах отделений компании. Названия населенных пунктов сохраняются в два массива. В одном будут храниться названия в исходном варианте, в другом – составные названия объектов разбиваются на части, и каждая часть хранится отдельно. При этом разбитые на части названия объектов хранят в себе ссылки на исходные. В названиях во втором массиве обрезаются окончания, чтобы при сравнении слов не было проблем с различными падежами. Такой массив будем называть обработанным. Для улиц формируется такой же обработанный массив. Далее получаем текст веб-страницы и начинаем парсинг. Производим токенизацию текста. Токен – это элемент текста, имеющий смысл. Удаляем токены ненужных html-тегов. Токены группируем по предложениям. Предполагаем, что адрес находится в пределах одного предложения. Для каждого предложения составляем контекст, он содержит все возможные варианты населенных пунктов, улиц и домов, которые встретились в тексте. У каждого токена предложения обрезаем окончание и проверяем токен на наличие в обработанных массивах населенных пунктов и улиц. Каждый токен может иметь несколько вариантов значений в массивах, которые запоминаются в контексте предложения. На листинге программы изображена часть алгоритма, проверяющая токены предложения на наличие в обработанном массиве с названиями населенных пунктов. Также если предыдущий токен обозначал наименование населенного пункта(city_prefix), то тогда токен будет проверяться только на населенный пункт. Аналогично с улицами.

var city_prefix = ['г', 'город','село','пгт','д','деревня','посёлок','днт'];  
if(cnt>0 && city_prefix.indexOf(sent[cnt-1].word)!=-1){  
    var cities=isCity(t.word,t.pos_in_sentence, sent);  
    context.cities = context.cities.concat(cities);  
    t.possible_options = t.possible_options.concat(cities);  
    continue;  
}  
var cities=isCity(t.word,t.pos_in_sentence, sent);  
context.cities = context.cities.concat(cities);  
t.possible_options = t.possible_options.concat(cities);  
    ...

Сравнение городов и улиц

Фишка такого подхода в том, что, если человек напишет адрес в свободной форме, например: «Пишу из Название_города, недавно был в отделении на Название_улицы, мне там не понравилось», то программа также выцепит эти наименования и добавит их в контекст.

Затем анализируем контекст, проверяем, ссылаются ли населенные пункты, улицы и дома друг на друга. Если географические объекты ни на что не ссылаются в контексте, то удаляем эти объекты. Таким образом, мы получаем возможные варианты адреса:

  1. Населенный пункт + улица + дом – желательно;
  2. Населенный пункт + улица – терпимо;
  3. Населенный пункт, улица, дом (что-то одно из этого) – определить адрес невозможно.

Далее необходимо проверить, является ли найденный адрес отделением компании, для которой анализируется работа отделений. Если не указан номер дома, проверяем единственность отделения на этой улице и дополняем адрес автоматически. Сохраняем адрес и рейтинг в бд. Геокодирование адреса происходит с помощью веб-сервиса OpenStreetMap, формируем запрос и в ответе получаем широту и долготу. При отправке запросов нужно не забыть поставить ограничение на время, чтобы вас не забанили и не подумали, что вы совершаете DOS-атаку.

Пример запроса к ресурсу OpenStreetMap

Полученные геоточки отображаются с помощью Open-source системы QGIS. В будущем планируется создать веб-платформу с интерактивной картой, которая будет отображать в режиме онлайн рейтинг отделений компании с помощью цветового диапазона от зеленого к красному, где зеленый – высокий рейтинг, красный – низкий. Информационная система позволила бы в режиме онлайн отслеживать те отделения, которые собирают большинство негативных отзывов. Плюс этой системы в автономности, она работает без участия программиста или пользователя.