Найти - Пользователи
Полная версия: Поиск подобных строк(какие подходят алгоритмы)
Начало » Python для экспертов » Поиск подобных строк(какие подходят алгоритмы)
1
buddha
Есть табличка коментариев, в этой табличке есть записи , у которых поле текст частично дублируется(т.е. один и тот же комент, в котором разные знаки препинания и их разное количество).
Нужно почистить такие дублированные коменты.
Подскажите,пожалуйста, как сделать это по умному?
o7412369815963
Сделать нормализацию строк (выкинуть все кроме символов и пробелов, перервести в нижний регистр и т.п.).
Потом посортировать и вырезать если следующий = текущему.

Если текст немного отличается, то можно комменты нарезать на куски, и искать эти куски одной строки в кусках другой строки - таким образом можно выявить % пресечения, т.е. на сколько строка похожа. Ну и например вырезать те что совпадают на > 90%
Alen
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/
4kpt_II
Если задача действительно научная или около-научная и необходим хороший результат по быстродействию и возможности настройки, то я бы рекомендовал использовать нечеткую логику. Вариантов построить систему просто масса… Для понимания процесса рекомендую глянуть в книгу Мелихов А.Н. Ситуационные советующие системы с нечеткой логикой.

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

P.S. Вообще по задачам такого класса написано множество работ. Присутствовал на 3 защитах. Там задачи такого класса решались вообще совершенно различными способами. При этом с разной эффективностью и разной скоростью. Самое интересное, что данные соискателями подбирались так, чтобы их метод был наиболее эффективным
buddha
Спасибо, решили с помощью python-Levenshtein
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB