ls_geofiller - скрипт для автоматического заполнения таблицы geo_target

Однажды мне понадобилось обработать список юзеров и отфильтровать по их по географическому местоположению. В процессе я столкнулся с тем, что из ~450 юзеров информация о географическом положении заполнена лишь у 16-ти. И я решил сделать скрипт, который бы на основании IP с которым юзер регистрировался, получал данные о географическом положении, и заполнял эти данные. Для осуществления этого я использовал один из общедоступных сервисов sypexgeo.net (Не сочтите за рекламу, я к сервису отношения не имею, но не указать его, было бы неправильно)

Скрипт решил писать на python, так как владею им получше чем php, поэтому запускать его нужно из командной строки.

Одной из проблем является не точное соответствие названий получаемых от API сервиса, и названий в таблицах geo* livestreet например (Dnepropetrovsk и Dnipropetrovsk, Moskva и Moscow & Moscow region и тысячи других несоответствий), поэтому я сделал словарь синонимов, который заполняется при работе скрипта, именно поэтому скрипт требует участия человека при работе. Натолкнувший на неизвестный ему географический объект, скрипт спросит у вас синоним этого названия из базы livestreet (список отсортирован эвристически, и зачастую (но не обязательно) самый последний элемент является верным синонимом) В дальнейшем, скрипт будет использовать этот синоним, сохранив его в базе, то есть ввести его предстоит только один раз)

Скорее всего словарь синонимов (ls-geo.dat), после того как скрипт отработает, пополнится, если вам будет не сложно, можете прислать его мне для обновления исходного словаря.

Итак, ссылка на исходники на Гитхабе: github.com/svfat/ls-geofiller

12 комментариев

avatar
скрипт полезный, думаю гео-данные лучше подставлять при регистрации (или настройке профиля, если эти данные ранее не были заполнены), а не «насильно» — ведь юзер мог регистрироваться не из дома. и ещё бы его плагином…
avatar
С тем что надо это делать «не насильно» вполне согласен. Уговорами и поощрениями для юзеров с заполненным профилем. Но тут задача была другая: в целях тестирования другого плагина, максимально просто и быстро заполнить данные у имеющихся юзеров, которые на 99% «заблудившиеся».
avatar
Писал плагин для этого(определяет при регистрации), тоже на sypexgeo. И основным неудобством в отдельных случаях как раз стало некорректное ассоциирование. Если есть желание — можем поговорить в личке о совмещении функционала, возможно, получится полноценный плагин для каталога, который будет полезен многим.
avatar
А давайте здесь поговорим? Может сообщество что подскажет. Как вы представляете себе ассоциирование с помощью плагина? При регистрации будет дополнительно запрашивать у пользователя? Или отдельная страница для администраторов со списком ошибок ассоциации? Второе как мне кажется лучше.
avatar
Если смотрели плагин — то должен быть понятен принцип его работы: пользователь регистрируется=>ищется в sypex базе страна/город=>пытается найти те же города в БД ЛС=>если находит(тут то и нужен ассоциатор), то пишет юзеру в настройки профиля страну/город.
avatar
Хорошо. Мое видение: при поиске города вначале просмотреть «словарь» ассоциаций и если там есть такое место, то использовать при поиске по базе livestreet именно его синоним. Список тех юзеров, кому ни по словарю не по базе совпадений не нашлось, заносить в отдельную таблицу и затем отображать например в «настройках» плагина, чтобы администраторы могли ввести ассоциации вручную.
avatar
Не нужны никакие словари, только намучаетесь с ними. Используйте сравнение схожести строк на основе анализа звучания:

www.php.net/manual/en/function.soundex.php
www.php.net/manual/ru/function.metaphone.php
www.php.net/manual/ru/function.similar-text.php

Ну или прямо в мускул:

dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundex
avatar
*дополнение к комменту выше

и тогда Dnepropetrovsk и Dnipropetrovsk будут иметь одинаковые ключи.
avatar
А как быть с населенными пунктами, где схожесть названия не отражает идентичность по факту? Т.е. похожие названия или даже идентичные. Херсон — в Украине и в Греции. Александрия — в Египте, Украине (Кировоградская область)…
avatar
Такие коллизии разрешаются сравнением стран и регионов на основе информации о принадлежности айпи-адреса. И, кстати, в Греции нет города Херсон.
avatar
Даже в пределах одной страны есть совпадения. Я думаю, нужно совместить словари с предложенными методами.
avatar
тогда используйте только
www.php.net/manual/ru/function.similar-text.php
с указанием нужного процента совпадения.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.