Пример очистки данных

Игорь Артамонов
artamonov.ru

Я практически ничего не писал о том, чем именно я сейчас занимаюсь, но это у меня часто спрашивают, и мало кому понятно, что такое «Очистка данных». Постараюсь это объяснить.
Очистка данных нужна, к примеру, организации, которая анкетирует своих покупателей на предмет того, что и где они покупали. Это может быть по почте, через сайт, еще как-то, источник не важен, но факт что данные могут придти различные.

В общем, расскажу на примере одной недавней задачки.

Вот возьмем такую задачу: в анкете есть поле, заполняемое названием магазина, а организации, к примеру, надо делать отчет по покупкам в определенных магазинах. Ну хотя этот отчет можно на основе других данных сделать. Да на самом деле неважно, зачем эти данные могу понадобиться, они точно требуются, и в нашем случае важно то, что они должны быть обрабатываемы и понятны.

Начинаем разбирать… Фантазия людей безгранична: вот возьмем к примеру Евросеть, как название только не напишут, могут как «ЕВРОСЕТЬ ЦЕНТР», или «ЕВРОСЕТЬ (ООО ЦЕНТР ХАБАРОВСК)». Ну с этим все более понятно, есть вхождение слова Евросеть и значит нашли магазин.

Следующий вариант это написание типа «Evroset». Сразу не найдем, тут нам надо сделать обратную транслитерацию. А есть, кстати, тот же DIXIS, для которого получается надо делать обратную операцию.

С учетом транслитерации и самих ошибок начинаются проблемы, потому люди пишут и как «Evroset», и как «Euroset», как «euroset.ru», да и в общем-то тоже самое для русского. К тому же бывают опечатки, или просто незнания правильного написания. «Техносила» может быть написана как «TECHNOSILA», или как «TEHNO SILA» (буковки C вообще нет), и т.д. А как вам «ЦИФРАГАД»(видимо не угодил он покупателю) и «ЦИФР0ГРАД» (Ноль вместо О, не иначе как кулхаксор писал), или «ЦЫФРАГРАТ» (ага, афтар жжет)?
Вывод такой: искать по вхождению не имеет смысла. Перебирать все варианты возможных ошибок, фантазий и пр. для каждого магазина просто нереально. Итого остается вариант искать по близости написания. Т.е. строка сравнивается по написанию со всеми магазинами, и берется тот, который наиболее похож. Естественно нужно еще найти какой-то минимальный порог, меньший 100% совпадения, но очень высокий, чтобы «ТЕХНОМИКС» не совпадал с «ТЕХНОМИР».

Сравнивать полную строку нет смысла, потому что чисто символьная разница между «СВЯЗНОЙ В ОКЕЕ НА МАРШАЛА ЖУКОВА», «СЕТЬ МАГАЗИНОВ САТЕЛЛИТ» и пр. далека от написания самого названия магазина. Из первой фразы надо сразу убирать адрес, но это просто, мы убираем все окончания начинающиеся на «на», «у», «ул», «в», «пр». Второй случай содержит часто употребимые слова, их можно выделить даже мельком пробежав все названия, хотя лучше с этим справился простенький скрипт. Но, так как даже после этого, во фразе все равно может остаться невыловленный нами мусор, надо сравнивать слова по отдельности, а не всю фразу.

Думаете стало находить? А фиг то там! Потому что если мы начнем таким образом сравнивать «EURO SET» и «BETA LINK», или, что еще хуже, «ЗАОБЕТА ЛИНК СПБ», то они станут непохожи, ведь из слова «BETA LINK», что «бета» что «линк» лишь наполовину похожи на «беталинк»… Поэтому надо сравнивать слова не только по одному, но и группами близлежащих, и к тому же не учитывая пробелы…

