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/