---
title: "Алгоритм шинглов - боремся со спамом на сайте"
description: "15 октября прошлого года я принял участие в Яндекс.Субботнике, проходившем в Алматы. При общении в к..."
author: "iborodikhin"
published: "2010-10-01T22:10:53+00:00"
modified: "2010-10-01T22:10:53+00:00"
locale: "ru"
canonical_url: "https://yvision.kz/post/algoritm-shinglov-boremsya-so-spamom-na-sayte-76580"
markdown_url: "https://yvision.kz/post/algoritm-shinglov-boremsya-so-spamom-na-sayte-76580/markdown"
site_name: "Yvision.kz"
---

# Алгоритм шинглов - боремся со спамом на сайте

> 15 октября прошлого года я принял участие в Яндекс.Субботнике, проходившем в Алматы. При общении в к...

15 октября прошлого года я принял участие в [Яндекс.Субботнике](http://company.yandex.ru/public/subbotnik/), проходившем в Алматы. При общении в кулуарах один из программистов Яндекса обмолвился, что для борьбы со спамом в почте используется [Алгоритм Шинглов](http://www.codeisart.ru/python-shingles-algorithm/). Тогда я не придал этому особого значения, но про себя отметил, что это прекрасная идея.

Позже у меня случился отпуск, я на 2 недели покинул страну, а когда вернулся обнаружил две взаимосвязанных вещи - посещаемость моего [новостного сайта](http://i-news.kz) значительно возросла и вместе с ней возросло и количество спама в комментариях к новостям.

Конечно же, у меня были инструменты для блокирования комментаторов по IP и для удаления комментариев. Но этого было недостаточно, поскольку спам шёл с разных IP. Чёткие шаблоны создавать тоже не получалось, потому что текст спама немного отличался каждый раз.

И тут я вспомнил про алгоритм шинглов. В базе я создал таблицу spam_shingles, состоящую из двух полей - text_id (unsigned integer) и shingle_hash (integer). В поле text_id я записываю id комментария, а в shingle_hash - crc32 от всех шинглов (длиной в 2 слова) этого комментария. После этого сам комментарий удаляю.

При добавлении комментария я сверяюсь с таблицей spam_shingles запросом SELECT COUNT(*) AS intersects FROM spam_shingles GROUP BY text_id и если intersects>0, значит комментарий является спамом.

Конечно, такая схема не исключает ложных срабатываний, но на практике за полгода использования их ещё не было (каждый комментарий, признанный спамом попадает в лог). Также эту схему я по долгу службы внедрил на сайте [Zakon.kz](http://www.zakon.kz) и по велению сердца на своём [каталоге сайтов](http://internets.kz).

Ps: Если будет интересно, могу опубликовать свою реализацию разбивки текста на шинглы на PHP.

---

Source: [https://yvision.kz/post/algoritm-shinglov-boremsya-so-spamom-na-sayte-76580](https://yvision.kz/post/algoritm-shinglov-boremsya-so-spamom-na-sayte-76580)