Files
Telereview/code/Traitement Langage Naturel/ScoreOnlyReviewAnalysis.py
2023-03-27 11:41:52 +02:00

105 lines
4.3 KiB
Python

#Emplacements des fichiers contenants le lexique et les avis
# lexiconPath = r"C:\Users\kesha\Desktop\TelecomParis\PACT\fr_lexicon.txt"
lexiconPath = "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)
print(reviewAnalyzer("Je n'ai pas passé un mauvais moment."))