From f1a884961b115f140e708d2edd2f453d9046b7b5 Mon Sep 17 00:00:00 2001 From: Keshav Das Date: Thu, 23 Mar 2023 15:40:01 +0000 Subject: [PATCH] =?UTF-8?q?Version=20r=C3=A9duite=20d'analyse=20d'avis=20d?= =?UTF-8?q?emand=C3=A9e=20par=20Quentin=20pour=20le=20PAN3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ScoreOnlyReviewAnalysis.py | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 code/Traitement Langage Naturel/ScoreOnlyReviewAnalysis.py diff --git a/code/Traitement Langage Naturel/ScoreOnlyReviewAnalysis.py b/code/Traitement Langage Naturel/ScoreOnlyReviewAnalysis.py new file mode 100644 index 0000000..a10ed63 --- /dev/null +++ b/code/Traitement Langage Naturel/ScoreOnlyReviewAnalysis.py @@ -0,0 +1,101 @@ +#Emplacements des fichiers contenants le lexique et les avis +lexiconPath = r"C:\Users\kesha\Desktop\TelecomParis\PACT\fr_lexicon.txt" + +#Création d'une liste de listes ordonnée alphabétiquement pour ne pas +#avoir à chercher un mot d'un avis dans le lexique en entier à chaque fois. +#La dernière case correspond aux expressions n'étant pas des mots. +scoreWords = open(lexiconPath, "r") +scoreTable = [[] for i in range(27)] +line = scoreWords.readline() + +#Fonction d'ajout d'une paire mot-score par ordre alphabétique avec les +#expressions n'étant pas des mots à la dernière case. +#L'indice de la bonne case est trouvée avec le code ASCII en minuscule +#(a vaut 97 et z vaut 122) +def add(scoreword): + if (ord(scoreword[0][0]) < 97 or ord(scoreword[0][0]) > 122): + scoreTable[26].append(scoreword) + else: + scoreTable[ord(scoreword[0][0])-97].append(scoreword) + +#Ajout des paires mot-score dans scoreTable +while (line != ''): + line = line.strip().split("->") + add([line[0].lower(), float(line[1])]) + line = scoreWords.readline() +scoreWords.close() + +### Partie analyse d'avis ### + +#liste (partielle) de mots-clé pertinents pour un musée +keys=['attente', "d'attente", 'queue', 'patienter', 'patience', 'patient', + '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é', + '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', + 'toilettes', + 'restaurant', 'restaurants', 'restauration', 'manger', 'mangé', 'déjeuner', 'déjeuné'] + +#Fonction de recherche d'un mot d'un avis parmis le lexique +def search(word): + if (len(word) != 0): + if (ord(word[0]) < 97 or ord(word[0]) > 122): + mots = list(e[0] for e in scoreTable[26]) + if (word in mots): + return([word, scoreTable[26][mots.index(word)][1]]) + else: + return(-1) + mots = list(e[0] for e in scoreTable[ord(word[0])-97]) + if (word in mots): + 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 + +def ReviewAnalyzer(review): + reviewScore = 0 + + #miniKey donne les mots-clé contenus dans l'avis en train d'être analysé + miniKey = [] + + ### Recherche de mots positifs/négatifs ### + + #On découpe l'avis en une liste de phrases + sentences = Review.split('.') + for sent in sentences: + + #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): + + #On change la valeur du score associé au mot-clé + #si la phrase contient une négation + if (isNegative(sentence)): + temp[1] = -temp[1] + + #Mise à jour du score de l'avis + reviewScore += temp[1] + + #Sur demande de Quentin: on ne renvoie que le score de l'avis pour l'instant + return(reviewScore)