Filtrer les propos pornos avec Python


Tous les ans, on croise des tentatives desespérées de nettoyer les messages des chats, fora et commentaires de blog automatiquement. Objectif: filtrer les gros mots.

La solution commence le plus souvent par quelque chose qui ressemble à ceci :

import re
 
def strip_bad_words(text, replace_text='***', 
                    words=('fuck', 'fucking', 'dick', 'ass', 'tit', 'anus')):
    return re.sub('(?i)[^\s]*(%s)[^\s]*' % '|'.join(words), 
                  replace_text, text)

Et cela s’utilise comme ça:

>>> strip_bad_words('Suck my dick')
'Suck my ***'

C’est là que le fun commence.

Prenons l’exemple d’un forum d’un MMORPG aux USA. Vous voulez que la communauté reste cordiale, vous implémentez donc la solution ci-dessus.

Mais très vite les utilisateurs se plaignent: si ils parlent de l’artefact glass ou de la classe assassin ou tout autre mot qui contient ass, c’est filtré. Idem pour Uranus ou Manuscript qui contiennent du coup anus.

Mais vous n’êtes pas tombé de la dernière pluie, vous vous dites je sais, je vais bloquer uniquement les mots entiers entourés d’espaces. Mais c’est oublier que le language humain est une vaste blague qui contient des choses merveilleuses comme :

– des noms de gens (DICK Tracy) ;
– des noms d’animaux (génial non ?) ;
– des noms de lieux. Tu habites où ? Euhhh….

Je prends un exemple en anglais parce que je travaille beaucoup avec cette langue, mais c’est vrai dans toutes les langues : il y a des perles comme le Rio Culo Seco à Panama (le fleuve cul sec) pour les espagnols ou les villages Viols le fort, Gland ou encore Branlette pour les français.

Ce ne sont que des exemples pris à la va-vite. Croyez moi, il y a des centaines de cas tordus, et avec quelques milliers de messages par jour, on tombe dessus très vite, et très souvent.

Mais vous êtes un Dieu de l’analyse linguistique, et vous décidez que vous allez créer des pondérations pour décider contextuellement si il faut remplacer un mot ou pas.

Mouarf.

Les humains sont des créatures géniales, dotées du pouvoir de l’imagination et ils ont créé des trucs qui n’ont ni queue ni tête, impossible à analyser. Par exemple l’Heroic Fantasy. Et là, bonne chance pour vous dépatouiller avec les noms de nains et d’elfes qui s’embrouillent poliment.

Mais le pire, c’est que de toute façon votre filtre sera contourné dans la journée.

Je joue à Starcraft 2 de temps à autres, et Blizzard, qu’on ne peut pas vraiment qualifier d’incompétent, a implémenté un filtre à obscénités. Résultat : plus personne n’écrit fuck you, mais les logs des chats sont peuplés de FU, F uck you, F. you, fyou, etc.

Le plus marrant, c’est que ces versions courtes seront parfaitement comprises par Google, donc si vous vouliez éviter l’indexation, c’est mort.

Enfin il faut tenir la liste à jour, et les langages, ça évolue.

Il n’y a aucune bonne solution à ce problème. La modération humaine a un coût très élevé, et possède ses propres problématiques. Et le point Godwin n’est jamais loin.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.