March 31st, 2009

Русский мат

После обсуждения в ru_perl фильтра нецензурных выражений реинкарнировал старую резалку мата.

Прошлый алгоритм сначала готовил текст (убирал пробелы, дубликаты букв, приводил к одному регистру), удалял из него слова, похожие на маты (пример - чЕБУрашка и тЕБЕНёк) а потом искал в нём, прогоняя его через пачку регулярных выражений. При нахождении в тексте subj., определить, где он был в оригинальном тексте не представлялость возможным; с другой стороны, некоторую информацию давал номер сработавшего регулярного выражения.

Новый алгоритм также готовит текст, но не меняет в нём количество букв (за исключением приклеивания спереди и сзади по пробелу - чтобы не делать различия между пробелом и границами строки), строит два общих регулярных выражения - одно для исключений, другое для матов; заменяет НЕматы на соответствующее длине вхождения количество подчёркиваний, а потом ищет в этой же строке маты, заменяя буквы с теми же позициями в ОРИГИНАЛЬНОЙ строке звёздочками. Без необходимости замены - проще (увеличивает значение счётчика).

Плюсы - быстрее работает, возможна автокорректировка текста (те самые звёздочки), конфиг управляемый (содержит простое для неподготовленного пользователя подмножество регулярных выражений - буква, множество букв, необязательность (вопросик), пробел, непробел, и возможно_пробел (\s*) а так же отображения букв - ж -> жЖjJ zH }|{ и допускает комментарии), модуль совершенно не зависит от языка.

Минусы - был сложен в разработке (один только оптимизирующий компилятор регулярных выражений вспоминаю с теплотой и некоторым содроганием), не распознаёт особо сложные случаи типа 3.14ЗДЕЦ, }}}{{{уй (но распознаёт }{уй).

Сейчас причёсываю код, оформляю комментариями.