Analyser du Texte via Machine Learning (1/2)
Introduction
Je ne sais pas ce que vous en pensez, mais les possibilités offertes par les outils disponibles pour trouver, accéder et lire les articles de presse en ligne manquent encore trop de pertinence à mon goût.
Entre les articles qui ne m'intéressent pas forcément, ceux dont j'ai déjà lu le contenu ailleurs, les clickbaits et autres teasers bloqués par paywalls, mon voyage quotidien pour 'cultiver mon jardin' de l'information se résume parfois surtout à trier les mauvaises herbes de mes sources d'intérêt !
C'est de là que m'est venue une idée pour améliorer cette expérience.
Une idée renforcée par le constat que les algorithmes de préconisation d'articles semblent encore trop manquer à l'appel ou, au contraire, se révèlent être bien trop envahissants... Ce n'est pas parce que je me suis inquiété (une fois !) de la vie amoureuse de Beyoncé que j'ai désormais besoin de savoir ce qu'elle met dans son assiette matin, midi et soir ! ^^
Or, la mise en place d'une solution plus personnalisée, un peu à la Netflix, passera forcément par l'analyse d'articles de journaux pour en extraire les informations pertinentes qui permettraient de construire des préconisations.
J'ai donc décidé de me lancer, pour commencer, sur un sujet simple : la catégorisation d'articles automatique.
Pour ne pas faire trop long dans nos articles, nous effectuerons ce premier voyage en deux parties au sein desquelles nous étudierons plusieurs approches pratiques nous permettant de créer et d'entraîner des modèles de Machine Learning qui nous serviront ensuite pour automatiser des tâches d'analyse de texte.
Dans cette première partie, nous commencerons par poser les bases des connaissances dont nous aurons besoin pour créer notre algorithme final, en suivant les tutoriaux basiques de TensorFlow.
Machine Learning : Kezako ?
Dixit Wikipédia, le Machine Learning "est un champ d'étude de l'intelligence artificielle qui se fonde sur des approches mathématiques et statistiques pour donner aux ordinateurs la capacité d'« apprendre » à partir de données".
Le plus souvent, lorsqu'on parle de Machine Learning dans les journaux ou autre, on parle du modèle capable d'effectuer une tâche plus ou moins précise de manière automatique.
Ce modèle, afin d'en arriver là, a dû passer par une phase d'apprentissage qui lui a permis, à partir d'un algorithme d'entraînement et d'un gros volume d'exemples, d'apprendre à déterminer les caractéristiques lui permettant de répondre à la tâche demandée.
On distingue deux types principaux d'apprentissage : l'apprentissage supervisé et l'apprentissage non-supervisé.
L'apprentissage supervisé prend en entrées des exemples avec les résultats attendus afin de permettre au modèle de trouver pendant la phase d'apprentissage quels éléments des exemples permettent d'arriver au résultat attendu.
C'est probablement le type d'apprentissage qu'on retrouve le plus souvent, mais il demande un jeu de données avec un grand nombre d'exemples en entrée pour être efficace, ce qui peut-être difficile à constituer.
Vous voyez les CAPTCHA Google qui vous demandent d'identifier des voitures, bus, bornes incendies, etc... ? Grâce à vos réponses, Google se créér un énorme jeu de données qui lui permet d'alimenter ses modèles de reconnaissances d'images... Et oui, c'est bien moins cher que de payer une ferme d'analystes pour trier les images à la main !
L'apprentissage non-supervisé, quant à lui, permet d'identifier les structures que composent un jeu de données et est donc capable d'assigner ces structures après apprentissage à de nouveaux exemples. C'est pour cette raison qu'on parle également de modèle de "Clustering" quand on parle d'apprentissage non-supervisé.
La recherche Google est un bon exemple d'algorithme non supervisé. L'algorithme Google va regrouper les pages selon des ensembles de mots en fonction de leur contenu. Quand vous effectuez une recherche, Google va rechercher parmi ses regroupements ceux qui sont le plus proche de votre recherche.
Le Machine Learning peut-être appliqué à un grand nombre de domaines, de l'analyse d'image à l'intelligence artificielle (AlphaGO), mais dans cet article, nous nous concentrerons sur le domaine du traitement de langage naturel.
Traitement de langage naturel (NLP)
Le traitement de langage naturel est probablement le type de traitement le plus rencontré dans notre vie de tous les jours (OK Google).
Ce domaine est très vaste et incorpore tous les outils d'analyse, de traitement et de génération de texte. Les différentes taches que peuvent traiter les modèles NLP sont les suivantes :
Fréquences de mots
- Peut-être utilisé pour remonter les problèmes récurrents dans un outil de ticketing par exemple
Collocation ou cooccurrence
- Permet l'identification de mots qui reviennent ensemble (air et conditioning par exemple)
- Aide à l'identification de structures sémantiques et améliore la granularité en comptant les couples ou triplets de mots comme des mots uniques
Concordance
- Permet l'identification du contexte dans lequel est utilisé un mot
- Aide à désambiguïser le langage
Classification de texte
- De manière générale, permet l'assignation de tags ou de catégories a du texte.
- Est surtout utilisé dans :
. l'analyse de sentiment, pour déterminer si un texte a une connotation positive ou négative
. l'analyse de topic, pour assigner un texte aux sujets ou thèmes qu'il aborde.
. la détection d'intention, afin de déterminer l'intention derrière un texte. Savoir si un retour utilisateur est une plainte par exemple.
Extraction de Texte
- Pour extraire les mots clés d'un texte.
- Pour extraire les entités d'un texte, telles les sociétés, personnes, etc.
- Désambiguïsation de sens
- Permet de trouver quel sens d'un mot est utilisé dans le texte.
Clustering
- Permet le regroupement de textes selon leur contenu
- Comme mentionné précédemment, est un type d'apprentissage non supervisé.
- Moins précis que les algorithmes de classification mais plus rapides.
Dans le cadre de cet article, nous nous focaliserons sur les algorithmes de classification, l'objectif à terme étant de pouvoir classifier automatiquement des articles en fonction de leur contenu, dans des catégories telles "Monde", "Fait-Divers", "Sciences-Technologies", etc.
Les différentes étapes de création d'un modèle
La création d'un modèle de Machine Learning peut être décomposée grossièrement en 5 étapes :
1. Récupération du jeu de données
Récupérer un jeu de données propre et approprié à l'apprentissage que vous souhaitez faire est peut-être l'étape la plus importante dans la construction d'un modèle.
Vous pouvez trouver de nombreux jeux de données dédiés à l'apprentissage sur Internet, mais si vous souhaitez effectuer une tâche précise, vous pouvez également avoir à construire votre propre jeu de données.
Cette tâche, contrairement à ce qu'on pourrait croire, n'est pas forcément la plus évidente. Vous aurez besoin d'un gros volume de données si vous souhaitez faire un apprentissage efficace et vous aurez souvent à passer par une phase de nettoyage de ces données afin que votre apprentissage ne soit pas pollué par des données incohérentes ou inappropriées.
2. Préparation des données
Une fois votre jeu de données récupéré, vous aurez à le séparer en plusieurs parties qui vous serviront à former des jeux de données d'entrainement et de validation qui seront utilisés pendant la phase d'apprentissage, ainsi qu'un jeu de données de test utilisé pour évaluer la pertinence de votre modèle. Il est souvent conseillé de répartir 80% des données dédiées à l'entraînement, et 10% à la validation et aux tests respectivement.
Cela fait, vous aurez probablement à préparer vos données à l'apprentissage selon le type de modèle et de données que vous êtes en train d'entraîner, afin de les transformer en propriétés (nombres, matrices) auxquelles on pourra appliquer des fonctions mathématiques. On parle ici de featurisation.
Dans le cadre des modèles NLP, nous allons vectoriser nos données en transformant chaque mot en un nombre unique appelé token et en regroupant ces "tokens" sémantiquement dans des vecteurs qui pourront être utilisés lors de l'apprentissage.
3. Création du modèle
Les données prêtes, il ne vous reste plus qu'a définir la méthodologie d'apprentissage qu'utilisera votre modèle, c'est à dire les différentes étapes de calcul permettant le traitement de vos données vectorisées, ainsi que les fonctions mathématiques à utiliser pour déterminer a quel point l'apprentissage est efficace afin que votre modèle puisse au fur et à mesure reconsidérer ce qu'il sait.
4. Apprentissage du modèle
Le modèle créé, il ne reste plus qu'à lancer l'apprentissage. C'est une phase un peu longue qui peut-être très gourmande en ressources computationnelles.
5. Validation du modèle
L'apprentissage fini, il est fortement conseillé de passer par une phase de test de votre modèle, en utilisant les données de tests que vous avez du mettre de côté pour vérifier que votre modèle retourne bien ce qu'on attend de lui ainsi que pour voir ses temps de calcul.
Comment implémenter tout ça ?
Il existe un nombre conséquent d'outils permettant la création et l'apprentissage de modèles de Machine Learning, mais TensorFlow est un des outils les plus répandus et utilisés pour créer et entraîner des modèles de réseaux neuronaux.
Les librairies de TensorFlow sont disponibles dans plusieurs langages tels le C, Java, R, etc., mais le langage de prédilection de TensorFlow et dans lequel vous trouverez la grande majorité d'exemples sur le net est sans aucun doute Python.
Cette dominance du langage Python est probablement due, en partie, à la quantité de tutoriels et d'exemples diponibles autour de Google Colab qui permet l'exécution de code Python présent dans des carnets de notes Jupyter gratuitement dans le Cloud, en fonction des ressources disponibles.
Ces carnets de notes offrent un moyen pratique et présentable d'offrir du code d'exemple avec les explications qui vont avec.
Passons maintenant à la pratique en commençant par installer l'ensemble des librairies TensorFlow :
Sur Windows, vous aurez probablement besoin d'installer les versions "nightly" si vous voulez utiliser TensorFlow.
Analyse de sentiment simple avec TensorFlow
Une des mises en pratique les plus simples et les plus vues dans les tutoriels de traitement de langage naturel consiste en l'analyse de sentiments d'un texte.
Durant son apprentissage, le modèle va analyser un ensemble de textes pour lesquels ont été assignés un sentiment positif ou négatif et essayer de déterminer les caractéristiques qui font de chaque texte un texte a connotation positive ou négative.
Un des exemples d'apprentissage que l'on retrouve souvent est l'analyse de sentiments de tweets. Dans notre exemple, nous suivrons le tutoriel fourni par TensorFlow qui permet l'analyse de critiques de cinéma en anglais via l'entrainement d'un modèle sur le jeu de données IMDB de Stanford.
1. Récupération du jeu de données
Commençons donc par récupérer ce jeu de données via les fonctionnalités proposées par TensorFlow :
2. Préparation du jeu de données
Une fois le jeu de données récupéré, il nous faut l'importer.
Le jeu de données aclImdb est déjà séparé en plusieurs dossiers (train et test), et il nous manque donc un jeu de données de validation pour entraîner notre modèle. On va donc séparer notre jeu d'entrainement en 2 pour générer ce jeu de données de validation :
Nos jeux de données maintenant importés, il va falloir les préparer afin de les nettoyer et qu'ils puissent être interprétables par notre modèle.
Comme expliqué précédemment, nous allons en effet effectuer des opérations mathématiques sur nos jeux de données et comme ces derniers sont pour le moment constitués de texte, nous allons donc devoir les transformer en vecteurs numériques.
Concernant le nettoyage, nos exemples contiennent pour le moment tout un tas de caractères et ponctuations peu savoureux. Nous allons donc transformer nos exemples lors de cette vectorisation pour enlever tout ce qui pourrait perturber l'apprentissage :
3. Création du modèle
Notre jeu de données est maintenant prêt pour traitement et il ne nous reste plus qu'à créer notre modèle avant de pouvoir lancer l'apprentissage.
Dans cette étape, nous allons définir les différentes couches de calcul qui constituent notre modèle, ainsi que les fonctions mathématiques à utiliser pour calculer la pertinence des résultats afin que notre modèle puisse automatiquement apprendre de ses erreurs et succès.
Nos couches seront constituées principalement de :
- Une couche "d'embedding" qui permet d'optimiser les traitements en diminuant la taille des vecteurs en entrées avant de les traiter, en créant un dictionnaire matriciel plutôt que vectoriel
- Une couche calculant la valeur moyenne de notre couche "embedded" pour notre texte
- Une couche de Densification, qui permet d'effectuer la prédiction finale
Afin que notre modèle puisse apprendre par lui-même, il va falloir lui préciser comment calculer la précision et la perte de notre algorithme.
La précision est un pourcentage de réussite de prédiction de notre modèle. Plus la précision est grande, plus notre modèle a réussi à prédire les résultat attendus.
La perte, quant à elle, est une valeur permettant de résumer les erreurs d'un modèle.
Contrairement à la précision, on ne parle pas ici d'un pourcentage mais d'un poids arbitraire assigné a une erreur. Pour la précision, une erreur vaudra 0 et un succès 1. Pour la perte, c'est plus compliqué que ça puisqu'on essaie d'estimer a quel point l'algorithme s'est trompé.
La perte indique donc a quel point notre modèle est performant au fur et à mesure et c'est ce qu'on essaye principalement de diminuer quand on modifie le paramétrage d'un modèle.
Pour les fonctions permettant de calculer ces 2 informations, nous utiliserons les méthodes pré-définies de Tensorflow pour les algorithmes ayant un résultat binaire (0 ou 1) :
4. Apprentissage du modèle
Il ne nous reste plus qu'à lancer l'apprentissage de notre modèle :
Ce qui nous donne en sortie :
Comme on peut le voir en sortie, notre jeu d'entrainement a été séparé en 10 et nous nous sommes arrêtés après l'étape 9, n'observant plus d'amélioration dans l'apprentissage.
La précision et la perte finales, déterminées selon notre jeu de validation, sont respectivement de 90% et 0.2492
5. Validation de notre modèle
Il ne nous reste plus qu'à valider que notre modèle fonctionne correctement avec les données de test, ce qui se fait très facilement :
Ce qui nous donne en sortie une précision de 87% et une perte de 0.31.
Catégorisation avec TensorFlow
Maintenant que nous avons créé un modèle d'analyse de sentiments, essayons un sujet un peu plus complexe : la catégorisation.
En soi, l'analyse de sentiments est un problème de catégorisation, mais avec uniquement deux solutions possibles : positif ou négatif.
Dans cet exemple, nous allons donc modifier notre modèle d'analyse de sentiments, pour qu'il prenne en entrée un jeu de données de questions Stack Overflow triées selon 4 tags (csharp, python, java et javascript) et pour qu'il puisse apprendre de ces données pour ensuite catégoriser des questions selon le langage qu'elles concernent.
Commençons donc par modifier la récupération du jeu de données :
Notre jeu de données récupéré, il va nous falloir modifier notre modèle pour avoir en sortie non pas une probabilité de positivité, mais 4 probabilité d'appartenances aux différentes catégories.
Nous passons également nos fonctions de perte et de calcul des métriques de binaires a catégoriques :
A l'apprentissage, nous avons alors en sortie :
Et à la validation :
Comme vous pouvez le constater, la précision et la perte ne sont pas des plus folles et nous devrions probablement revoir les méthodes de préparation de notre jeu de données ou les poids utilisés... Mais ce n'est pas l'objet de cet exemple et nous n'arriverons certainement jamais a atteindre un taux de précision supérieur à 90%.
Le mot de la fin
Voilà pour la première partie de cet article ! Nous avons maintenant les bases de l'analyse de texte nous permettant de continuer notre périple.
Comme vous avez pu le voir, même avec des données utilisées dans des tutos, les résultats ne sont pas des plus précis...
Dans la seconde partie de notre article, nous allons donc explorer les solutions alternatives pour augmenter la précision de nos prédictions et nous entraînerons un modèle de catégorisation d'articles qui pourra être réellement utilisé.
------------------------------
Article rédigé par Manu, Tech Lead Full Stack & Manager du Lab ESENS | Retrouvez tous nos articles tech sur le Blog !
Vous êtes à la recherche d'un nouveau challenge technique ? Rejoignez l'équipe ESENS en postulant à nos offres d'emploi !