From d3218bbc024257a7fb6fb30e84b416159bb1145c Mon Sep 17 00:00:00 2001 From: Keshav Das Date: Tue, 21 Mar 2023 22:36:00 +0000 Subject: [PATCH] =?UTF-8?q?Prise=20en=20compte=20des=20n=C3=A9gations,=20a?= =?UTF-8?q?jout=20de=20mots-cl=C3=A9=20et=20de=20commentaires?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ReviewAnalysis.py | 106 +++++++++++++----- 1 file changed, 81 insertions(+), 25 deletions(-) diff --git a/code/Traitement Langage Naturel/ReviewAnalysis.py b/code/Traitement Langage Naturel/ReviewAnalysis.py index 1357894..dcb7a4c 100644 --- a/code/Traitement Langage Naturel/ReviewAnalysis.py +++ b/code/Traitement Langage Naturel/ReviewAnalysis.py @@ -1,6 +1,7 @@ import nltk import os from dataclasses import dataclass +from vaderSentiment_fr.vaderSentiment import SentimentIntensityAnalyzer #Emplacements des fichiers contenants le lexique et les avis lexiconPath = r"C:\Users\kesha\Desktop\TelecomParis\PACT\fr_lexicon.txt" @@ -32,30 +33,36 @@ scoreWords.close() ### Partie analyse d'avis ### -file = open(reviewPath, "r") +file = open(reviewPath, "r", encoding='UTF-8') reviews = (file.read()).split('//') #liste (partielle) de mots-clé pertinents pour un musée keys=['attente', "d'attente", 'queue', 'patienter', 'patience', 'patient', - 'patients', 'patiente', 'patientes', + 'patients', 'patiente', 'patientes', 'file', 'files', 'impolitesse' ,'impolie', 'impolies', 'impoli', 'impolis', 'gentillesse', 'amabilité', 'aimable', 'aimables','gentil', 'gentils', 'gentille', 'gentilles', 'personnel', 'sales', 'sale', 'saleté', 'propre', 'propres', 'propreté', 'acceuil', 'prix', 'cher', 'chers', 'chère', 'chères', 'onéreux', 'onéreuse', 'onéreuses', 'abordable', - 'raisonnable', 'raisonnables', 'accessible', 'accessibilité', 'orienter','employé', - 'employés', 'employées', 'employée', - 'orientation', 'orienté', "s'orienter", + 'raisonnable', 'raisonnables', 'accessible', 'accessibilité', + 'handicapé', 'handicapée', 'handicapés', 'handicapées', 'orienter','employé', + 'employés', 'employées', 'employée', 'agent', 'agente', + 'orientation', 'orienté', "s'orienter", 'dédale', 'désorienter', 'désorienté', 'désorientée', 'désorientés', 'désorientées', 'panneau', 'panneaux', 'signalétique', 'labyrinthe', - 'perdu', 'perdus', 'perdue', 'perdues'] + 'perdu', 'perdus', 'perdue', 'perdues', + 'toilettes', + 'restaurant', 'restaurants', 'restauration', 'manger', 'mangé', 'déjeuner', 'déjeuné'] #Tableau de paires mots-clé, score associé keyWords = [] #Score moyen d'un avis averageScore = 0 +vaderScore = {'neg': 0, 'neu': 0, 'pos': 0, 'compound': 0} + +SIA = SentimentIntensityAnalyzer() #Fonction de recherche d'un mot d'un avis parmis le lexique def search(word): @@ -71,28 +78,71 @@ def search(word): return([word, scoreTable[ord(word[0])-97][mots.index(word)][1]]) return(-1) +#Fonction déterminant si une phrase contient une négation et renvoyant un booléen +def isNegative(sentence): + if (('ne' in sentence) or ("n'" in sentence) or ("pas" in sentence)): + return True + return False + +vaderCriteria = ['neg', 'neu', 'pos', 'compound'] + for Review in reviews: - #print(Review) reviewScore = 0 + + #miniKey donne les mots-clé contenus dans l'avis en train d'être analysé miniKey = [] - #recherche de mots positifs/négatifs - review = list(e.strip(',.') for e in Review.split()) - for Word in review: - word = Word.lower() - temp = search(word) - #recherche d'un éventuel mot-clé associé à ce caractère positif/négatif - if (temp != -1): - for key in keys: - if (key in review): - cles = list(e[0] for e in keyWords) - if (key in cles): - keyWords[cles.index(key)][1] += temp[1] - else: - keyWords.append([key, temp[1]]) - miniKey.append(key) - reviewScore += temp[1] + + ### Recherche de mots positifs/négatifs ### + + #On découpe l'avis en une liste de phrases + sentences = Review.split('.') + for sent in sentences: + + #Ces 3 lignes sont pour comparer avec le score de VADER + score = SIA.polarity_scores(sent) + for criteria in vaderCriteria: + vaderScore[criteria] += score[criteria] + + #On découpe la phrase en une liste de mots + sentence = list(e.strip(',.') for e in sent.split()) + for Word in sentence: + + #On met tout les mots en minuscule pour ne pas prendre en compte les majuscules + word = Word.lower() + temp = search(word) + + #recherche d'un éventuel mot-clé associé à ce caractère positif/négatif + if (temp != -1): + for key in keys: + if (key in sentence): + + + #On change la valeur du score associé au mot-clé + #si la phrase contient une négation + if (isNegative(sentence)): + temp[1] = -temp[1] + + #Récupération des mots-clés déjà détectés dans tous les avis + cles = list(e[0] for e in keyWords) + + #En fonction de si key a déjà été détecté auparavant, + #et donc qu'il est dans keyWords avec un score associé, + #on augmente le score ou sinon, on crée une paire mot-clé score + if (key in cles): + keyWords[cles.index(key)][1] += temp[1] + else: + keyWords.append([key, temp[1]]) + + #Rajout du mot-clé key dans la liste des mots-clé trouvés dans cet avis + miniKey.append(key) + + #Mise à jour du score de l'avis + reviewScore += temp[1] + + #Mise à jour du score moyen de tous les avis averageScore += reviewScore - #Caractéristique de l'avis analysé + + #Caractéristiques de l'avis analysé miniKey = set(miniKey) print("Mots-Clé: ", miniKey) print("Score: ", reviewScore) @@ -100,6 +150,12 @@ for Review in reviews: averageScore /= len(reviews) print("Format: [[Mot-clé, score associé]]") -print(keyWords) +for e in keyWords: + print(e) +print('') print("Nombre d'avis: ", len(reviews)) print("Score moyen d'un avis: ", averageScore) +for criteria in vaderCriteria: + vaderScore[criteria] /= len(reviews) +print("Score moyen de vader d'un avis: ", vaderScore) +file.close()