Classification de texte en python avec TextBlob

Classification de texte en python avec TextBlob
Actu IA
Classification de texte Python
En suivant ce tutoriel vous apprendrez : l’implémentation d’un classifieur bayésien naïf, la différence entre apprentissage supervisé et apprentissage non supervisé, la création d’un jeu d’entraînement et d’un jeu de test.

La classification automatique de texte ou classification de texte est une discipline très populaire du domaine du TAL (Traitement Automatisé du Langage) . Ce type de processus automatisé peut s’avérer extrêmement utile dans de nombreux secteurs d’activité tant la multiplication des informations rend difficile une classification manuelle des données.

Or, il est très simple de mettre en place un classifieur de texte grâce aux outils performants disponibles sous forme de librairies et modules, notamment pour Python. Pour ce tutoriel, nous utiliserons TextBlob que nous avons déjà utilisé au cours d’un précédent tutoriel.

Pour suivre ce tutoriel, vous aurez donc besoin de l’interpréteur Python, du module TextBlob installable via le gestionnaire de paquets pythons pip, en utilisant la commande :

pip install textblob

et argparse qui permettra de traiter les arguments passés en ligne de commande, installable avec la commande

pip install argparse

Mais avant d’entrer dans le vif du sujet, un petit point théorique : La classification de texte peut être divisée en deux types distincts : La classification supervisée et non supervisée. Dans le cas de la classification supervisée, un jeu de données d’entraînement est étiqueté avant d’être fourni au classifieur. Le classifieur apprend à faire le lien entre les textes et leurs étiquettes afin de pouvoir par la suite étiqueter à son tour des textes.

La classification non-supervisée consiste quant à elle à fournir au modèle un ensemble de textes non étiquetés, qu’il tentera d’organiser sous forme de sous-ensembles non étiquetés. On parle alors de clustering.

Ce tutoriel se focalisera sur l’apprentissage supervisé, la première chose à faire est donc de créer un jeu de données destiné à l’entraînement. Ce jeu de données peut se présenter sous le format JSON, le format CSV ou le format TSV ( Le délimitateur est alors une tabulation).

Nous opterons pour le format CSV. La première colonne contenant les textes d’exemple et la deuxième colonne contenant leur étiquette. Voici un très court jeu de données d’entraînement destiné à entraîner un classifieur à distinguer les textes de nature professionnelle des textes de nature personnelle :

Fichier exemples-entrainement.csv :


"pensez à m'envoyer votre facture","pro"
"Sujet: demande de devis","pro"
"il faut appeler le comptable","pro"
"Avez-vous un créneau de libre pour un point téléphonique ?","pro"
"pensez à me fournir votre comptabilité","pro"
"Maîtriser les fondamentaux du Web Marketing et de la Communication Digitale,","pro"
"Nous vous remercions d'avoir choisi nos services pour le renouvellement de votre Nom de Domaine.","pro"
"Administration et grand-compte: Si vous souhaitez recevoir une offre de prix équivalente, cliquez-ici","pro"
"Donnez aux entreprises les moyens d’innover, de se transformer, de grandir et de créer des emplois","pro"
"Voici des personnes que vous connaissez peut-être. Entrez en contact et développez de nouvelles relations.","pro"
"nous recrutons un chef de projet","pro"
"La société XXX a le plaisir de vous annoncer la sortie prochaine de son application","pro"
"Je vous propose un RDV lundi prochain à 17H.","pro"
"N'oubliez pas de réserver la salle B10 pour la réunion avec la direction.","pro"
"Cédez vos factures en ligne grâce à notre solution","pro"
"Je me permets de vous contacter dans le cadre de la rédaction de notre article","pro"
"Pour connaître les modalités de transmission des paiements mensuels, consultez la fiche.","pro"
"Découvrez notre offre en logiciel de gestion (comptabilité - paie - gestion commerciale) et solutions métiers pour les PME, TPE, artisans et professionnels.","pro"
"Vous recevrez notre proposition commerciale dans les plus brefs délais","pro"
"L'activation vous permet de déclarer votre licence","pro"
"Il est grand temps de renouveler notre parc informatique","pro"
"Si vous êtes un employeur occupant 9 salariés au plus et si vous n'avez pas opté pour le maintien du paiement trimestriel, votre paiement sera à effectuer en même temps que votre déclaration","pro"
"Je te fais de gros bisous","perso"
"Je t'embrasse","perso"
"coucou, ça va ?","perso"
"Bonjour les amis","perso"
"On va au ciné ?","perso"
"J'adore l'informatique","perso"
"Ca vous dit de sortir boire un verre ?","perso"
"Comment va la famille ?","perso"
"J'aime beaucoup parler avec toi","perso"
"Mes passions sont la musique, le cinéma et la photo","perso"

