Journal Sur le chemin de l'antispam bluesky

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes :
7
8
août
2025

Je croyais que mon bot bluesky était mort (voir ici pour les épisodes précédents).

C'était sans compter sur le fait que je suis sensible aux 3 pelés 2 tondus qui ont demandé sa survie, comme si il apportait quoique ce soit. Mais je suis vain (et en mal de reconnaissance) donc j'ai décidé de le laisser en vie, mais non sans me mettre au milieu pour faire l'antispam.

Pour rappeler le contexte, je voulais tuer le bot pour ne pas participer à l'amplification du spam, et jeter la serviette car je suis ignorant des techniques d'antispam.

Quand je regarde ma base de données, je compte 50% HAM pour 50% SPAM. C'est clairement la limite du rapport signal bruit qui est « trop pour moi »

Sur le chemin de l'antispam

Il m'est apparu que c'était indigne d'un dev libre de jeter l'éponge aussitôt, que je devais me ressaisir et regarder si il existait des librairies pour faire de l'antispam bayesien pour les nuls : et évidemment ça se trouve.

Avec même des exemples de la librairie nécessaire à tokeniser une langue : nltk.

Le plan

Là où j'en suis embaser et taguer

Dans un premier temps, j'ai fait un client websocket qui liste les posts avec 2 boutons : HAM et SPAM, si HAM il reposte et tague, si SPAM juste il marque. C'est la release 2.0.

Le bot est devenu un turc mécanique dont je suis l'antispam humain.

Là où je vais

le problème du multilinguisme

Normalement, l'apprentissage HAM/SPAM se fait sur du contenu textuel en langue naturel.

En acceptant (temporairement) les contenus en langues anglaises je me suis collé une écharde dans le pied que je compte retirer, mais à terme, pourquoi pas être multi lingue, sauf que les tags de langues de bluesky ne sont pas fiable, ça nécessite aussi une détection qui pour l'instant m'ennuie. Donc, je vais incessamment sous peu me limiter à une langue : le français ce qui avec nltk et les universitaires qui gardent leurs fichiers de tokenisation précieusement dans leur coin va me faire c*ier.

le problème des méta données

Si vous avez déjà regardez les en têtes spam assassin, vous vous apercevez qu'il n'apprend pas sur le contenu, mais les méta données genre pourcentage de balise HTML, ratio de point d'exclamation et tutti quanti. Ce qui diverge substantiellement des exemples canoniques où l'algo est :

  • construire un word counter en langage naturel
  • filer à l'algo de classification pour faire son boulot
  • réutiliser la classification pour déterminer ce qui est ham ou spam.

Je sais déjà, en mon for intérieur d'anti spam humain, qu'il va falloir reprendre des techniques de spam assassin. Et ne pas se limiter au langage naturel, mais rajouter des méta mots.

Genre, les émojis, surtout celui de l'aubergine suivi d'un jet d'eau sont un mauvais signe.

Je sais aussi qu'un post sans reposts ou source, mais avec des images pue le spam.

Je vais donc créer des méta mots comme HAS_IMAGE, HAS_REPOST, SHORT_MESSAGE, HASHTAG_MAQUEUE qui sortent du simple word counter et devoir leur donner un poids qui correspondra à une bonne approche pifométrique chezMoiÇaMarche ©. Je vais devoir injecter dans le compteur de mot (traitement qui transforme le texte en langage naturel en vecteur de token linguistique invariant avec leur présence relative) des métriques de méta données.

Classification : Bayesien ?

Alors, comme je suis le dev, j'ai décidé de ressortir de mes cours de statistique une autre approche : le test du Xhi2.

On va déterminer 2 vecteurs : un vecteur HAM et un vecteur SPAM basés sur une analyse Xhi2 de chaque mots détectés au mot clé. (Vous notez peut être que je suis en train de m'ouvrir à la détection de sujet en dehors de spam et ham.)

Détection

Il se trouve que j'ai déjà implémenté le cosinus similarité pour les dicts.

La détection consistera à faire un cosinus avec HAM et SPAM, et considérer que le vecteur avec la plus grande proximité est celui de la classification.

Conclusion

Ce bot est en train de me dépasser et me faire faire des choses que moi -fainéant- suis pas super fan de faire :)

Mais, un pas après l'autre, à ma vitesse, je suis lentement en train de m'amuser. Et je me dis que mon approche d'une simplicité sans nom a des chances de marcher et je me demande pourquoi tout le monde ne le fait pas ?

Serais je par hasard un naïf qui n'aurait pas vu un gros problème qu'il va se prendre dans les dents bientôt avec cet algorithme trop simple ? :)

