Beispiel #1
0
 def test_bad_words_m(self):
     words = set()
     extended = {'мудак', 'мудачок'}
     if extended_filter_enabled:
         words.update(extended)
     else:
         for word in extended:
             self.assertEqual(0, Antimat.bad_words_count(word), word)
     for word in words:
         self.assertEqual(1, Antimat.bad_words_count(word), word)
Beispiel #2
0
 def test_manda(self):
     bad = 'манда'.split(' ')
     good = 'город Мандалай, округ Мандаль, индейский народ Мандан, фамилия Мандель, мандарин, мандаринка'.split(
         ', ')
     is_good = 0 if extended_filter_enabled else 0
     is_bad = 1 if extended_filter_enabled else 0
     for word in good:
         self.assertEqual(is_good, Antimat.bad_words_count(word), word)
     for word in bad:
         self.assertEqual(is_bad, Antimat.bad_words_count(word), word)
Beispiel #3
0
 def test_bad_words_p(self):
     words = {
         'пизда', 'пезда', 'пезды', 'пизде', 'пиздёж', 'пизду', 'пиздюлина',
         'пиздобол', 'опиздинеть', 'пиздых', 'подпёздывать'
     }
     extended = {'пидор', 'педор', 'пидар'}
     if extended_filter_enabled:
         words.update(extended)
     else:
         for word in extended:
             self.assertEqual(0, Antimat.bad_words_count(word), word)
     for word in words:
         self.assertEqual(1, Antimat.bad_words_count(word), word)
Beispiel #4
0
 def test_pretext(self):
     words = [
         'уебать', 'охуеть', 'ахуеть', 'вспизднуть', 'коноебиться',
         'мудаёб', 'остопиздело', 'худоебина', 'впиздячить', 'схуярить',
         'съебаться', 'въебать', 'ёбля'
     ]
     for word in words:
         self.assertEqual(1, Antimat.bad_words_count(word), word)
Beispiel #5
0
 def test_bad_words_e(self):
     words = [
         'ебу', 'еби', 'ебут', 'ебать', 'ебись', 'ебёт', 'поеботина',
         'выебываться', 'ёбарь', 'ебло', 'ебла', 'ебливая', 'еблись',
         'еблысь', 'ёбля', 'ёбнул', 'ёбнутый', 'взъёбка', 'ебсти',
         'долбоёб', 'дураёб', 'изъёб', 'заёб', 'заебай', 'разъебай',
         'мудоёбы', 'ёб'
     ]
     for word in words:
         self.assertEqual(1, Antimat.bad_words_count(word), word)
Beispiel #6
0
 def test_words(self):
     bad_words = set()
     with open(self.words, 'r', encoding='utf-8') as f:
         for line in f:
             # self.assertEqual(0, Antimat.bad_words_count(line), line)
             bad_words.update(word.lower()
                              for word in Antimat.bad_words(line))
     with open(r'..\tmp\antimat\words\words_bad.txt', 'w',
               encoding='utf-8') as f:
         f.writelines(f'{word}\n' for word in sorted(bad_words))
Beispiel #7
0
 def test_messages_collection(self):
     bad_words = set()
     with open(self.messages_collection, 'r', encoding='utf-8') as f:
         for line in f:
             bad_words.update(word.lower()
                              for word in Antimat.bad_words(line))
     with open(r'..\tmp\antimat\messages_collection_bad.txt',
               'w',
               encoding='utf-8') as f:
         f.writelines(f'{word}\n' for word in sorted(bad_words))
Beispiel #8
0
 def test_wp():
     bad_words = set()
     with open(r'..\tmp\antimat\text_for_mat.txt', 'r',
               encoding='utf-8') as f:
         for line in f:
             bad_words.update(word.lower()
                              for word in Antimat.bad_words(line))
     with open(r'..\tmp\antimat\text_for_mat_bad.txt',
               'w',
               encoding='utf-8') as f:
         f.writelines(f'{word}\n' for word in sorted(bad_words))
