Какая хорошая библиотека фильтров Python для ненормативной лексики?

Как https://stackoverflow.com/questions/1521646/best-profanity-filter, но для Python — и я ищу библиотеки, которые я могу запускать и контролировать самостоятельно, в отличие от веб-сервисов.

(И хотя всегда приятно слышать ваши фундаментальные принципиальные возражения против фильтрации ненормативной лексики, я специально не ищу их здесь. Я знаю, что фильтрация ненормативной лексики не может улавливать каждую сказанное обидное. Я знаю ругань, по большому счету вещей, не является особенно большой проблемой. Я знаю, что вам нужен человеческий вклад, чтобы справиться с проблемами контента. Я просто хотел бы найти хорошую библиотеку и посмотреть, что я могу сделать из нее.)


person Paul D. Waite    schedule 20.08.2010    source источник


Ответы (6)


Я не нашел никакой библиотеки ненормативной лексики Python, поэтому сделал ее сам.

Параметры


filterlist

Список регулярных выражений, соответствующих запрещенному слову. Пожалуйста, не используйте \b, он будет вставлен в зависимости от inside_words.

Пример: ['bad', 'un\w+']

ignore_case

По умолчанию: True

Не требует пояснений.

replacements

По умолчанию: "$@%-?!"

Строка с символами, из которых будут случайным образом сгенерированы строки замены.

Примеры: "%&$?!" или "-" и т. д.

complete

По умолчанию: True

Определяет, будет ли заменена вся строка или будут сохранены первый и последний символы.

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."
person leoluk    schedule 20.08.2010
comment
Ненормативная лексика в первую очередь касается не слов, а использования; большинство слов, которые можно использовать как ненормативную лексику, имеют совершенно чистое употребление, и для их различения требуется гораздо больше, чем регулярное выражение. (Конечно, неважно, что что-либо подобное лишь побудит людей работать над этим.) - person Glenn Maynard; 07.10.2010
comment
(Я думаю, что просто добавление апострофов в слова делает его похожим на * износ.) - person Glenn Maynard; 07.10.2010
comment
@Glenn: да, мы знаем. Мы знаем, что фильтрация не является полным решением любой проблемы с ненормативной лексикой. Мы просто хотим знать, какие есть достойные библиотеки. - person Paul D. Waite; 07.10.2010
comment
@Paul: Ты включаешь леолука в мы? Любая приличная библиотека должна будет выполнять лексический анализ, байесовскую эвристику или тому подобное, чтобы различать различные варианты использования, а не просто запускать регулярное выражение. Этот код симпатичный, но не намного больше подходит для реального мира, чем bork ниже. - person Glenn Maynard; 07.10.2010
comment
@Glenn: Я бы и не мечтал говорить за хорошего парня. И не обязательно — поскольку компьютеры не понимают английский язык, библиотека не сможет сделать всю работу сама, ей потребуется помощь человека. Таким образом, запуск регулярного выражения может оказаться правильным балансом между мощностью и понятным кодом. Поэтому я говорю «хорошая библиотека» и «достойная библиотека», а не «волшебно совершенная библиотека». - person Paul D. Waite; 07.10.2010
comment
@Paul: Подход, который ищет только слова, не пытаясь различить контекст, отлично работает для небольшого подмножества языка, но оставляет огромное количество языка необнаружимым. Если заблокировать список Карлина — это все, что вы хотите сделать (поставить галочку в поле требования к функции), то это нормально, но я думаю, что есть значительная область практического анализа, помимо того, что можно сделать, чтобы сделать его чем-то ближе к практически полезному. (@Предложение Брайана может быть одним из них, но я не пробовал его, и они не предлагают общедоступную онлайн-демонстрацию. Просить нас о демонстрации никогда не бывает многообещающим знаком.) - person Glenn Maynard; 07.10.2010
comment
@Glenn: «Если заблокировать список Карлина — это все, что вы хотите сделать (поставить галочку в требовании к функции)», — кто сказал, что я хочу сделать любую из этих вещей? Вы правы в том, что есть много возможностей сделать что-то более полезное, чем просто регулярное выражение для слов, но вы еще не предложили ничего из этого в ответе. - person Paul D. Waite; 07.10.2010
comment
Я указал, что это решение не очень полезно с практической точки зрения, и сделал это, потому что казалось очевидным, что вы ищете нечто большее, чем тривиальное сопоставление слов. Я начинаю сожалеть о потраченном времени. - person Glenn Maynard; 07.10.2010
comment
превосходно! именно то, что я искал - person Ajay Gupta; 05.01.2016
comment
@GlennMaynard, ты ошибаешься; если я генерирую пароли или одноразовые коды или что-то еще, я просто хочу базовый фильтр. Практическое применение найдено. - person Rob Grant; 10.04.2018
comment
Это какие-то гнусные словечки. - person S.S. Anne; 03.01.2020

