Фильтрация запрещённых слов
Фильтрация запрещённых слов находит в тексте слова из вашего собственного списка недопустимых выражений. В отличие от спама или тональности — где используются обученные модели, — эта проверка сопоставляет текст с пользовательским списком слов, который вы настраиваете для своего проекта, поэтому вы сами решаете, какие именно термины запрещены. Включите её с помощью check_badwords в POST /api/v2/check.
Когда стоит использовать пользовательский список слов?
Модели хорошо справляются с расплывчатыми категориями вроде токсичности, но некоторые термины — это решения на уровне вашей политики, которые можете принять только вы: название конкурента, запрещённый продукт, оскорбления, специфичные для сообщества, шаблоны утёкших учётных данных или слова, которые ваша юридическая команда требует блокировать. Пользовательский список даёт для них точное и предсказуемое совпадение.
Как это работает?
Фильтрация запрещённых слов запускается только при выполнении двух условий: включён check_badwords, и в вашем проекте настроен пользовательский список слов. Затем выполняется поиск каждого слова из списка в тексте сообщения как подстроки без учёта регистра, после чего возвращаются все найденные слова.
curl -X POST https://api.discuse.com/api/v2/check \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-d '{
"content": {
"text": "Check out CompetitorBrand for a better deal"
},
"settings": {
"check_badwords": true
}
}'
Ответ
{
"has_violations": true,
"cached": false,
"results": {
"hits": true,
"badwords": {
"hit": true,
"matched_words": ["CompetitorBrand"],
"apply_penalty": true
}
}
}
Объект results.badwords содержит три поля:
| Поле | Тип | Описание |
|---|---|---|
hit |
boolean | True, если найдено хотя бы одно слово из списка |
matched_words |
string[] | Настроенные слова, которые совпали с текстом |
apply_penalty |
boolean | Должно ли совпадение запускать ваше принудительное действие (для совпадения всегда true) |
Как настроить список слов?
Список является частью настроек вашего проекта, а не запроса: вы задаёте его один раз, и каждый запрос с check_badwords использует этот список. Управляйте им в настройках проекта (там же, где задаются проверки по умолчанию). Поскольку запрос передаёт только переключатель check_badwords, вы можете хранить список слов в приватном виде и изменять его, не трогая клиентский код.
Если check_badwords включён, но в вашем проекте не настроены слова, проверка пропускается, а результат badwords не возвращается.
Какой тип сопоставления используется?
Сопоставление выполняется как поиск подстроки без учёта регистра: слово из списка spam совпадёт с spam, SPAM, а также с spammer. Учитывайте это при выборе элементов списка: добавляйте целые фразы, если хотите избежать совпадений внутри более длинных слов, и помните, что короткие элементы могут давать нежелательные совпадения с подстроками.
Использование
У фильтрации запрещённых слов нет отдельной квоты: как и текстовые проверки, она выполняется в рамках вызова /api/v2/check, и каждый такой вызов засчитывается один раз в ваш месячный лимит API-запросов. Подробнее о квотах и ограничениях частоты запросов см. в разделе Аутентификация и API-ключи.
Рекомендации
Комбинируйте с проверками на основе моделей
Используйте пользовательский список для точных терминов, заданных вашей политикой, а check_spam, check_sentiment и check_images — для расплывчатых категорий. Один вызов /check может запустить все эти проверки вместе — см. Анализ текста.
Действуйте на основе найденных слов
matched_words показывает, что именно сработало в фильтре. Это полезно для контекста модераторов и для настройки списка:
const result = await check({ text }, { check_badwords: true });
const bad = result.results?.badwords;
if (bad?.hit) {
await blockAndLog(text, bad.matched_words);
}
Регулярно пересматривайте список
Статический список устаревает по мере того, как меняются сообщества и язык. Периодически проверяйте, какие элементы действительно срабатывают (по matched_words в ваших логах), и удаляйте те, которые приводят только к ложным срабатываниям.
Пример интеграции
import os
import requests
def check_badwords(text):
response = requests.post(
'https://api.discuse.com/api/v2/check',
headers={
'Content-Type': 'application/json',
'X-API-Key': os.environ['DISCUSE_API_KEY']
},
json={'content': {'text': text}, 'settings': {'check_badwords': True}}
)
return response.json()
Готовы применять собственную политику по словам? Начните работу с Discuse.