Beispiel #9
0
 def test_oxxxymiron(self):
     words = set(
         'говно залупа пенис хер давалка хуй блядина головка шлюха жопа член еблан петух мудила рукоблуд ссанина очко блядун вагина сука ебланище влагалище пердун дрочила пидор пизда туз малафья гомик мудила пилотка манда анус вагина путана педрила шалава хуила мошонка елда'
         .split(' '))
     bad = set(
         'хуй блядина еблан блядун ебланище пизда хуила елда'.split(' '))
     extended = 'мудила пидор мудила манда педрила говно залупа шлюха мудила дрочила шалава'.split(
         ' ')
     if extended_filter_enabled:
         # TODO: добавить в плохие: хер сука жопа
         bad.update(extended)
     else:
         for word in extended:
             self.assertEqual(0, Antimat.bad_words_count(word), word)
     good = words - bad
     for word in good:
         self.assertEqual(0, Antimat.bad_words_count(word),
                          f'{word} (false positive)')
     for word in bad:
         self.assertEqual(1, Antimat.bad_words_count(word),
                          f'{word} (should be bad)')
Beispiel #10
0
 def cmd_mats(cls, bot: telegram.Bot, update: telegram.Update) -> None:
     uid = update.message.from_user.id
     # только админ бота может использовать команду
     if uid != CONFIG.get('debug_uid', None):
         return
     # получаем параметры команды (текст после "/mats ")
     text = update.message.text.partition(' ')[2].strip()
     if not text:
         return
     # получаем мат
     mat_words = list(word.lower() for word in Antimat.bad_words(text))
     if len(mat_words) == 0:
         return
     # отправляем мат
     matshowtime.send(bot, mat_words)
Beispiel #11
0
 def test_false_positive(self):
     words = [
         'себя',
         'себе',
         'не будет',
         'sasha_rebinder',
         'rebinder',
         'ниже были',
         'ребиндер',
         'ребята',
         'ребзя',
         'мебель',
         'меблирование',
         'ребятишки',
         'чебурашка',
         'команду',
         'команда',
         'команды',
         'веб',
         'web',
         'вэбдизайн',
         'веб-страница',
         'небось',
         'тебя',
         '42рубля',
         'ebay',
         'ebook',
         'eboot',
         'snegopad',
         'чебурнет',
         'чебуратор',
         'снегопад',
         'азимандий',
         'аманда',
         'аманды',
         'безмандариновый',
         'бесхребетный',
         'бельмондо',
         'бомонд',
         'бухую',
         'взахлеб',
         'взахлёб',
         'военнокомандующими',
         'волшебную',
         'волшебная',
         'волшебник',
         'волшебство',
         'втихую',
         'хуис',
         'хуиз',
         'выгребную',
         'главнокомандующему',
         'главнокомандующий',
         'даблкомандер',
         'даблкоммандер',
         'тоталкомандер',
         'командер',
         'командир',
         'дебатам',
         'дебатах',
         'дебатировала',
         'дебатов',
         'дебаты',
         'дебетка',
         'дебетовая',
         'ебилдов',
         'ебилд',
         'ещеб',
         'ещёб',
         'загреб',
         'загребе',
         'злоупотреблять',
         'злоупотребление',
         'коммандер',
         'коммандировки',
         'коммандника',
         'коммандос',
         'комманды',
         'корабля',
         'красноухую',
         'красноухие',
         'лечебную',
         'лечебная',
         'мандат',
         'мандраж',
         'наскребсти',
         'наскребёт',
         'насухую',
         'небоскреб',
         'нормандии',
         'обособляла',
         'озимандий',
         'ослабляет',
         'перебанить',
         'погреб',
         'плохую',
         'подстебать',
         'подстеб',
         'подстебнула',
         'покомандовать',
         'пооскорблять',
         'оскорблять',
         'поскрёб',
         'послабляющее',
         'постебать',
         'потребляет',
         'потребляете',
         'потребляешь',
         'потребляла',
         'потребляют',
         'потребует',
         'потребуется',
         'потребление',
         'потребство',
         'пригублять',
         'протоархимандритом',
         'психует',
         'психую',
         'психующий',
         'разгребать',
         'разгребала',
         'расслабляемся',
         'расслабляет',
         'расслабляющие',
         'ребут',
         'ребутнуть',
         'ребус',
         'роспотреб',
         'рублям',
         'рублях',
         'саблями',
         'сабля',
         'саламандр',
         'саламандра',
         'свадеб',
         'свадебную',
         'сгрёб',
         'скребет',
         'скребутся',
         'спидорак',
         'спидораковое',
         'спидранил',
         'спидраннеры',
         'стеб',
         'стебал',
         'стебалась',
         'стебали',
         'стебались',
         'стебался',
         'стебанулся',
         'стебать',
         'стебетесь',
         'стебется',
         'стебут',
         'стёб',
         'судебную',
         'судебная',
         'талеб',
         'тебе-то',
         'себя-то',
         'требует',
         'требуется',
         'трудовыебудни',
         'углубляться',
         'уподобляешься',
         'уподобляться',
         'употребляешь',
         'употреблять',
         'усугубляет',
         'усугубляй',
         'неусугубляй',
         'уху',
         'учебу',
         'учебу/туризм',
         'хаммонд',
         'хлеб',
         'хлебали',
         'хлебнуть',
         'хребет',
         'чармондер',
         'ширпотреб',
         'бляха',
         'бляхамуха',
         'бляха-муха',
         'ебук',
         'дебет',
         'веллдан',
         'небаталов',
         'небосклон',
         'педро',
         'дубляж',
         'дубляжам',
         'хуизит',
         'хуисит',
         'щебет',
         'щебетали',
         'погребальная',
         'чмокнул',
         'чмокал',
         'тихую',
         'истребится',
         'лихую',
         'оглоблях',
         'раздробляются',
         'погребения',
         'гребсти',
         'икебана',
         'слышала/видела',
         'граблями',
         'загребали',
         'гребет',
         'гребная',
         'бляшек',
         'осклябляясь',
         'BASOULHQUNXYYNXCWREHVFHRO2A',
         'хуу',
         'XYYN',
     ]
     for word in words:
         self.assertEqual(0, Antimat.bad_words_count(word), word)