arrBad = [
'2g1c',
'2 girls 1 cup',
'acrotomophilia',
'anal',
'anilingus',
'anus',
'arsehole',
'ass',
'asshole',
'assmunch',
'auto erotic',
'autoerotic',
'babeland',
'baby batter',
'ball gag',
'ball gravy',
'ball kicking',
'ball licking',
'ball sack',
'ball sucking',
'bangbros',
'bareback',
'barely legal',
'barenaked',
'bastardo',
'bastinado',
'bbw',
'bdsm',
'beaver cleaver',
'beaver lips',
'bestiality',
'bi curious',
'big black',
'big breasts',
'big knockers',
'big tits',
'bimbos',
'birdlock',
'bitch',
'black cock',
'blonde action',
'blonde on blonde action',
'blow j',
'blow your l',
'blue waffle',
'blumpkin',
'bollocks',
'bondage',
'boner',
'boob',
'boobs',
'booty call',
'brown showers',
'brunette action',
'bukkake',
'bulldyke',
'bullet vibe',
'bung hole',
'bunghole',
'busty',
'butt',
'buttcheeks',
'butthole',
'camel toe',
'camgirl',
'camslut',
'camwhore',
'carpet muncher',
'carpetmuncher',
'chocolate rosebuds',
'circlejerk',
'cleveland steamer',
'clit',
'clitoris',
'clover clamps',
'clusterfuck',
'cock',
'cocks',
'coprolagnia',
'coprophilia',
'cornhole',
'cum',
'cumming',
'cunnilingus',
'cunt',
'darkie',
'date rape',
'daterape',
'deep throat',
'deepthroat',
'dick',
'dildo',
'dirty pillows',
'dirty sanchez',
'dog style',
'doggie style',
'doggiestyle',
'doggy style',
'doggystyle',
'dolcett',
'domination',
'dominatrix',
'dommes',
'donkey punch',
'double dong',
'double penetration',
'dp action',
'eat my ass',
'ecchi',
'ejaculation',
'erotic',
'erotism',
'escort',
'ethical slut',
'eunuch',
'faggot',
'fecal',
'felch',
'fellatio',
'feltch',
'female squirting',
'femdom',
'figging',
'fingering',
'fisting',
'foot fetish',
'footjob',
'frotting',
'fuck',
'fucking',
'fuck buttons',
'fudge packer',
'fudgepacker',
'futanari',
'g-spot',
'gang bang',
'gay sex',
'genitals',
'giant cock',
'girl on',
'girl on top',
'girls gone wild',
'goatcx',
'goatse',
'gokkun',
'golden shower',
'goo girl',
'goodpoop',
'goregasm',
'grope',
'group sex',
'guro',
'hand job',
'handjob',
'hard core',
'hardcore',
'hentai',
'homoerotic',
'honkey',
'hooker',
'hot chick',
'how to kill',
'how to murder',
'huge fat',
'humping',
'incest',
'intercourse',
'jack off',
'jail bait',
'jailbait',
'jerk off',
'jigaboo',
'jiggaboo',
'jiggerboo',
'jizz',
'juggs',
'kike',
'kinbaku',
'kinkster',
'kinky',
'knobbing',
'leather restraint',
'leather straight jacket',
'lemon party',
'lolita',
'lovemaking',
'make me come',
'male squirting',
'masturbate',
'menage a trois',
'milf',
'missionary position',
'motherfucker',
'mound of venus',
'mr hands',
'muff diver',
'muffdiving',
'nambla',
'nawashi',
'negro',
'neonazi',
'nig nog',
'nigga',
'nigger',
'nimphomania',
'nipple',
'nipples',
'nsfw images',
'nude',
'nudity',
'nympho',
'nymphomania',
'octopussy',
'omorashi',
'one cup two girls',
'one guy one jar',
'orgasm',
'orgy',
'paedophile',
'panties',
'panty',
'pedobear',
'pedophile',
'pegging',
'penis',
'phone sex',
'piece of shit',
'piss pig',
'pissing',
'pisspig',
'playboy',
'pleasure chest',
'pole smoker',
'ponyplay',
'poof',
'poop chute',
'poopchute',
'porn',
'porno',
'pornography',
'prince albert piercing',
'pthc',
'pubes',
'pussy',
'queaf',
'raghead',
'raging boner',
'rape',
'raping',
'rapist',
'rectum',
'reverse cowgirl',
'rimjob',
'rimming',
'rosy palm',
'rosy palm and her 5 sisters',
'rusty trombone',
's&m',
'sadism',
'scat',
'schlong',
'scissoring',
'semen',
'sex',
'sexo',
'sexy',
'shaved beaver',
'shaved pussy',
'shemale',
'shibari',
'shit',
'shota',
'shrimping',
'slanteye',
'slut',
'smut',
'snatch',
'snowballing',
'sodomize',
'sodomy',
'spic',
'spooge',
'spread legs',
'strap on',
'strapon',
'strappado',
'strip club',
'style doggy',
'suck',
'sucks',
'suicide girls',
'sultry women',
'swastika',
'swinger',
'tainted love',
'taste my',
'tea bagging',
'threesome',
'throating',
'tied up',
'tight white',
'tit',
'tits',
'titties',
'titty',
'tongue in a',
'topless',
'tosser',
'towelhead',
'tranny',
'tribadism',
'tub girl',
'tubgirl',
'tushy',
'twat',
'twink',
'twinkie',
'two girls one cup',
'undressing',
'upskirt',
'urethra play',
'urophilia',
'vagina',
'venus mound',
'vibrator',
'violet blue',
'violet wand',
'vorarephilia',
'voyeur',
'vulva',
'wank',
'wet dream',
'wetback',
'white power',
'women rapping',
'wrapping men',
'wrinkled starfish',
'xx',
'xxx',
'yaoi',
'yellow showers',
'yiffy',
'zoophilia']

