- Описание
- Установка
- Использование
- Поддерживаемые языки
- Расширенные возможности фильтрации
- Полный пример использования
BadWords
- это мощная библиотека для фильтрации нецензурной лексики из текста. Она поддерживает различные языки, позволяет добавлять пользовательские слова и обладает расширенными возможностями для обнаружения замаскированных нецензурных выражений.
- Рекомендуемая версия: Python 3.13
- Минимальная версия: Python 3.10
- Поддерживаемые версии: Python 3.10 и выше
pip3 install git+https://github.com/FlacSy/badwords.git
p = ProfanityFilter()
p.init(languages: List[str] | None = None)
languages
(список строк, необязательно): Список языков, для которых будут загружены слова нецензурной лексики. Если не указано, будут использованы все доступные языки.
import asyncio
from badwords import ProfanityFilter
async def main() -> None:
# Инициализация с использованием английского и испанского языков
_filter = ProfanityFilter()
await _filter.init(["en", "sp"])
# Инициализация с использованием всех доступных языков
await _filter.init()
if __name__ == "__main__":
asyncio.run(main())
Инициализация файлов языков.
- Словарь, который сопоставляет имена языков с путями к файлам.
language_files = await _filter.initialize_language_files()
print(language_files)
Инициализация слов нецензурной лексики для каждого языка.
- Словарь, который сопоставляет имена языков с наборами слов нецензурной лексики.
bad_words = await _filter.initialize_bad_words()
print(bad_words)
Добавление пользовательских слов нецензурной лексики в фильтр.
words
(список строк): Список пользовательских слов нецензурной лексики.
await _filter.add_words(["customword1", "customword2"])
Вычисление коэффициента сходства между двумя строками.
a
(строка): Первая строка.b
(строка): Вторая строка.
- Коэффициент сходства (дробное число).
Проверка, содержит ли заданный текст нецензурную лексику.
text
(строка): Входной текст для проверки.match_threshold
(дробное число, необязательно): Порог для совпадения по схожести. По умолчанию0.8
.- Значение от 0.0 до 1.0, где 1.0 означает точное совпадение
- Более низкие значения увеличивают количество найденных совпадений, но значительно замедляют работу
- Рекомендуемые значения: 0.9-0.95 для баланса между точностью и производительностью
- При значении 1.0 проверка работает максимально быстро
replace_character
(символ или None, необязательно): Символ для замены непристойных слов. Если None, возвращает True/False. По умолчаниюNone
.
Важно: Использование similarity matching (match_threshold < 1.0) значительно замедляет работу фильтра. Рекомендуется:
- Использовать базовую проверку (match_threshold=1.0) для быстрой фильтрации
- Включать similarity matching только когда нужна более строгая проверка
- Использовать более высокие значения match_threshold (0.95) для лучшей производительности
True
если найдена нецензурная лексика,False
в противном случае. Еслиreplace_character
указан, возвращает отфильтрованный текст.
# Проверка на наличие нецензурной лексики
contains_profanity = await _filter.filter_text("This is some bad text", match_threshold=0.9)
print(contains_profanity) # True или False
# Проверка на наличие нецензурной лексики с заменой
filtered_text = await _filter.filter_text("This is some bad text", replace_character="*")
print(filtered_text) # Текст с заменёнными непристойными словами
Получение списка всех доступных языков.
- Список строк, содержащий коды всех поддерживаемых языков.
all_languages = await _filter.get_all_languages()
print(all_languages) # ["en", "sp", "fr", "de", ...]
В настоящее время BadWords
поддерживает 26 языков:
br
- Португальский (Бразилия)cz
- Чешскийda
- Датскийde
- Немецкийdu
- Голландскийen
- Английскийfi
- Финскийfr
- Французскийgr
- Греческийhu
- Венгерскийin
- Индонезийскийit
- Итальянскийja
- Японскийko
- Корейскийlt
- Литовскийno
- Норвежскийpl
- Польскийpo
- Португальский (Европейский)ro
- Румынскийru
- Русскийsp
- Испанскийsw
- Шведскийth
- Тайскийtu
- Турецкийua
- Украинский
BadWords
обладает мощными возможностями для обнаружения замаскированных нецензурных выражений:
- Автоматическое преобразование между кириллицей и латиницей
- Обнаружение слов, написанных в разных алфавитах
- Поддержка сложных случаев транслитерации
- Приведение к нижнему регистру
- Удаление диакритических знаков
- Удаление специальных символов и знаков препинания
- Агрессивная нормализация для удаления нестандартных символов
- Выявление символов, визуально похожих на буквы
- Замена декоративных и математических символов
- Обработка Unicode-символов с похожим начертанием
- Учет наиболее распространенных способов обхода фильтрации
- Адаптивная система подстановки символов
- Обучение на основе частоты использования различных замен
- Последовательное применение различных методов фильтрации
- Комбинирование результатов разных уровней проверки
- Повышенная точность обнаружения замаскированных слов
# Обнаружение слов с использованием разных алфавитов
await _filter.filter_text("hеllо") # Обнаружит "hello" с кириллической 'е'
# Обнаружение слов с заменой символов
await _filter.filter_text("h3ll0") # Обнаружит "hello" с заменой букв на цифры
# Обнаружение слов с использованием гомоглифов
await _filter.filter_text("h⍺llo") # Обнаружит "hello" с использованием альтернативных символов
# Обнаружение слов с транслитерацией
await _filter.filter_text("привет") # Обнаружит "privet" в латинице
import asyncio
from badwords import ProfanityFilter
async def main() -> None:
# Создаем экземпляр фильтра, указывая нужные языки
_filter = ProfanityFilter()
await _filter.init(["en", "sp"])
text ="Text with inappropriate words"
await check_profanity(_filter, text)
await check_profanity_with_replace(_filter, text)
# Функция для проверки текста на наличие нецензурной лексики
async def check_profanity(_filter: ProfanityFilter, text: str) -> None:
result = await _filter.filter_text(
text=text,
match_threshold=0.9,
)
if result:
print("Этот текст содержит нецензурную лексику.")
else:
print("Этот текст не содержит нецензурной лексики.")
# Функция для проверки текста на наличие нецензурной лексики с заменой
async def check_profanity_with_replace(_filter: ProfanityFilter, text: str) -> str:
result = await _filter.filter_text(
text=text,
match_threshold=0.8,
replace_character="*",
)
print(result)
if __name__ == "__main__":
asyncio.run(main())