Beispiel #12
0
    def parse_message_stat(uid, cid, message, entities):
        result = UserStat()
        result.uid = uid
        result.cid = cid
        result.last_activity = message.date
        result.all_messages_count = 1

        if message.reply_to_message is not None:
            result.sent_replies_count = 1
            reply_stat = UserStat(received_replies_count=1)
            reply_stat.uid = message.reply_to_message.from_user.id
            reply_stat.cid = cid
            UserStat.add(reply_stat)

        for entity, entity_text in entities.items():
            if entity.type == 'mention':
                result.sent_mentions_count = result.sent_mentions_count + 1
                username = entity_text.lstrip('@').strip()
                try:
                    mentioned_user = UserDB.get_by_username(username)
                    if mentioned_user:
                        mentioned_stat = UserStat(received_mentions_count=1)
                        mentioned_stat.uid = mentioned_user.uid
                        mentioned_stat.cid = cid
                        UserStat.add(mentioned_stat)
                except Exception as e:
                    logger.error(e)
                continue
            if entity.type == 'hashtag':
                result.hashtags_count = result.hashtags_count + 1
                continue
            if entity.type == 'bot_command':
                result.bot_commands_count = result.bot_commands_count + 1
                continue
            if entity.type == 'email':
                result.emails_count = result.emails_count + 1
                continue
            if entity.type == 'url':
                result.urls_count = result.urls_count + 1
                result.top_domain = UserDomains.update_user_top_domain(
                    uid, cid, entity_text)
                continue

        # True - если это форвард чужого сообщения
        # нам тогда не нужно учитывать статистику текста
        foreign_forward = False
        if message.forward_date is not None:
            result.forwards_count = 1
            if message.forward_from is None or message.forward_from.id != uid:
                foreign_forward = True

        if message.text is not None and not foreign_forward:
            result.text_messages_count = 1
            obscene_words_count = Antimat.bad_words_count(message.text)
            if obscene_words_count > 0:
                result.text_messages_with_obscene_count = 1
            result.obscene_words_count = result.obscene_words_count + obscene_words_count
            result.words_count = result.words_count + len(message.text.split())
            result.chars_count = result.chars_count + len(message.text)
            result.chars_wo_space_count = result.chars_wo_space_count + result.chars_count - message.text.count(
                ' ')
            result.emoji_count = len(
                [e for e in message.text if e in emoji.UNICODE_EMOJI])

        if message.audio is not None:
            result.audios_count = 1

        if message.document is not None:
            if message.document.mime_type == 'video/mp4' or (
                    message.document.file_name is not None
                    and message.document.file_name.endswith('.gif')):
                result.gifs_count = 1
            else:
                result.documents_count = 1

        if message.game is not None:
            result.games_count = 1

        if len(message.photo) > 0:
            result.photos_count = 1

        if message.sticker is not None:
            result.stickers_count = 1

        if message.video is not None:
            result.videos_count = 1

        if message.voice is not None and not foreign_forward:
            result.voices_count = 1
            result.voices_duration = message.voice.duration

        if message.video_note is not None and not foreign_forward:
            result.video_notes_count = 1
            result.video_notes_duration = message.video_note.duration

        if message.caption is not None and not foreign_forward:
            result.obscene_words_count = result.obscene_words_count + Antimat.bad_words_count(
                message.caption)
            result.words_count = result.words_count + len(
                message.caption.split())
            result.chars_count = result.chars_count + len(message.caption)
            result.chars_wo_space_count = result.chars_wo_space_count + result.chars_count - message.caption.count(
                ' ')

        return result