Passons désormais au code Python en lui même :

fichier classifieur_pro_perso.py


#import de Textblob
from textblob import TextBlob
#import du classifieur Bayésien naïf
from textblob.classifiers import NaiveBayesClassifier

#import d'argparse afin de prendre en compte une phrase en argument
import argparse
parser = argparse.ArgumentParser(prog="class-pro-perso", description="Classifieur")
parser.add_argument("--phrase", type=str, help="Phrase à traiter", required=True)
args = parser.parse_args()
phrase_a_tester=args.phrase

#affichage de la phrase à classifier, passée en paramètre
print("Classification de la phrase : "+phrase_a_tester)

#ouverture du fichier d'entrainement
with open('exemples-entrainement.csv', 'r') as fp:
   #entraînement du classifieur
   cl = NaiveBayesClassifier(fp, format="csv")
   #nous soumettons la phrase au classifieur
   blob = TextBlob(phrase_a_tester, classifier=cl)
   prob_dist = cl.prob_classify(phrase_a_tester)
   #cette ligne nous affiche le label ayant la plus grande probabilité
   print("Cette phrase semble être de nature : "+prob_dist.max())

   #nous affichons ici la probabilité d'un label spécifique : pro
   print("Probabilité pro : "+str(round(prob_dist.prob("pro"), 2)))
   #nous affichons ici la probabilité d'un label spécifique : perso
   print("Probabilité perso : "+str(round(prob_dist.prob("perso"), 2)))

Il suffit ensuite de lancer notre script, en fournissant en paramètre une phrase à classifier.

Exemple :   

python classifieur_pro_perso.py --phrase="Quel est le nom de votre comptable ?"

Comme vous pouvez le constater, la mise en oeuvre d’un classifieur est d’une grande simplicité. En revanche, vous vous rendrez rapidement compte des faibles performances de notre classifieur actuel. La raison est bien simple, le jeu de données d’entraînement est de piètre qualité, et surtout, beaucoup trop petit. De plus nous avons omis une étape fondamentale : la mise en place d’un jeu de test destiné à mesurer la bonne qualité de l’apprentissage.

Nous vous invitons donc désormais à mettre en oeuvre votre propre classifieur , destiné à classifier des textes selon les catégories de votre choix, en créant vos jeux de données d’entraînement et de test. Vous pouvez créer ces deux jeux de données en réservant de façon aléatoire 90% de vos données à l’entraînement et 10% aux tests par exemple. Le jeu de test a le même format que le jeu d’entraînement, et s’utilise de la façon suivante, après l’entraînement du classifieur :

with open('exemples-test.csv', 'r') as fptest:
   print("Taux de réussite: "+cl.accuracy(fptest,"csv"))

Le classifieur tentera alors de classifier chacun des tests et comparera le résultat avec l’étiquette fournie. Le nombre affiché sera alors le taux global de réussite du classifieur.

Nous avons décidé pour ce tutoriel de mettre en oeuvre un classifieur analysant des phrases passées en paramètre, mais libre à vous de modifier celui-ci afin qu’il soit en mesure de traiter des fichiers textes par exemple, en vous inspirant de la ligne de code source destinée à ouvrir le fichier de jeu d’entraînement.

N’hésitez pas à nous faire part de vos résultats via Twitter !