Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 24, 2014 11:29:27

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

Поиск подобных строк(какие подходят алгоритмы)

Есть табличка коментариев, в этой табличке есть записи , у которых поле текст частично дублируется(т.е. один и тот же комент, в котором разные знаки препинания и их разное количество).
Нужно почистить такие дублированные коменты.
Подскажите,пожалуйста, как сделать это по умному?

Офлайн

#2 Ноя. 24, 2014 14:40:45

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Поиск подобных строк(какие подходят алгоритмы)

Сделать нормализацию строк (выкинуть все кроме символов и пробелов, перервести в нижний регистр и т.п.).
Потом посортировать и вырезать если следующий = текущему.

Если текст немного отличается, то можно комменты нарезать на куски, и искать эти куски одной строки в кусках другой строки - таким образом можно выявить % пресечения, т.е. на сколько строка похожа. Ну и например вырезать те что совпадают на > 90%

Офлайн

#3 Ноя. 24, 2014 23:15:20

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

Поиск подобных строк(какие подходят алгоритмы)

buddha
Подскажите,пожалуйста, как сделать это по умному?

Как правильно заметил o7412369815963, нужно провести нормализацию, затем можно использовать любой алгоритм нечеткого поиска, наиболее лучшим вариантом считаю алгоритм Левенштейна
https://ru.wikipedia.org/wiki/Расстояние_Левенштейна

Что бы не изобретать велосипед, лучше воспользоваться готовой библиотекой:

pip install python-Levenshtein
, она на Си, работает быстро и просто замечательно.

Например, для дистанции в 4 символа (4 различия в тексте), можно использовать такую функцию:
from Levenshtein import distance
def calc_distance(comments, sample):
    for item in comments:
        if distance(sample, item) < 5:
            return item

Но всё это будет работать если у Вас уже есть “образец”, а если у вас его нет, то задача может быть сведена к перебору и сравнению всех комментариев, с выводом всех дублеров, эта задача более трудоемкая, но если комментариев меньше 1000, будет работать достаточно быстро – от нескольких микросекунд до минуты в одном потоке, но можно еще ускорить распараллелив потоки выполнения, например через map multiprocessing.

Другими способами возможного решения при неизвестных взаранее образцах классификации, могут служить алгоритмы кластеризации, например k-means, готовая реализация есть в библиотеках scipy.cluster.vq и skilearn.cluster, в этом случае можно найти “спам” в комментариях выделяя наиболее большой найденный кластер (если эти комментарии занимают сравнительно большую часть среди всех комментариев)

Если же “спам” случается эпизодически и примерно про одно и тоже, то можно использовать, “старый добрый наивный Байес”, ровно тот, что используется при фильтрации почтового спама, только его переодически необходимо обучать. Реализация есть в scikit-learn, или вот еще решение без использования сторонних библиотек http://habrahabr.ru/post/120194/

Отредактировано Alen (Ноя. 25, 2014 22:04:24)

Офлайн

#4 Ноя. 24, 2014 23:30:50

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Поиск подобных строк(какие подходят алгоритмы)

Если задача действительно научная или около-научная и необходим хороший результат по быстродействию и возможности настройки, то я бы рекомендовал использовать нечеткую логику. Вариантов построить систему просто масса… Для понимания процесса рекомендую глянуть в книгу Мелихов А.Н. Ситуационные советующие системы с нечеткой логикой.

И да, действительно, самое интересное проектировать систему, если шаблонов или принципов выделения не существует да и классификационные признаки или неявные или отсутствуют…

P.S. Вообще по задачам такого класса написано множество работ. Присутствовал на 3 защитах. Там задачи такого класса решались вообще совершенно различными способами. При этом с разной эффективностью и разной скоростью. Самое интересное, что данные соискателями подбирались так, чтобы их метод был наиболее эффективным

Отредактировано 4kpt_II (Ноя. 24, 2014 23:35:30)

Офлайн

#5 Ноя. 25, 2014 14:35:02

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

Поиск подобных строк(какие подходят алгоритмы)

Спасибо, решили с помощью python-Levenshtein

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version