Beispiel #13
0
 def test_bad_words_x(self):
     words = ['хуй', 'хуя', 'хую', 'хуем', 'хуёвый', 'охуительный']
     for word in words:
         self.assertEqual(1, Antimat.bad_words_count(word), word)
Beispiel #14
0
 def test_words(self):
     words = {
         'xyясe',
         'хуясе',
         'Xyй',
         'Ёбтеть',
         'что за хуйня',
         'приебнутый',
         'бл*ядь',
         'ахуенна',
         'ееееееелда',
         'проеб',
         'ретроеб',
         'пешееб',
         'точкоёб',
         'удкоеб',
         'ахуел',
         'хуисосить',
         'хуистика',
         'хуисываться',
         'хуизнь',
         'хуизм',
         'охуительный',
         'ееебааать',
         'хуюсно',
         'пиздосия',
         'пиздюк',
         'хуюх',
         'блякукарек',
         'хуютра',
         'пиздец',
         'ебать',
         'хуютречка',
         'долбоёбов',
         'выблядок',
         'пиздосище',
         'пиздострадает',
         'хуютине',
         'дохуя',
         'нахуй',
         'хуютки',
         'ебанулся',
         'нихуя',
         'блядь',
         'бляд',
         'бля',
         'блячяяя',
         'пиздосно',
         'хуюси',
         'хуирка',
         'похуить',
         'хуйню',
         'ебейший',
         'ахуенна',
         'хуюсь',
         'хуюф',
         'заебись',
         'хуюсство',
         'блядорумынский',
         'пиздосищеее',
         'еблан',
         'хуила',
         'хуюче',
         'пизда',
         'хуемордый',
         'пиздос',
         'пиздосики',
         'хуютро',
         'хуютром',
         'хуюсечка',
         'хуюхер',
         'хуюсев',
         'блядина',
         'пиздоссссс',
         'пиздострадалище',
         'нахуя',
         'нахуйь',
         'спиздило',
         'похуй',
         'очкохуялище',
         'пиздюкам',
         'охуенные',
         'блядун',
         'пиздородов',
         'хуюта',
         'хуюточки',
         'пиздосиики',
         'блять',
         'хуя',
         'хуютречко',
         'хуют',
         'долбоебами',
         'блядиность',
         'ебланище',
         'хуюсский',
         'хуй',
     }
     extended = {
         'збс', 'хз', 'додрочил', 'дрочил', 'дрочка', 'дрочильня',
         'задрочился', 'надрочил', 'подрочил', 'говнобложик', 'гребаный',
         'говноблогира', 'говноводителей', 'мудак', 'говновиндоус',
         'говнобанк', 'чмо', 'говноаеалитик', 'шлюху', 'говно',
         'говнобаянам', 'манда', 'пидор', 'говноаватарка', 'говноаймакса',
         'мудака', 'дерьмо', 'гондон', 'залупа', 'шлюха', 'гребаные',
         'грёбанные'
     }
     if extended_filter_enabled:
         words.update(extended)
     else:
         for word in extended:
             self.assertEqual(0, Antimat.bad_words_count(word),
                              f'{word} (false positive)')
     for word in words:
         self.assertEqual(1, Antimat.bad_words_count(word), word)
