Как и https://stackoverflow.com/questions/1521646/best-profanity-filter , но для Python - и я ищу библиотеки, которые могу запустить и контролировать себя локально, в отличие от веб-сервисов.
(И хотя всегда приятно услышать ваши принципиальные возражения против фильтрации ненормативной лексики, я их здесь специально не ищу. Я знаю, что фильтрация ненормативной лексики не подхватит каждая обидная вещь, о которой говорят, я знаю, что ругаться, по большому счету, не особенно большая проблема. Я знаю, что вам нужен человеческий вклад для решения вопросов контента. Я просто хотел бы найти хорошую библиотеку и посмотреть, как я могу ее использовать.)
Я не нашел ни одной библиотеки ненормативной лексики Python, поэтому сделал ее сам.
список фильтров
Список регулярных выражений, соответствующих запрещенному слову. Не используйте \ b
, он будет вставлен в зависимости от inside_words
.
Пример:
['bad', 'un \ w +']
ignore_case
По умолчанию: True
Не требует пояснений.
replacements
По умолчанию: «$ @% - ?!»
Строка с символами, из которых будут случайным образом сгенерированы строки замены.
Примеры: «% & $ ?!»
или «-»
и т. Д.
завершено
По умолчанию: Истина
Контролирует, все ли строка будет заменена или если первый и последний символы будут сохранены.
inside_words
По умолчанию: False
Управляет поиском слов внутри других слов. Отключение этого
(примеры в конце)
"""
Module that provides a class that filters profanities
"""
__author__ = "leoluk"
__version__ = '0.0.1'
import random
import re
class ProfanitiesFilter(object):
def __init__(self, filterlist, ignore_case=True, replacements="$@%-?!",
complete=True, inside_words=False):
"""
Inits the profanity filter.
filterlist -- a list of regular expressions that
matches words that are forbidden
ignore_case -- ignore capitalization
replacements -- string with characters to replace the forbidden word
complete -- completely remove the word or keep the first and last char?
inside_words -- search inside other words?
"""
self.badwords = filterlist
self.ignore_case = ignore_case
self.replacements = replacements
self.complete = complete
self.inside_words = inside_words
def _make_clean_word(self, length):
"""
Generates a random replacement string of a given length
using the chars in self.replacements.
"""
return ''.join([random.choice(self.replacements) for i in
range(length)])
def __replacer(self, match):
value = match.group()
if self.complete:
return self._make_clean_word(len(value))
else:
return value[0]+self._make_clean_word(len(value)-2)+value[-1]
def clean(self, text):
"""Cleans a string from profanity."""
regexp_insidewords = {
True: r'(%s)',
False: r'\b(%s)\b',
}
regexp = (regexp_insidewords[self.inside_words] %
'|'.join(self.badwords))
r = re.compile(regexp, re.IGNORECASE if self.ignore_case else 0)
return r.sub(self.__replacer, text)
if __name__ == '__main__':
f = ProfanitiesFilter(['bad', 'un\w+'], replacements="-")
example = "I am doing bad ungood badlike things."
print f.clean(example)
# Returns "I am doing --- ------ badlike things."
f.inside_words = True
print f.clean(example)
# Returns "I am doing --- ------ ---like things."
f.complete = False
print f.clean(example)
# Returns "I am doing b-d u----d b-dlike things."
Ненормативная лексика? Что это за хрень? ; -)
Пройдет еще пара лет, прежде чем компьютер действительно сможет распознавать ругань и ругань, и я искренне надеюсь, что к тому времени люди поймут, что ненормативная лексика является гуманной, а не «опасной».
Вместо глупого фильтра используйте умного модератора-человека, который может уравновесить тон обсуждения соответствующим образом. Модератор, который может обнаруживать насилие вроде:
«Если бы вы были моим мужем, я бы отравил ваш чай». - «Если бы ты была моей женой, я бы выпил».
(это было от Уинстона Черчилля, между прочим.)