Автоматизація модерації: як позбутися спаму та токсичності
Уявіть: ваш сайт отримує 10 000 коментарів на день. Серед них — 30% спаму, 5% токсичного контенту. Ручна модерація не справляється, а автоматична фільтрація на базі лише стоп-слів пропускає хитрі схеми. В одному з проектів (інтернет-магазин з відгуками) після впровадження нашої системи кількість пропущеного спаму знизилася з 15% до 1%, а час публікації легальних відгуків — з 4 годин до 5 хвилин. За рахунок автоматизації ви економите до 80% бюджету на модерацію — для середнього проекту це $2000–3000 на місяць. Окупність настає через 3–6 місяців при інвестиціях від $5000 до $8000. Система модерації перестає бути вузьким горлом.
Ми вирішуємо це завдання комбінацією алгоритмів на PHP та зовнішніх API. Пропоноване рішення поєднує автоматичну фільтрацію на основі правил і машинного навчання (Perspective API) зі зручною панеллю для ручної перевірки. Це знижує навантаження на модераторів і прискорює публікацію легального контенту.
Як працює автоматична фільтрація?
Автоматична фільтрація використовує набір правил: стоп-слова, регулярні вирази для посилань і повторюваних символів, а також аналіз історії автора. Система присвоює кожному повідомленню оцінку ризику (spamScore) і приймає рішення: схвалити, відправити в чергу або позначити як спам. Ми використовуємо статуси модерації: pending, approved, rejected, spam, shadow_banned. Eloquent-модель з кастомним трейтом:
class Comment extends Model
{
use HasModerationStatus;
protected $casts = [
'moderation_metadata' => 'array',
'moderated_at' => 'datetime',
];
public function scopeVisible(Builder $query): Builder
{
return $query->where('status', 'approved');
}
public function scopePendingModeration(Builder $query): Builder
{
return $query->where('status', 'pending');
}
}
Сервіс перевірки аналізує контент і повертає рішення:
class ContentModerationService
{
private array $spamPatterns = [
'/https?:\/\/[^\s]+/i', // зовнішні посилання
'/\b(casino|viagra|loan|crypto)\b/i',
'/(.)\1{5,}/', // повторювані символи
];
private array $bannedWords;
public function analyze(string $content, User|null $author): ModerationResult
{
$signals = [];
$spamScore = 0;
foreach ($this->bannedWords as $word) {
if (stripos($content, $word) !== false) {
$signals[] = "banned_word:{$word}";
$spamScore += 40;
}
}
foreach ($this->spamPatterns as $pattern) {
if (preg_match($pattern, $content)) {
$signals[] = "pattern_match:{$pattern}";
$spamScore += 30;
}
}
if ($author) {
$authorSpamRate = $author->comments()
->where('status', 'spam')
->count() / max($author->comments()->count(), 1);
if ($authorSpamRate > 0.3) {
$signals[] = 'author_spam_history';
$spamScore += 50;
}
} else {
$spamScore += 10;
}
if (strlen($content) < 5) {
$signals[] = 'too_short';
$spamScore += 20;
}
return new ModerationResult(
score: $spamScore,
signals: $signals,
decision: match (true) {
$spamScore >= 80 => ModerationDecision::SPAM,
$spamScore >= 50 => ModerationDecision::PENDING,
default => ModerationDecision::APPROVE,
}
);
}
}
Панель модератора та система скарг
Панель модератора надає чергу на перевірку з можливістю фільтрації за типом контенту. Кожна дія логується в ModerationDecisionLog:
class ModerationController extends Controller
{
public function queue(Request $request): JsonResponse
{
$items = Comment::pendingModeration()
->with('user:id,name,email', 'entity')
->when($request->type, fn($q) => $q->where('entity_type', $request->type))
->orderBy('moderation_score', 'desc')
->paginate(50);
return response()->json($items);
}
public function decision(Request $request, Comment $comment): JsonResponse
{
$request->validate([
'action' => 'required|in:approve,reject,spam,shadow_ban',
'reason' => 'nullable|string|max:500',
]);
$previousStatus = $comment->status;
$comment->update([
'status' => match ($request->action) {
'approve' => 'approved',
'reject' => 'rejected',
'spam' => 'spam',
'shadow_ban' => 'shadow_banned',
},
'moderated_by' => auth()->id(),
'moderated_at' => now(),
'rejection_reason' => $request->reason,
]);
ModerationDecisionLog::create([
'moderator_id' => auth()->id(),
'comment_id' => $comment->id,
'action' => $request->action,
'reason' => $request->reason,
'previous_status' => $previousStatus,
]);
if ($request->action === 'approve') {
event(new CommentApprovedEvent($comment));
}
if (in_array($request->action, ['reject', 'spam'])) {
$comment->user?->notify(new CommentRejectedNotification($comment));
}
UpdateAuthorReputationJob::dispatch($comment->user, $request->action);
return response()->json(['status' => 'ok']);
}
}
Користувачі можуть скаржитися на коментар. Після трьох скарг він автоматично відправляється до черги модерації:
class ReportController extends Controller
{
public function store(Request $request, Comment $comment): JsonResponse
{
$request->validate(['reason' => 'required|in:spam,abuse,misinformation,other']);
Report::firstOrCreate(
['reporter_id' => auth()->id(), 'comment_id' => $comment->id],
['reason' => $request->reason]
);
$reportCount = Report::where('comment_id', $comment->id)->count();
if ($reportCount >= 3 && $comment->status === 'approved') {
$comment->update(['status' => 'pending', 'auto_flagged' => true]);
}
return response()->json(['reported' => true]);
}
}
Підвищення точності через Perspective API
Підключаємо Perspective API для аналізу токсичності. Точність визначення токсичності сягає 95% на російській та англійській. Інтеграція проста:
class PerspectiveApiService
{
public function analyzeToxicity(string $text): float
{
$response = Http::post(
"https://commentanalyzer.googleapis.com/v1alpha1/comments:analyze?key={$this->apiKey}",
[
'comment' => ['text' => $text],
'languages' => ['ru', 'en'],
'requestedAttributes' => ['TOXICITY' => new \stdClass()],
]
);
return $response->json('attributeScores.TOXICITY.summaryScore.value', 0.0);
}
}
Дослідження показують, що комбінація правил і ML підвищує точність до 96%.
Чому автоматична модерація вигідніша за ручну?
Автоматична фільтрація обробляє до 1000 повідомлень на секунду, модератор — близько 10 на хвилину. Таким чином, автоматична система швидша за ручну в 6000 разів за пропускною здатністю. При цьому автоматичні алгоритми знижують кількість пропущеного спаму на 80% порівняно з чисто ручною модерацією. Це підтверджує наш досвід впровадження систем для більш ніж 20 проектів. Ключові метрики: частка хибних спрацьовувань, середній час обробки, відсоток схвалених скарг. Ми налаштовуємо дашборди для оперативного коригування правил.
| Параметр | Ручна модерація | Автоматична система |
|---|---|---|
| Пропускна здатність | ~10 коментарів/хв | до 1000 коментарів/с |
| Частка пропущеного спаму | 10–15% | <1% |
| Вартість | Висока | Низька |
| Точність токсичності | ~80% | ~95% |
Що впливає на точність фільтрації?
Ключові фактори: якість стоп-листа, налаштування патернів, репутація автора та інтеграція з Perspective API. Хибні спрацьовування найчастіше виникають через занадто жорсткі правила. Ми налаштовуємо систему так, щоб мінімізувати блокування легітимного контенту — зазвичай частка хибних спрацьовувань не перевищує 2%.
Що входить у проект
- Розробка модуля автоматичної фільтрації (стоп-слова, патерни, репутація автора).
- Інтеграція з Perspective API або аналогами.
- Панель модератора з чергою та журналом модерації.
- Система скарг користувачів.
- Статистика та звіти для керівника.
- Документація та навчання команди модераторів.
Детальна карта реалізації
- Аналіз поточної архітектури та збір вимог.
- Проектування схеми даних (статуси, логи, репутація).
- Розробка сервісу фільтрації та трейту моделі.
- Створення панелі модератора з API та інтерфейсом.
- Інтеграція Perspective API.
- Механізм скарг та автоматичного блокування.
- Дашборди для моніторингу.
- Тестування та коригування правил.
- Деплой та документування.
Як впровадити систему
- Створіть список стоп-слів і шаблонів посилань.
- Реалізуйте сервіс аналізу (див. приклад
ContentModerationService). - Інтегруйте модель з трейтом
HasModerationStatus. - Налаштуйте чергу модерації та панель модератора.
- Підключіть Perspective API для токсичності.
- Додайте механізм скарг і репутації авторів.
- Запустіть тестування та навчіть модераторів.
Терміни реалізації
| Задача | Термін |
|---|---|
| Автофільтр (стоп-слова + патерни) | 1–2 дні |
| Черга модерації + панель модератора | 2–3 дні |
| Скарги користувачів | +1 день |
| Perspective API інтеграція | +1 день |
| Статистика та звіти | +1–2 дні |
| Повна система з репутацією авторів | 5–8 днів |
Система модерації — це не просто код, а готове рішення. Зв'яжіться з нами, щоб обговорити ваш проект і отримати консультацію. Замовте розробку системи модерації — ми підберемо оптимальне рішення під ваше навантаження.