def profanityFilter(text):
brokenStr1 = text.split()
badWordMask = '!@#$%!@#$%^~!@%^~@#$%!@#$%^~!'
new = ''
for word in brokenStr1:
    if word in arrBad:
        print word + ' <--Bad word!'
        text = text.replace(word,badWordMask[:len(word)])
        #print new

return text

print profanityFilter("this thing sucks sucks sucks fucking stuff")

Вы можете добавить или удалить из списка плохих слов arrBad по своему усмотрению.

person user2592414    schedule 17.07.2013
comment
Здесь есть несколько фраз, которые являются жемчужинами, которые мне действительно пришлось искать, потому что я не слышал их раньше. - person Tommy; 12.12.2014
comment
Какой @%^~@#$ отличный список! - person BringBackCommodore64; 03.03.2017
comment
Регулярные выражения полезны для списка плохих слов. Сотрудник написал список плохих слов на Perl для системы комментариев, которая искала такие вещи, как замененные символы в плохих словах. - person Michael Shopsin; 02.03.2018
comment
Есть ли библиотека, которая распознает фразы как непристойные? Например, общие фильтры, доступные сейчас, не будут воспринимать фразу «2 девушки 1 чашка 1» как ненормативную лексику. Я попробовал это, но даже если я добавлю пользовательские фразы в виде строк, это не сработает. - person deadcode; 12.12.2018
comment
Почему бы не упомянуть источник список плохих слов, которые вы использовали здесь - person Rohan Khude; 18.04.2019


