тогда я не понял - как работает твой фильтр, если ты не используешь модель русского языка?
Я писал одной заинтересованной девчонке, как работает моя библиотека, процитирую:
В библиотеки нет ключевой идеи, поэтому расскажу шаги.
1. Токенизируем текст элементарным регулярным выражением и бинарным поиском по списку токенов разбиваем текст на куски на одном языке с помощью библиотеки polyglot.
2. Проходим по кускам на одном языке, токенизируем с помощью spacy (spacy работает на основе моделей для конкретного языка, поэтому мы его можем использовать только для этого этапа и дальше). Для каждого токена мы вызываем функцию, которая цензурирует слово, разбирая его на подстроки.
3. В цикле, который завершается когда на очередной итерации мы ничего не зацензурировали, мы разбиваем слово в текущем состоянии на подстроки и выкидываем оттуда все подстроки, которые мы уже умеем цензурировать, а так же подстроки этих подстрок (их мы тоже умеем цензурировать, ведь мы же отцензурировали саму подстроку). Каждую подстроку цензурируем как отдельное слово. Если у нас выключен глубокий анализ, то после первой подстроки (то есть самого слова) мы заканчиваем.
4. Сначала мы с помощью всех доступных средств леммы слово. Если глубокий анализ включен, и лемма не является словарным словом, мы выбрасываем все символы, не являющиеся буквами. Потом мы смотрим, если все леммы у нас без мата, значит возвращаем слово как есть. Если у нас это слово уже было отцензурировано, то возвращаем его. Проходим по леммам. Если лемма попадает в мат, то цензурируем слово. Если нет и включён глубокий анализ, проверяем есть ли слово в нормальном словаре. Если слово есть, то дальше разбирать его не нужно. Если в нормальном словаре слова нет, то с помощью автомата Левенштейна ищем похожие на мат леммы. Если нашли, то цензурируем слово.
Пример (прошу прощения за мат :)): "бля" -> лемма "бля" -> поиск по словарю мата -> зацензурировали. "корабля" -> леммы "корабль", "корабля" -> мата нет -> проверяем по нормальному словарю -> есть в словаре, глубже не идём и часть слова "кораБЛЯ" не зацензурируем. "ухтыжбля" -> деление на подстроки -> "жбля" -> лемма "жбля" -> в словаре мата нет -> в нормальном словаре нет -> автомат Левенштейна находит похожесть на "бля" -> зацензурировали.
В общем это всё, за исключением некоторых тонкостей, которые проще понять из кода.
Чего не умеет библиотека: ASCII art из мата, выявление сложных конструкций типа "ты козёл!", строки типа "б л я" (из-за вычислительной сложности).