Beispiel #15
0
 def test_names(self):
     words = 'Орзэмэс, Варзамес, Уэзырмэс, Орзик, Арзамас, Органайзер, Оренбург, Орнамент, Аризона, Озарк, Арьегард, Осирис, Озимандий, Orgazmotron, Аркамбаз, Арканзас, Орзумандий, Юрий, Анубис, Озарий, Орангзеб, Орзабэль, Орметес, Оразгуль, Орзометр, Орион, Оракул, Орегон, Оркестр, Орнитолог, Ортопед, Оренбург, Орнитопод, Орнамент, Ортаногенез, Ортодокс, Обскур, Орбакайте, Оргазмолог, Ордабасы, Оргазмайзер, Орсимер, покупаешь печенье ОРЕО, Оториноларинголог, Омагат, Орзан Кадыров, Артмани, Виктор Цой, заказываешь суши, носишь бороду, вуапще красаучик 😘, играешь джаз, даришь девушкам цветы, НЕ постишь селфи, Борщ С Водочкой, так грациозна и мила. обворожительна. прекрасна. ты так желанна и опасна. тебе ведь нет еще 16 лет, Орифлеймс, покупаешь автомат, говоришь всем комплименты, пьешь прямо с утра, Озидяима, Мерзомес, Орзамент, Орзамемс, Бодифлекс, Оксисайз, Озарк, Гномерзас, Ойзэмэс, Ореземес, Адинослав, Адислав, Адыслав, Анастаслав, Анислав, Бедислав, Белослав, Бенислав, Береслав, Берислав, Бечислав, Благослав, Богослав, Богуслав, Бодеслав, Боеслав, Божеслав, Болеслав, Борислав, Бохаслав, Бранислав, Братислав, Брацислав, Бронеслав, Бронислав, Брячислав, Будислав, Буеслав, Буслав, Быслав, Вадислав, Вакслав, Вартислав, Васлав, Ваславий, Ватрослав, Вацлав, Векослав, Велеслав, Венеслав, Венкеслав, Венислав, Венцеслав, Верислав, Верослав, Верхослав, Веслав, Вестислав, Видислав, Видослав, Виленслав, Вилислав, Вирослав, Вислав, Витаслав, Витчеслав, Витязослав, Вишеслав, Владжислав, Владислав, Властислав, Внислав, Воислав,Волеслав, Воротислав, Вратислав, Вростислав, Всеслав, Вукослав, Вчеслав, Вышеслав, Вятчеслав, Годислав, Годослав, Гореслав, Горислав, Гостислав, Градислав, Гранислав, Гремислав, Губислав, Гудислав, Далеслав, Данислав, Данслав, Даньслав, Дарослав, Дедослав, Дезислав, Денислав, Десислав, Доброслав, Домослав, Домислав, Дорислав, Драгослав, Егослав, Егославий, Ездислав, Ерослав, Есислав, Зареслав, Зарислав, Заслав, Збыслав, Звенислав, Звонислав, Здеслав, Здислав, Златислав, Златослав, Зореслав, Изяслав, Истислав, Калислав, Кареслав, Карислав, Крайслав, Краснослав, Критислав, Ладислав, Ленислав, Ленслав, Летослав, Литослав, Лихослав, Лудислав, Леслав, Лехослав, Любослав, Майеслав, Мечеслав, Милослав, Мирослав, Мстислав, Мсцислав, Негослав, Огнеслав, Одеслав, Одислав, Переслав, Переяслав, Православ, Преслав, Путислав, Пшемыслав, Радаслав, Радислав, Радослав, Ратислав, Растислав, Раслав, Рослав, Ростислав, Росцислав, Росцислау, Рудослав, Руславий, Сбыслав, Светислав, Светослав, Свойслав, Святослав, Сдеслав, Слава, Славик, Славозар, Славозавр, Славомир, Собеслав, Собислав, Сталинослав, Станислав, Станислас, Старислав, Стрезислав, Судислав, Сулислав, Таислав, Твердислав, Твердослав, Творислав, Терпислав, Техослав, Тихослав, Толислав, Томилослав, Томислав, Требислав, Трудослав, Услав, Хвалислав, Хлебослав, Ходислав, Хотислав, Хранислав, Христослав, Цветислав, Цветослав, Цдислав, Цеславий, Цтислав, Чаеслав, Часлав, Чеслав, Честислав, Числав, Чистослав, Чтислав, Чурослав, Эрислав, Югославий, Юраслав, Юреслав, Юрислав, Юрослав, Янислав, Ярослав, Ячислав, Оргазмослав, Какятебеслав, Воландемортослав'.split(
         ', ')
     for word in words:
         self.assertEqual(0, Antimat.bad_words_count(word), word)
