Connexion élèves

Projet IA, avis positif ou négatif

L'intelligence artificielle peut être définie comme l'ensemble des théories et des techniques mises en œuvre en vue de réaliser des machines capables de simuler l'intelligence humaine.
Cette définition reste vague et incomplète (on ne définit pas l'intelligence humaine...) et encore controversée. Cependant nous allons tenter d'assigner à un ordinateur une tache complexe qu'il pourra accomplir après une phase d'apprentissage.

L'activité qui suit est inspirée d'une conférence de Florent Perronnin, directeur de Naver Labs Europe.
De nombreux sites proposent de donner un avis sur un restaurant, un achat, une livraison...
Notre objectif dans ce projet est de réaliser un programme capable d'analyser un commentaire simple et de déterminer si ce commentaire est positif ou négatif.
Cette tâche qui peut nous sembler simple est difficile à assigner à un programme informatique.
Nous tenterons donc de réaliser un tel programme, de le tester et de proposer des améliorations.
IAposneg

Une première solution...

Comme souvent lorsqu'on travaille sur une IA, nous allons nous appuyer l'apprentissage de l'IA sur une grosse quantité de données.
L'apparition puis l'essor d'internet à la fin des années 1990 a permis le renouveau de l'IA grâce à un accès simplifié à une grande quantité de données dans de nombreux domaines. L'augmentation des performances matérielles est également à la source de ce renouveau.

Structure des données

Nous disposerons pour l'apprentissage de cette IA, d'un fichier au format .csv (Comma-separated values ou valeur séparées par des virgules) comprenant un grand nombre de commentaire déjà analysés comme étant positifs ou négatifs.
Chaque commentaire sera suivi de -1 ou +1 selon si le commentaire est négatif ou positif.
Pouces
extrait du fichier de données

Apprentissage de l'IA : Construction du dictionnaire (v 1.0)

Nous allons donc apprendre à notre IA si un mot peut être classé comme positif ou comme négatif. Pour cela nous construirons un dictionnaire python qui ayant pour clef chaque mot présent dans une base de commentaires et pour valeur une note entière.
La première technique que l'on utilisera pour construire le dictionnaire des mots classés comme "positifs" ou "négatifs" est assez simple :

Pour tous les commentaires du fichiers de données
	Pour tous les mots des commentaires
		si le mot est présent dans le dictionnaire
			incrémenter sa valeur si le mot appartient à un commentaire positif
			décrémenter sa valeur si le mot appartient à un commentaire négatif
		si le mot n'est pas présent dans le dictionnaire
			initialiser sa valeur à 1 si le mot appartient à un commentaire positif
			initialiser sa valeur à -1 si le mot appartient à un commentaire négatif
			    	 
Cet algorithme est très simple, il faut cependant avoir accès aux commentaires présents dans un fichier .csv.
Pour cela nous allons utiliser la bibliothèque python csv

import csv	
		
Il est ensuite nécessaire de créer un objet fichier (nous verrons bientôt cette notion en détail) avec la commande :

with open(nomDeFichier,'r',encoding='utf-8') as fichier:
		
nomDeFichier est ici une chaîne de caractères qui correspond au nom complet du fichier csv présent dans le répertoire du fichier python.
Dans le fichier csv, les données sont séparées par des ;.
Il est donc nécessaire de lire l'objet fichier et de créer un objet lecteur avec la commande :

lecteur=csv.reader(fichier,delimiter=';')
		
Il suffit ensuite de parcourir l'objet lecteur et de construire un tableau python.

for row in lecteur:
	tab.append(row)
		
Pour finir il faut bien sur séparer les mots des commentaires, pour cela la ligne suivante est nécessaire :

for element in tab:
	element[0]=element[0].split()
		
Avant de coder l'apprentissage de l'IA, nous allons tester la partie lecture des données, et vérifier que le contenu du fichier csv est correctement transféré dans un tableau de tableau.
  1. Télécharger le fichier de test avisposnegtest.csv contenant un commentaire positif et un commentaire négatif.
  2. En utilisant le module csv et les instructions ci-dessus, afficher le tableau extrait du fichier csv. Il doit avoir la forme ci-dessous.

[[['Très', 'bonne', 'crêperie', 'nous', 'sommes', 'très', 'contents', 'de', 'ce', 'moment.', 'très', 'sympa.', 'Les', 'galettes', 'sont', 'bien', 'garnies', 'et', 'très', 'bonnes'], '1'], [['Très', 'mauvais', 'restaurant', ',', 'nous', 'sommes', 'déçus', '.', 'Pas', 'de', 'goût,', 'pas', 'de', 'textures'], '-1']]
		
Une fois ce travail effectué, nous allons pouvoir maintenant passer à la phase d'apprentissage de notre IA :
  1. Coder la fonction dont la doctring est présentée ci-dessous:
    
    def dicoPlusMoins(nomDeFichier:str)->dict
        '''
        A partir du nom de fichier csv contenant des avis positifs (1) ou négatifs (-1)
        La fonction construit le dictionnaire des mots en ajoutant à la valeur de chaque mot 1 si l'avis est positif et enlevant 1 si l'avis est négatif
        La fonction renvoie le dictionnaire ainsi construit
        '''
    		
    Le corps de la fonction sera divisé en deux parties :
    • Une première partie extraira les données du fichier csv à partir du nom de fichier et construira un tableau de tableau comme vu ci-dessus.
    • Une seconde partie construira le dictionnaire d'apprentissage de l'IA.
  2. Tester la fonction dicoPlusMoins avec le fichier de test précédent avisposnegtest.csv. Vous pourrez vérifier mot à mot si votre fonction remplit bien son rôle.

Utilisation de l'IA : Analyse d'un commentaire

Notre IA n'est pas encore fonctionnelle sur deux points :
  • Elle n'est pas capable d'analyser un commentaire.
  • Sa "connaissance" (son dictionnaire de mots) est très limitée.
Dans un premier temps nous allons coder et tester la fonction AnalyseAvis:
IAposneg
La docstring de la fonction AnalyseAvis est présentée ci-dessous :

def AnalyseAvis(avis,dico):
    '''
    avis est une chaine de caractères à analyser
    dico est un dictionnaire. les clefs sont des mots, les valeurs sont les notes attributés à chaque mot par la fonction dicoPlusMoins
    la fonction renvoie une note entière attribuée à la chaine de caractères avis
    exemple :
    AnalysedeTexte("très mauvais restaurant")
    >>> -38
    Cet exemple ne peux servir de test unitaire, le dictionnaire dépendant lui même des données utilisées.
    '''
		
L'algorithme de calcul de la note d'un avis est maintenant très simple :

initialiser la note à 0
Pour tous les mots de l'avis
	si le mot est présent dans le dictionnaire
		ajouter à la note la valeur du mot
			    	 
vous testerez ensuite votre fonction, à partir du fichier avisposnegtest.csv précédent en choisissant des avis cohérents avec votre banque de données, par exemple, ceux déjà présent dans le fichier csv.
Dans un second temps il faut maintenant passer à une phase d'apprentissage de meilleure qualité.
Vous pouvez tester les fonctions précédentes avec le fichier d'apprentissage avisposneg.csv.
Ce fichier contient environ 1000 avis positifs et négatifs.
Testez ce dictionnaire sur des avis "simple" et analysez le résultat.

Une autre solution...

Comme vous l'avez sûrement constaté, notre IA n'est pas parfaite...Nous reviendrons plus tard sur la liste des améliorations possibles, mais nous allons tout d'abord tenter un nouvel algorithme d'apprentissage.

Apprentissage de l'IA : Construction du dictionnaire (v 2.0)

Nous allons continuer sur le même principe en modifiant uniquement la règle d'apprentissage et de remplissage du dictionnaire.

Pour tous les commentaires du fichiers de données
	calculer le score du commentaire
		si le score est positif et que le commentaire est positif 
			alors ne rien faire
		si le score est négatif et que le commentaire est négatif 
			alors ne rien faire
		si le score est positif et que le commentaire est négatif
			alors décrémenter la valeur de tous les mots du commentaire
		si le score est négatif et que le commentaire est positif
			alors incrémenter la valeur de tous les mots du commentaire 
				
  • Cet apprentissage se base sur le principe "on ne casse pas ce qui fonctionne", si un commentaire est correctement évalué, il ne faut pas changer la valeur de ses mots
  • Attention c'est algorithme n'est pas à "traduire mot à mot" en python, il faut réfléchir un peu plus
  1. Construire la fonction def dicoPlusMoinsV2(nomDeFichier:str)->dicten suivant le principe et l'algorithme précédent
  2. Tester cette fonction avec différents commentaires

Analyse critique

Pour conclure, proposez au moins 3 améliorations qui nous permettraient de proposer une IA plus efficace.