Suite au prochain épisode.

  • # Détection de langue

    Posté par  (site web personnel, Mastodon) . Évalué à 8 (+5/-0).

    En acceptant (temporairement) les contenus en langues anglaises je me suis collé une écharde dans le pied que je compte retirer, mais à terme, pourquoi pas être multi lingue, sauf que les tags de langues de bluesky ne sont pas fiable, ça nécessite aussi une détection qui pour l'instant m'ennuie.

    Pour info, l'un des logiciels que je maintiens s'appelle uchardet et est historiquement l'une des références principales pour la détection d'encodage de caractères. Sauf que la logique utilisée en fait aussi un détecteur de langage de fait.

    C'est donc l'évolution future de cette bibliothèque (qui vient aussi avec un outil en ligne de commande), de détecter aussi la langue si besoin.

    Il n'y a pas encore version sortie avec ces nouvelles interfaces, mais c'est simple à compiler et la version de développement marche déjà pas si mal: https://gitlab.freedesktop.org/uchardet/uchardet/

    Tu pourrais tester avec l'outil CLI comme ça par exemple:

    uchardet -l -w 'fr:1,en:1,*:0'

    Puis tu copies un texte et tu finis par Entrée et Ctrl-D (apparemment 2 fois, je suis pas sûr pourquoi).

    Là tu demandes à uchardet de te détecter la langue, et tu mets le français et l'anglais avec un poids de 1 et le reste à 0. Parce que si je comprends bien, ton texte en entrée ne peut être que français ou anglais, n'est-ce pas?

    Limites:

    • C'est un outil statistique basé sur la fréquence et les suites de lettres. Il ne marche pas avec des dictionnaires, ne reconnaît pas la grammaire, etc. C'est aussi grâce à cela qu'il est si rapide (ça tourne partout) et prend très peu de place (pas de GiB de données). Mais ça veut aussi dire que si le texte à tester fait 1 ou 2 mots, ce ne sera pas efficace. Par contre s'il y a au moins une phrase, c'est normalement très efficace.
    • L'anglais est très vraisemblablement moins bien supporté que le français (parce qu'historiquement, il y avait surtout des raccourcis pour dire que c'est de l'anglais (genre "C'est de l'ASCII"), ce qui évidemment ne convient pas (surtout de nos jours avec l'Unicode partout, donc on va avoir des emoticones dans nos textes en anglais; et puis on veut aussi pouvoir détecter un texte comme étant "globalement en anglais" même s'il contient quelques mots étrangers) et je n'ai pas encore eu le temps de tout nettoyer. Donc parfois tu pourrais recevoir un "unknown" pour un texte anglais en entrée. Ce n'est pas forcément un bloqueur si tu sais que c'est soit anglais, soit français: tu peux considérer que tout ce qui ressort en "unknown" est de l'anglais.
    • Du fait de la façon dont certaines langues sont détectées, tu peux parfois avoir d'autres résultats que 'fr' ou 'en' même si tu as mis toutes les autres langues à zéro. Par exemple, si tu mets du chinois en entrée, tu obtiens encore 'zh' (par contre, si tu mets un texte évidemment espagnol, tu n'obtiens pas 'es', ce qui est exactement ce qu'on veut puisqu'on l'a mis à zéro).
    • Pour améliorer la qualité de détection (et la rapidité), je prévois aussi d'ajouter des poids pour les codages de caractères. Typiquement si tu sais que ton texte est de l'UTF-8 (tu veux juste détecter la langue, pas le codage), alors on aimerait pouvoir mettre un poids 0 à tout sauf UTF-8.
    • Comme je disais, c'est un outil de référence donc tu le trouveras dans les dépôts de (probablement) toutes les distributions. Par exemple c'est ce qu'utilise des logiciels comme mpv pour détecter le codage des sous-titres (quiconque a connu mplayer et mpv il y a de nombreuses années se souviendra des accents ou autres caractères non-ASCII cassés dans les sous-titres de film… c'est en fait cette raison pour laquelle j'ai commencé à contribuer sur uchardet, pour ensuite l'intégrer dans mpv!). Par contre tu n'y trouveras probablement que la version sans prise en charge de la détection de langues parce que je n'ai sorti aucune version avec cela pour l'instant. C'est pourquoi je te suggère de compiler, plus haut.

    Bon comme tu le vois, c'est en cours de changements, bien que je n'ai pas vraiment pu sérieusement y toucher depuis pas mal de mois. Malheureusement mes autres projets (ZeMarmot ainsi que les autres logiciels que je maintiens me, GIMP surtout!) me prennent presque tout mon temps.

    Néanmoins je pense que c'est déjà bien utilisable pour ton besoin (bon faut compiler…).

    Film d'animation libre en CC by-sa/Art Libre, fait avec GIMP et autre logiciels libres: ZeMarmot [ http://film.zemarmot.net ]

    • [^] # Re: Détection de langue

      Posté par  (site web personnel) . Évalué à 1 (+0/-0).

      C'est l'outil que j'avais en tête, j'ai du l'utiliser par le passé. Et c'est effectivement un truc qu'il va falloir que j'utilise. +1, merci pour le lien.

      Pour l'instant, j'essaie avant d'augmenter la complexité, de contrôler humainement les entrées et je tente de diminuer les degrés de libertés.

      Je gravis les échelons de la complexité en shootant un problème après l'autre, là mon problème immédiat c'est :

      1- de faire le word counter (compteur de mot) ;
      2- me souvenir de comment faire un test de dépendance en Xhi2 et la page wikipedia me paraît plus obscure que mes souvenirs.

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.