mirror of
https://git.roussel.pro/telecom-paris/pact.git
synced 2026-02-09 10:30:17 +01:00
intégration de l'analyse des avis dans l'interface admin
This commit is contained in:
18
code/analyseur_texte/Dockerfile
Normal file
18
code/analyseur_texte/Dockerfile
Normal file
@@ -0,0 +1,18 @@
|
||||
FROM python:3.8
|
||||
|
||||
#Ne pas créer les fichiers .pyc
|
||||
ENV PYTHONDONTWRITEBYTECODE=1
|
||||
#Afficher les logs directement dans le terminal
|
||||
ENV PYTHONUNBUFFERED=1
|
||||
|
||||
#Installation des dépendances de opencv
|
||||
RUN apt-get update
|
||||
|
||||
# Installation des dépendances python
|
||||
COPY requirements.txt .
|
||||
RUN python -m pip install -r requirements.txt
|
||||
# Création du répertoire de travail
|
||||
WORKDIR /app
|
||||
COPY . /app
|
||||
|
||||
CMD ["python", "main.py"]
|
||||
103
code/analyseur_texte/ScoreOnlyReviewAnalysis.py
Normal file
103
code/analyseur_texte/ScoreOnlyReviewAnalysis.py
Normal file
@@ -0,0 +1,103 @@
|
||||
#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)
|
||||
|
||||
9098
code/analyseur_texte/fr_lexicon.txt
Normal file
9098
code/analyseur_texte/fr_lexicon.txt
Normal file
File diff suppressed because it is too large
Load Diff
27
code/analyseur_texte/main.py
Normal file
27
code/analyseur_texte/main.py
Normal file
@@ -0,0 +1,27 @@
|
||||
from http.server import BaseHTTPRequestHandler, HTTPServer
|
||||
from ScoreOnlyReviewAnalysis import reviewAnalyzer
|
||||
import os
|
||||
|
||||
class Server(BaseHTTPRequestHandler):
|
||||
def do_POST(self):
|
||||
self.send_response(200)
|
||||
self.send_header('Content-type','application/json')
|
||||
self.end_headers()
|
||||
content_length = int(self.headers['Content-Length'])
|
||||
post_data = self.rfile.read(content_length)
|
||||
data = post_data.decode('utf-8')
|
||||
print(data, reviewAnalyzer(data))
|
||||
self.wfile.write(bytes(str(reviewAnalyzer(data)), 'utf-8'))
|
||||
|
||||
|
||||
def main():
|
||||
try:
|
||||
server = HTTPServer(('', int(os.getenv("PORT"))), Server)
|
||||
server.serve_forever()
|
||||
|
||||
except KeyboardInterrupt:
|
||||
print('^C received, shutting down the web server')
|
||||
server.socket.close()
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
0
code/analyseur_texte/requirements.txt
Normal file
0
code/analyseur_texte/requirements.txt
Normal file
Reference in New Issue
Block a user