А еще надо учитывать чтобы из-за этой похожести «ДОМ.ТЕХНИКА» не совпал с «ДОМОТЕХНИКА» :) Тут, на самом деле, начинается новая проблема. И если дальше копать, то выясняем что магазинов с элементами «техно/техника/техникс», «мир», «центр», «видео» и пр. просто немеряно :( А ведь чем длиннее строка тем меньшую непохожесть вносит всего одна опечатка. Поэтому подобные элементы нужно сразу учитывать, чтобы не вносили погрешности. Но, опять же, тут надо учитывать что есть «М-ВИДЕО», который почти полностью состоит из одного из этих самых частоупотребимых элементов. Т.е. в данном случае нельзя отбрасывать эту часть, как мы делали с простым мусором (который упомянул выше, как например «СЕТЬ МАГАЗИНОВ»). Эти элементы надо сравнивать как обязательную и неотемлимую часть. И в тоже время требовать, чтобы ничего лишнего не было, т.е. «МИР ВИДЕО И АУДИО» это уже должно подпадать под мусор.

Да, и еще, насчет этих частоупотребымих элементов и мусора. Есть не только магазины, который в офлайне, но и интернет-магазины. А уж они то любят занять распространенное слово. И если на сайте telephone.ru продается достаточно товаров чтобы быть заметным, то нужно уметь его выделять. Вы думаете что его пишут как название сайта? Фиг то там! Он и сам себя именует как телефон.ру, и поэтому его пишут например как: «РОСТОВ.ТЕЛЕФОН.РУ» и так далее с учетом всех возможных опечаток. И выделяя его, нам ни в коем случае нельзя ошибиться и выделить «СОТОВЫЕ ТЕЛЕФОНЫ». Хотя в действительности для подобных сайтов не требует внесения каких-то особо уникальных вещей в алгоритм, но иметь ввиду это надо.

Ладно, это мы чуток разобрались с общеизвестными брендами, написание которых, чаще все же уникально. А ведь есть некоторые «псевдобренды», или не знаю как назвать. В общем, суть в том, что многим нашим предпринимателям лень думать над уникальным названием, и очень многие берут себе название типа «МИР», «МИР ТЕХНИКИ», «БЫТОВАЯ ТЕХНИКА», «ЭЛЕКТРОНИКА». И этих название просто куча в анкетах, и хотя клиент прекрасно понимает, что как таковой сети магазинов с таким именем нет в природе, но учитывать надо, из-за того, что слишком часто упоминается. И ведь приходится :) И, с учетом всего вышенаписанного, «БЫТОВАЯ ТЕХНИКА» должна отличатся от «МИР БЫТОВОЙ ТЕХНИКИ», от «ВИДЕО И БЫТОВАЯ ТЕХНИКА», но совпадать с «БЫТОВАЯ ТЕХНИКА 4″, «БЫТОВАЯ ТЕХНИКА МАГАЗИН №12 ЧП СОКОЛОВ С.И.», а «МИР» не должен совпасть с «АПЕЛЬСИНОВЫЙ МИР», «МИР ТЕХНИКИ», но совпадать с «МИР В ГИПЕРМАРКЕТЕ СЕМЬЯ» ну и т.д. Т.е. мусор если и может присутствовать, то только указывающий на месторасположение или тип.

Вот примерно такими вещами я сейчас и занимаюсь, если кому не лень тот может попробовать реализовать такой алгоритм, он не такой уж и сложный :) Я привел на примере магазинов цифровой техники, но примерно также делается и для многих других вещей: для брендов, названий товаров, автомобилей и пр. что имеет конечный описанный объем названий. А вот когда требуется просто выделить что-то из фразы, к примеру адрес, то тут все гораздо хитрей.
А еще подумайте как вообще можно написать адрес, или телефон, и как же определить настоящие это данные или нет, и поверьте, фантазия людей похоже действительно не имеет границ.
А ведь мало написать выделение данных, нужно чтобы алгоритм сразу отбрасывал, как мусор, данные о человеке типа «Мери Попинс, ул. Ленина 1 кв. 1, тел. 123-12-34″ :)

Tags: , ,

Leave a Reply