Вероятно, вы могли бы объединить http://spambaes.sourceforge.net/ и http://www.cs.cmu.edu/~biglou/resources/bad-words.txt.

person Anand    schedule 07.10.2010
comment
Это хороший список. Вытащил просто в Python 3: def obscenities(): from urllib.request import urlopen resp = urlopen(cs.cmu.edu/~biglou/resources/bad-words.txt) badwords = str(resp.read()).split('\\n') return badwords - person RandallShanePhD; 08.08.2017

Ненормативная лексика? Что за х**ня? ;-)

Пройдет еще пара лет, прежде чем компьютер действительно сможет распознавать ругательства и ругательства, и я искренне надеюсь, что к тому времени люди поймут, что ненормативная лексика человечна, а не «опасна».

Вместо глупого фильтра используйте умного модератора-человека, который может сбалансировать тон обсуждения соответствующим образом. Модератор, который может обнаруживать нарушения, такие как:

«Если бы ты был моим мужем, я бы отравил твой чай». - "Если бы ты была моей женой, я бы выпил".

(это было от Уинстона Черчилля, кстати.)

person Aaron Digulla    schedule 20.08.2010
comment
В яблочко. Фильтры ненормативной лексики бессмысленны, по крайней мере, до тех пор, пока парсеры естественного языка не станут намного лучше. - person ; 20.08.2010
comment
@delnan: Я думаю, потому что я спросил, какая хорошая библиотека фильтров ненормативной лексики, а не должен ли я ее использовать вообще. Подобные предложения могут быть лучше в качестве комментариев, хотя они также могут быть действительными в качестве ответов. - person Paul D. Waite; 20.08.2010
comment
@ Аарон: да, я не планирую, чтобы машина сама справлялась с ненормативной лексикой. Но вместо того, чтобы заставлять человека смотреть на каждую чертову вещь на сайте, было бы неплохо, если бы машина могла подсказать, на что стоит обратить внимание. (Это не критика вашего ответа, так как я не объяснил, для чего я собирался использовать фильтр.) - person Paul D. Waite; 20.08.2010
comment
@ Аарон: о, и я думаю, что пройдет намного больше, чем пара лет, прежде чем компьютеры будут надежно понимать английский язык. И что подгруппа людей, которым небезразличны ругательства, никуда не делась. - person Paul D. Waite; 20.08.2010
comment
Я отрицаю это - я категорически не согласен с концепцией нейтральности ненормативной лексики. - person Paul Nathan; 20.08.2010
comment
@Paul: Успокойся, ты упускаешь мою мысль. Я хочу сказать, что оскорбления — это не только ненормативная лексика. У людей есть гораздо худшие способы травить друг друга, чем простые ругательства. Это то, что убивает душу общества, а не что-то другое. - person Aaron Digulla; 23.08.2010
comment
Лично я, как модератор, пропустил бы это только из-за высокого качества. - person intuited; 09.10.2010

Конечно, пользователи могут обойти это, но это должно сделать довольно тщательную работу по удалению ненормативной лексики:

import re
def remove_profanity(s):
    def repl(word):
        m = re.match(r"(\w+)(.*)", word)
        if not m:
            return word
        word = "Bork" if m.group(1)[0].isupper() else "bork"
        word += m.group(2)
        return word
    return " ".join([repl(w) for w in s.split(" ")])

print remove_profanity("You just come along with me and have a good time. The Galaxy's a fun place. You'll need to have this fish in your ear.")
person Glenn Maynard    schedule 07.10.2010
comment
борк борк борк.... борк борк ... борк'л борк борк - person Dzamo Norton; 07.08.2018