Beispiel #16
0
 def test_count(self):
     self.assertEqual(
         4,
         Antimat.bad_words_count(
             'Да охуеть блять, вы заебали, охуели совсем в конец уже!'))
Beispiel #17
0
 def test_empty(self):
     self.assertEqual(0, Antimat.bad_words_count(''))
Beispiel #18
0
 def test_bad_words_b(self):
     words = ['бля', 'блять', 'бляди']
     for word in words:
         self.assertEqual(1, Antimat.bad_words_count(word), word)
Beispiel #19
0
 def test_is_word_bad(self):
     good = {
         'хлебало',
         'хлебала',
         'скипидар',
     }
     extended = {
         'пидор', 'пидар', 'пидер', 'пидр', 'говно', 'гавно', 'мудак',
         'мудачьё', 'гондон', 'чмо', 'дерьмо', 'шлюха', 'залупа', 'золупа',
         'манда', 'монда', 'сучара'
     }
     bad = [
         'пизда',
         'пиздец',
         'пизды',
         'пезда',
         'хуй',
         'хуйло',
         'хуюшки',
         'охуевший',
         'охуел',
         'охуеть',
         'пидор',
         'пидар',
         'пидер',
         'пидр',
         'ебаный',
         'ебака',
         'ебало',
         'ёбаный',
         'ебать',
         'уебан',
         'уёбок',
         'уебот',
         'ебло',
         'ёбла',
         'ёбли',
         'ебли',
         'выеб',
         'выёб',
         'выебли',
         'выебали',
         'бля',
         'говно',
         'гавно',
         'мудак',
         'мудачьё',
         'гондон',
         'чмо',
         'дерьмо',
         'шлюха',
         'залупа',
         'золупа',
         'манда',
         'монда',
         'сучара',
         'далбаёб',
         'долбоёб',
         'далбаёбы',
     ]
     if not extended_filter_enabled:
         bad = list(set(bad) - extended)
         good.update(extended)
         for word in extended:
             self.assertEqual(0, Antimat.bad_words_count(word), word)
     for word in bad:
         self.assertTrue(self.words_filter.is_word_bad(word), word)
     for word in good:
         self.assertFalse(self.words_filter.is_word_bad(word), word)