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 Jehan (site web personnel, Mastodon) . Évalué à 8 (+5/-0).
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:
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:
mpv
pour détecter le codage des sous-titres (quiconque a connumplayer
etmpv
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 suruchardet
, pour ensuite l'intégrer dansmpv
!). 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 Jul (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.