4 ноября 2014 г.

Модуль выявления и обработки русской ненормативной лексики на Python

Вообще, пресечь мат (ненормативную лексику) в данных, поступающих от пользователя и никак не модерируемых — задача сложная и вряд ли решаемая. Пользователь для достижения цели (написания мата) может использовать как богатые возможности русского языка для словообразования, так и различные уловки: вставка каких-то символов между буквами, замена букв на похожие. Даже описать весь спектр возможностей — колоссальный труд. И, надо сказать, такие попытки предпринимались. Но я решил обойтись "малой кровью". Понятно, что бороться с матом сложно. Но можно помочь в модерации.

Представьте, что модератору какой-либо информации приходится просматривать десятки тысяч знаков в день на предмет выявления мата. Невольно можно пропустить что-то. Но можно в тексте, например, автоматически подсветить необходимые фрагменты и жизнь уже станет чуточку проще. Конечно, это не избавляет от ошибок, потому что любой алгоритм в силу вышеуказанных причин обречен на провал, но вероятность ошибки всё же меньше.

Для решения поставленной цели — помочь модераторам — посмотрел на способы решения. В общем случае их 2: регулярные выражения и сопоставление со словарем. Решил создать моуль, объединяющий оба этих способа.

Способ сопоставления со словарем — самый интересный. Он основан на морфологическом анализе слов, приведении этих слов к нормальной форме и сопоставлении нормальных форм слов. Для морфологического анализа и нормализации я использовал шикарную утилиту Pymorphy2. Составил базу данных уже нормализованных слов. Этот способ очень неплохо работает. Из плюсов можно отметить "обучаемость". То есть если вы нашли какое-то неучтенное слово — просто добавьте его в словарь. Минусы этого способа: более низкая производительность по сравнению с анализом на основе регулярных выражений и невозможность учесть трюки пользователей, о которых упоминалось ранее.

Способ на основе анализа регулярными выражениями тоже можно использовать. Но для "обучения" придется дописывать паттерны.

Как использовать модуль, в общем-то, выбирать заинтересовавшимся этим модулем пользователям. Использовать его с фреймверком Django можно так. Устанавливаем пакет:

$ pip install djantimat

Добавляем в INSTALLED_APPS приложение djantimat и делаем миграцию:

manage.py migrate djantimat

Для подгрузки заготовленного словаря надо сделать syncdb или подгрузить фикстуру:

manage.py loaddata djantimat/fixtures/initial_data.json

Если вы вне фреймверка Django, то вам придется самим разобрать базу из файла djantimat/fixtures/initial_data.json и подменить свойство PymorphyProc.words списком слов.

Использование:

from djantimat.helpers import PymorphyProc, RegexpProc

# Способ со словарем

# Есть ли матерные слова в тексте:
slang_detected = PymorphyProc.test(u'Здесь текст с матерками')

# Замена матерных слов в тексте шаблоном:
without_slang = PymorphyProc.replace(u'Здесь текст с матерками', repl='[xxx]')

# Оборачивание матерных слов в тексте например тегом:
highlighted_slang = PymorphyProc.wrap(u'Здесь текст с матерками', wrap=('<pre>', '</pre>',))

# Способ с регулярками

# Есть ли матерные слова в тексте:
slang_detected = RegexpProc.test(u'Здесь текст с матерками')

# Замена матерных слов в тексте шаблоном:
without_slang = RegexpProc.replace(u'Здесь текст с матерками', repl='[xxx]')

# Оборачивание матерных слов в тексте например тегом:
highlighted_slang = RegexpProc.wrap(u'Здесь текст с матерками', wrap=('<pre>', '</pre>',))

Буду рад любым предложениям по усовершенствованию.

Пакет на PyPI.

Исходники на github.

2 комментария:

Filo комментирует...

Юнна Мориц Книга «Сквозеро»
народ выражается матом,
больших достигая высот. http://www.moscowbooks.ru/book.asp?id=734227

Анонимный комментирует...

У вас есть проверка на запрещённые слова? Типо блять

Отправить комментарий