import nltk
import os
from dataclasses import dataclass

#Emplacements des fichiers contenants le lexique et les avis
lexiconPath = r"C:\Users\kesha\Desktop\TelecomParis\PACT\fr_lexicon.txt"
reviewPath = r"C:\Users\kesha\Desktop\TelecomParis\PACT\LouvreAvis.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 ###

file = open(reviewPath, "r")
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',
      '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",
      'désorienter', 'désorienté', 'désorientée', 'désorientés', 'désorientées',
      'panneau', 'panneaux', 'signalétique', 'labyrinthe',
      'perdu', 'perdus', 'perdue', 'perdues']

#Tableau de paires mots-clé, score associé
keyWords = []

#Score moyen d'un avis
averageScore = 0

#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)

for Review in reviews:
    #print(Review)
    reviewScore = 0
    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]
    averageScore += reviewScore
    #Caractéristique de l'avis analysé
    miniKey = set(miniKey)
    print("Mots-Clé: ", miniKey)
    print("Score: ", reviewScore)
    print('')

averageScore /= len(reviews)
print("Format: [[Mot-clé, score associé]]")
print(keyWords)
print("Nombre d'avis: ", len(reviews))
print("Score moyen d'un avis: ", averageScore)
