Prise en compte des négations, ajout de mots-clé et de commentaires

This commit is contained in:
Keshav Das
2023-03-21 22:36:00 +00:00
parent ab3918e032
commit d3218bbc02

View File

@@ -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()