Merge branch 'quentin' of gitlab.enst.fr:pact/2022-2023/pact71 into quentin

This commit is contained in:
Quentin Roussel
2023-03-27 10:39:15 +02:00
6 changed files with 1012 additions and 42 deletions

View File

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

View File

@@ -0,0 +1,412 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [],
"source": [
"#pip install unidecode\n",
"#pip install dataclass\n",
"#pip install nltk\n",
"#import os\n",
"#from unidecode import unidecode\n",
"#import nltk\n",
"#from dataclasses import dataclass"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Première partie : presentation du problème et du materiel\n",
"\n",
"Nous cherchons a attribuer à une liste d'avis laissés un score global de satisfaction, ainsi qu'un score de satisfaction concernant chaque point pour lequel il sera particulierement interessant de se pencher (par exemple le delais d'attente dans un parc d'attraction ou la propreté dans un hotel).\n",
"\n",
"Nous allons pour cela utiliser une base de mots français associés chacun a un score de positivité, ainsi qu'une liste d'avis concernant le musée du Louvre.\n"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [],
"source": [
"#Emplacmement du fichier contenant des mots francais associés a une score sous la forme\n",
"#mot1->son score\n",
"#mot2->son score\n",
"#mot3->son score ...\n",
"\n",
"lexiconPath = r\"fr_lexicon.txt\" \n",
"nomsCommunsPath= r\"mots-communs.txt\"\n",
"\n",
"\n",
"#Emplacmement du fichier contenant des des avis sur le musée du Louvre sous la forme\n",
"#Avis1\n",
"#//Avis2\n",
"#//Avis3 ...\n",
"\n",
"reviewPath = r\"LouvreAvis.txt\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Nous créons 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."
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"scoreWords = open(lexiconPath, \"r\")\n",
"scoreTable = [[] for i in range(27)]\n",
"line = scoreWords.readline()\n",
"\n",
"#Fonction d'ajout d'une paire mot-score par ordre alphabétique avec les\n",
"#expressions n'étant pas des mots à la dernière case.\n",
"#L'indice de la bonne case est trouvée avec le code ASCII en minuscule\n",
"#(a vaut 97 et z vaut 122)\n",
"\n",
"def add(scoreword):\n",
" if (ord(scoreword[0][0]) < 97 or ord(scoreword[0][0]) > 122):\n",
" scoreTable[26].append(scoreword)\n",
" else:\n",
" scoreTable[ord(scoreword[0][0])-97].append(scoreword)\n",
" \n",
"#Ajout des paires mot-score dans scoreTable\n",
"while (line != ''):\n",
" line = line.strip().split(\"->\")\n",
" add([line[0].lower(), float(line[1])])\n",
" line = scoreWords.readline()\n",
"scoreWords.close()\n",
"\n",
"print(line)"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['abandon', -2.4]\n",
"['abandonnant', -1.6]\n",
"['abandonne', -1.3]\n",
"['badass', 1.4]\n",
"['badin', 1.2]\n",
"['badine', 1.2]\n",
"['cachant', -1.2]\n",
"['cache', -0.7]\n",
"['cachent', -0.7]\n"
]
}
],
"source": [
"for i in range (3):\n",
" print(scoreTable[i][0])\n",
" print(scoreTable[i][1])\n",
" print(scoreTable[i][2])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Deuxieme partue : analyse d'avis"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\yanni\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:87: FutureWarning: Function get_feature_names is deprecated; get_feature_names is deprecated in 1.0 and will be removed in 1.2. Please use get_feature_names_out instead.\n",
" warnings.warn(msg, category=FutureWarning)\n"
]
}
],
"source": [
"file = open(reviewPath, \"r\", encoding='UTF-8')\n",
"reviews = (file.read()).split('//')\n",
" \n",
"import pandas as pd\n",
"from sklearn.feature_extraction.text import *\n",
"dataset = reviews\n",
"\n",
"mots_communs=[\"\"]\n",
" \n",
"tfIdfVectorizer=TfidfVectorizer(use_idf=True)\n",
"tfIdf = tfIdfVectorizer.fit_transform(dataset)\n",
"df = pd.DataFrame(tfIdf[0].T.todense(), index=tfIdfVectorizer.get_feature_names(), columns=[\"TF-IDF\"])\n",
"df = df.sort_values('TF-IDF', ascending=False)\n",
"liste = df.head(50)\n",
"listeMotsTFIDF=list(liste.index)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
" \n",
" mots dans mots communs \n",
" \n",
" ['homme', 'le', 'de', 'est', 'pas', 'peu', 'un', 'une', 'la', 'des', 'mari', 'femme', 'jour', 'mer', 'temps', 'main', 'chose', 'vie', 'yeux', 'heure', 'enfant', 'fois', 'moment', 'tête', 'père', 'fille', 'coeur', 'an', 'terre', 'dieu', 'monsieur', 'voix', 'maison', 'coup', 'air', 'mot', 'ami', 'porte', 'amour', 'pied', 'pays', 'ciel', 'frère', 'regard', 'âme', 'côté', 'ville', 'rue', 'soir', 'chambre', 'pas', 'soleil', 'roi', 'état', 'corps', 'bras', 'parti', 'année', 'visage', 'lettre', 'franc', 'fond', 'force', 'effet', 'saint', 'idée', 'mois', 'fils', 'raison', 'point', 'personne', 'peuple', 'fait', 'parole', 'guerre', 'pensée', 'affaire', 'matin', 'pierre', 'doute', 'front', 'ombre', 'part', 'maître', 'besoin', 'question', 'peine', 'madame', 'sorte', 'figure', 'droit', 'bout', 'bois', 'mari', 'feu', 'partie', 'face', 'mouvement', 'arbre', 'cas', 'mur', 'ordre', 'est', 'travers', 'instant', 'façon', 'oeil', 'forme', 'cheveu', 'suite', 'être', 'nature', 'or', 'pouvoir', 'bouche', 'sens', 'cri', 'espèce', 'cheval', 'loi', 'ministre', 'société', 'politique', 'oreille', 'fortune', 'compte', 'manier', 'action', 'garçon', 'exemple', 'premier', 'projet', 'étude', 'journal', 'geste', 'situation', 'oiseau', 'siècle', 'million', 'groupe', 'centre', 'chien', 'peau', 'reste', 'nombre', 'mesure', 'article', 'vue', 'âge', 'système', 'rêve', 'rapport', 'soldat', 'lèvre', 'signe', 'vérité', 'dos', 'dame', 'doigt', 'objet', 'fer', 'lendemain', 'train', 'papa', 'secret', 'haut', 'vieillard', 'docteur', 'ton', 'jambe', 'minute', 'nuage', 'présence', 'épaule', 'feuille', 'résultat', 'hôtel', 'semaine', 'forêt', 'qualité', 'prince', 'bien', 'médecin', 'volonté', 'seigneur', 'ligne', 'condition', 'classe', 'voyage', 'présent', 'CommonWords1.txt', 'tout', 'même', 'autre', 'seul', 'jeune', 'premier', 'quel', 'dernier', 'blanc', 'vrai', 'toute', 'rouge', 'humain', 'général', 'français', 'politique', 'bleu', 'social', 'certain', 'différent', 'ne', 'pas', 'si', 'là', 'même', 'tout', 'encore', 'aussi', 'alors', 'non', 'très', 'ainsi', 'ici', 'oui', 'déjà', 'tant', 'enfin', 'maintenant', 'point', 'presque', 'ailleurs', \"aujourd'hui\", 'autour', 'dessus', 'comme', 'comment', 'autant', \"d'abord\", 'surtout', 'cependant', 'pourtant', 'ci', 'vraiment', 'bientôt', 'partout', 'debout', 'plutôt', 'combien', 'hier', 'parfois', 'et', 'que', 'comme', 'mais', 'ou', 'quand', 'si', 'puis', 'donc', 'car', 'ni', 'parce que', 'pourquoi', 'lorsque', 'tandis que', 'puisque', 'comment', 'soit', 'or', 'le', 'un', 'son', 'ce', 'du', 'au', 'de', 'mon', 'leur', 'notre', 'votre', 'quelque', 'ton', 'tout', 'chaque', 'aucun', 'tel', 'certain', 'plusieurs', \"d'autres\", 'deux', 'cent', 'mille', 'trois', 'quatre', 'vingt', 'cinq', 'dix', 'neuf', 'six', 'huit', 'sept', 'trente', 'quarante', 'cinquante', 'quinze', 'douze', 'un', 'à', 'en', 'dans', 'pour', 'par', 'sur', 'avec', 'sans', 'sous', 'après', 'entre', 'vers', 'chez', 'jusque', 'contre', 'devant', 'depuis', 'pendant', 'avant', 'voilà', 'près', 'dès', 'malgré', 'voici', 'selon', 'derrière', 'parmi', 'afin de', 'auprès', 'quant à', 'hors', 'durant', 'grâce', 'il', 'je', 'se', 'qui', 'elle', 'ce', 'le', 'que', 'vous', 'me', 'on', 'lui', 'nous', 'y', 'en', 'où', 'tu', 'moi', 'te', 'celui', 'dont', 'tout', 'ça', 'cela', 'autre', 'un', 'toi', 'lequel', 'leur', 'quoi', \"l'un\", 'chacun', 'auquel', \"quelqu'un\", \"d'autres\", 'ceci', \"l'une\", 'soi', 'sien', 'mien', 'aucu']\n",
"\n",
" \n",
" mots dans khey de base \n",
" \n",
" ['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']\n",
"\n",
" \n",
" mots dans listeMotsTFIDF sans les mots communs \n",
" \n",
" ['regardé', 'venu', 'trouve', 'travaillant', 'carte', 'securitas', 'richelieu', 'responsable', '10h30', 'public', 'escalator', 'grossièrement', 'handicapé', 'paris', 'inadmissible', 'jo', 'niveau', 'lamentable', 'montant', 'rendu', 'accueillis', 'épouse', 'accueil', 'agente', 'accéder', 'arrivée', 'sécurité', 'heureusement', 'avait', 'été', 'avons', 'faire']\n",
"\n",
" \n",
" mots dans keys \n",
" \n",
" ['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', 'regardé', 'venu', 'trouve', 'travaillant', 'carte', 'securitas', 'richelieu', 'responsable', '10h30', 'public', 'escalator', 'grossièrement', 'handicapé', 'paris', 'inadmissible', 'jo', 'niveau', 'lamentable', 'montant', 'rendu', 'accueillis', 'épouse', 'accueil', 'agente', 'accéder', 'arrivée', 'sécurité', 'heureusement', 'avait', 'été', 'avons', 'faire']\n"
]
}
],
"source": [
"#print(listeMotsTFIDF)\n",
"\n",
"print(\"\\n \\n mots dans mots communs \\n \\n\", motsCommuns) \n",
"\n",
"\n",
"#liste (partielle) de mots-clé pertinents pour un musée\n",
"keys=['attente', \"d'attente\", 'queue', 'patienter', 'patience', 'patient',\n",
" 'patients', 'patiente', 'patientes',\n",
" 'impolitesse' ,'impolie', 'impolies', 'impoli', 'impolis',\n",
" 'gentillesse', 'amabilité', 'aimable', 'aimables','gentil', 'gentils',\n",
" 'gentille', 'gentilles', 'personnel',\n",
" 'sales', 'sale', 'saleté', 'propre', 'propres', 'propreté',\n",
" 'acceuil', 'prix', 'cher', 'chers', 'chère', 'chères',\n",
" 'onéreux', 'onéreuse', 'onéreuses', 'abordable',\n",
" 'raisonnable', 'raisonnables', 'accessible', 'accessibilité', 'orienter','employé',\n",
" 'employés', 'employées', 'employée',\n",
" 'orientation', 'orienté', \"s'orienter\",\n",
" 'désorienter', 'désorienté', 'désorientée', 'désorientés', 'désorientées',\n",
" 'panneau', 'panneaux', 'signalétique', 'labyrinthe',\n",
" 'perdu', 'perdus', 'perdue', 'perdues']\n",
"\n",
"print(\"\\n \\n mots dans khey de base \\n \\n\", keys) \n",
"\n",
"\n",
"file = open(nomsCommunsPath, \"r\")\n",
"motsCommuns = file.readlines()\n",
"file.close()\n",
"\n",
"for i in range (len(motsCommuns)) :\n",
" motsCommuns[i] = motsCommuns[i][:-1]\n",
" \n",
"for mot in listeMotsTFIDF :\n",
" if mot in motsCommuns :\n",
" listeMotsTFIDF=[i for i in listeMotsTFIDF if i!=mot]\n",
"\n",
"for mot in listeMotsTFIDF :\n",
" if not mot in keys :\n",
" keys.append(mot)\n",
"print(\"\\n \\n mots dans listeMotsTFIDF sans les mots communs \\n \\n\", listeMotsTFIDF) \n",
"print(\"\\n \\n mots dans keys \\n \\n\", keys)"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [],
"source": [
"#Tableau de paires mots-clé, score associé\n",
"keyWords = []\n",
"\n",
"#Score moyen d'un avis\n",
"averageScore = 0\n",
"\n",
"#Fonction de recherche d'un mot d'un avis parmis le lexique\n",
"def search(word):\n",
" if (len(word) != 0):\n",
" if (ord(word[0]) < 97 or ord(word[0]) > 122):\n",
" mots = list(e[0] for e in scoreTable[26])\n",
" if (word in mots):\n",
" return([word, scoreTable[26][mots.index(word)][1]])\n",
" else:\n",
" return(-1)\n",
" mots = list(e[0] for e in scoreTable[ord(word[0])-97])\n",
" if (word in mots):\n",
" return([word, scoreTable[ord(word[0])-97][mots.index(word)][1]])\n",
" return(-1)"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"for Review in reviews:\n",
" #print(Review)\n",
" reviewScore = 0\n",
" miniKey = []\n",
" #recherche de mots positifs/négatifs\n",
" review = list(e.strip(',.') for e in Review.split())\n",
" for Word in review:\n",
" word = Word.lower()\n",
" temp = search(word)\n",
" #recherche d'un éventuel mot-clé associé à ce caractère positif/négatif\n",
" if (temp != -1):\n",
" for key in keys:\n",
" if (key in review):\n",
" cles = list(e[0] for e in keyWords)\n",
" if (key in cles):\n",
" keyWords[cles.index(key)][1] += temp[1]\n",
" else:\n",
" keyWords.append([key, temp[1]])\n",
" miniKey.append(key)\n",
" reviewScore += temp[1]\n",
" averageScore += reviewScore\n",
" #Caractéristique de l'avis analysé\n",
" miniKey = set(miniKey)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Troisiere partie : affichage des resultats"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Format: [[Mot-clé, score associé]]\n",
"[['regardé', -0.7999999999999998], ['venu', -0.7999999999999998], ['trouve', -0.7999999999999998], ['carte', -0.7999999999999998], ['responsable', -0.7999999999999998], ['10h30', -0.7999999999999998], ['public', -0.7999999999999998], ['escalator', -0.7999999999999998], ['grossièrement', -0.7999999999999998], ['handicapé', -0.7999999999999998], ['inadmissible', -0.7999999999999998], ['niveau', -0.7999999999999998], ['lamentable', -0.7999999999999998], ['montant', -0.7999999999999998], ['rendu', -0.7999999999999998], ['accueillis', -0.7999999999999998], ['épouse', -0.7999999999999998], ['agente', -0.7999999999999998], ['accéder', -0.8999999999999999], ['sécurité', 2.4], ['heureusement', -0.7999999999999998], ['avait', 6.6], ['été', -0.8999999999999999], ['avons', 4.800000000000001], ['faire', 5.300000000000001], ['cher', -0.5000000000000002], ['orientation', -0.5000000000000002], ['abordable', 2.4000000000000004], ['personnel', 2.1999999999999997], [\"s'orienter\", 4.5], ['chères', -2.4], ['queue', -0.09999999999999876], ['orienter', -0.30000000000000004], ['prix', 7.4], ['raisonnable', 7.4], [\"d'attente\", 0.9000000000000012]]\n",
"Nombre d'avis: 23\n",
"Score moyen d'un avis: 1.6478260869565218\n"
]
}
],
"source": [
"averageScore /= len(reviews)\n",
"print(\"Format: [[Mot-clé, score associé]]\")\n",
"print(keyWords)\n",
"print(\"Nombre d'avis: \", len(reviews))\n",
"print(\"Score moyen d'un avis: \", averageScore)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.13"
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,382 @@
homme
le
de
est
pas
peu
un
une
la
des
mari
femme
jour
mer
temps
main
chose
vie
yeux
heure
enfant
fois
moment
tête
père
fille
coeur
an
terre
dieu
monsieur
voix
maison
coup
air
mot
ami
porte
amour
pied
pays
ciel
frère
regard
âme
côté
ville
rue
soir
chambre
pas
soleil
roi
état
corps
bras
parti
année
visage
lettre
franc
fond
force
effet
saint
idée
mois
fils
raison
point
personne
peuple
fait
parole
guerre
pensée
affaire
matin
pierre
doute
front
ombre
part
maître
besoin
question
peine
madame
sorte
figure
droit
bout
bois
mari
feu
partie
face
mouvement
arbre
cas
mur
ordre
est
travers
instant
façon
oeil
forme
cheveu
suite
être
nature
or
pouvoir
bouche
sens
cri
espèce
cheval
loi
ministre
société
politique
oreille
fortune
compte
manier
action
garçon
exemple
premier
projet
étude
journal
geste
situation
oiseau
siècle
million
groupe
centre
chien
peau
reste
nombre
mesure
article
vue
âge
système
rêve
rapport
soldat
lèvre
signe
vérité
dos
dame
doigt
objet
fer
lendemain
train
papa
secret
haut
vieillard
docteur
ton
jambe
minute
nuage
présence
épaule
feuille
résultat
hôtel
semaine
forêt
qualité
prince
bien
médecin
volonté
seigneur
ligne
condition
classe
voyage
présent
CommonWords1.txt
tout
même
autre
seul
jeune
premier
quel
dernier
blanc
vrai
toute
rouge
humain
général
français
politique
bleu
social
certain
différent
ne
pas
si
même
tout
encore
aussi
alors
non
très
ainsi
ici
oui
déjà
tant
enfin
maintenant
point
presque
ailleurs
aujourd'hui
autour
dessus
comme
comment
autant
d'abord
surtout
cependant
pourtant
ci
vraiment
bientôt
partout
debout
plutôt
combien
hier
parfois
et
que
comme
mais
ou
quand
si
puis
donc
car
ni
parce que
pourquoi
lorsque
tandis que
puisque
comment
soit
or
le
un
son
ce
du
au
de
mon
leur
notre
votre
quelque
ton
tout
chaque
aucun
tel
certain
plusieurs
d'autres
deux
cent
mille
trois
quatre
vingt
cinq
dix
neuf
six
huit
sept
trente
quarante
cinquante
quinze
douze
un
à
en
dans
pour
par
sur
avec
sans
sous
après
entre
vers
chez
jusque
contre
devant
depuis
pendant
avant
voilà
près
dès
malgré
voici
selon
derrière
parmi
afin de
auprès
quant à
hors
durant
grâce
il
je
se
qui
elle
ce
le
que
vous
me
on
lui
nous
y
en
tu
moi
te
celui
dont
tout
ça
cela
autre
un
toi
lequel
leur
quoi
l'un
chacun
auquel
quelqu'un
d'autres
ceci
l'une
soi
sien
mien
aucun

View File

@@ -18,7 +18,7 @@ class HandDetector():
min_detection_confidence=0.5, min_detection_confidence=0.5,
min_tracking_confidence=0.5) min_tracking_confidence=0.5)
#Paramètres #Paramètres
self.BUFFER_LENGTH = 30 self.BUFFER_LENGTH = 60
self.DETECTION_THRESHOLD = 3/4 self.DETECTION_THRESHOLD = 3/4
self.resultBuffer = [] self.resultBuffer = []
@@ -31,10 +31,13 @@ class HandDetector():
i=0 i=0
j=0 j=0
for cpt in range (0,4): for cpt in range (0,4):
V1=[handLandmarks[(4*cpt)+5][0]-handLandmarks[(4*cpt)+0][0],handLandmarks[(4*cpt)+5][1]-handLandmarks[(4*cpt)+0][1]]
V2=[handLandmarks[(4*cpt)+8][0]-handLandmarks[(4*cpt)+5][0],handLandmarks[(4*cpt)+8][1]-handLandmarks[(4*cpt)+5][1]]
j1=np.dot(V1,V2)
V1=[handLandmarks[(4*cpt)+6][0]-handLandmarks[(4*cpt)+5][0],handLandmarks[(4*cpt)+6][1]-handLandmarks[(4*cpt)+5][1]] V1=[handLandmarks[(4*cpt)+6][0]-handLandmarks[(4*cpt)+5][0],handLandmarks[(4*cpt)+6][1]-handLandmarks[(4*cpt)+5][1]]
V2=[handLandmarks[(4*cpt)+8][0]-handLandmarks[(4*cpt)+6][0],handLandmarks[(4*cpt)+8][1]-handLandmarks[(4*cpt)+6][1]] V2=[handLandmarks[(4*cpt)+8][0]-handLandmarks[(4*cpt)+6][0],handLandmarks[(4*cpt)+8][1]-handLandmarks[(4*cpt)+6][1]]
j=np.dot(V1,V2) j2=np.dot(V1,V2)
if (j>0.005): if (j1>0 and j2>0):
return etatDuPouce[0] return etatDuPouce[0]
V1=[handLandmarks[4][0]-handLandmarks[1][0],handLandmarks[4][1]-handLandmarks[1][1]] V1=[handLandmarks[4][0]-handLandmarks[1][0],handLandmarks[4][1]-handLandmarks[1][1]]
V2=[handLandmarks[2][0]-handLandmarks[1][0],handLandmarks[2][1]-handLandmarks[1][1]] V2=[handLandmarks[2][0]-handLandmarks[1][0],handLandmarks[2][1]-handLandmarks[1][1]]
@@ -67,20 +70,24 @@ class HandDetector():
for landmarks in hand_landmarks.landmark: for landmarks in hand_landmarks.landmark:
handLandmarks.append([landmarks.x, landmarks.y]) handLandmarks.append([landmarks.x, landmarks.y])
#On ajoute la position de chaque mains a une liste #On ajoute la position de chaque mains a une liste
handsPositions.append(self.reconnaissancePouce(handLandmarks)) handsPositions.append([self.reconnaissancePouce(handLandmarks), handLandmarks])
#On calcule le résultat suivant la position des deux mains #On calcule le résultat suivant la position des deux mains
if(len(handsPositions) == 2): if(len(handsPositions) == 2):
if(handsPositions[0] == handsPositions[1]): if(handsPositions[0][0] == handsPositions[1][0]):
thumbState = handsPositions[0] thumbState = handsPositions[0]
elif(handsPositions[0] == "neutre"): handLandmarks = handsPositions[0][1]
elif(handsPositions[0][0] == "neutre"):
thumbState = handsPositions[1] thumbState = handsPositions[1]
elif(handsPositions[1] == "neutre"): handLandmarks = handsPositions[1][1]
thumbState = handsPositions[0] elif(handsPositions[1][0] == "neutre"):
thumbState = handsPositions[0][0]
handLandmarks = handsPositions[0][1]
else: else:
thumbState = "neutre" thumbState = "neutre"
else: else:
thumbState = handsPositions[0] thumbState = handsPositions[0][0]
handsLandmarks = handsPositions[0][1]
self.resultBuffer.append(thumbState) self.resultBuffer.append(thumbState)
if(len(self.resultBuffer) > self.BUFFER_LENGTH): if(len(self.resultBuffer) > self.BUFFER_LENGTH):
@@ -101,3 +108,7 @@ class HandDetector():
return False return False
if __name__ == "__main__":
h = HandDetector()
while(1):
print(h.detect())

View File

@@ -0,0 +1,9 @@
[Unit]
Description=Téléreview scripts
[Service]
Type=oneshot
ExecStart=/home/telereview/pact71/code/setup.sh
[Install]
WantedBy=multi-user.target

View File

@@ -1,6 +1,4 @@
import nltk from vaderSentiment_fr.vaderSentiment import SentimentIntensityAnalyzer
import os
from dataclasses import dataclass
#Emplacements des fichiers contenants le lexique et les avis #Emplacements des fichiers contenants le lexique et les avis
lexiconPath = r"C:\Users\kesha\Desktop\TelecomParis\PACT\fr_lexicon.txt" lexiconPath = r"C:\Users\kesha\Desktop\TelecomParis\PACT\fr_lexicon.txt"
@@ -32,24 +30,29 @@ scoreWords.close()
### Partie analyse d'avis ### ### Partie analyse d'avis ###
file = open(reviewPath, "r")
file = open(reviewPath, "r", encoding='UTF-8')
reviews = (file.read()).split('//') reviews = (file.read()).split('//')
#liste (partielle) de mots-clé pertinents pour un musée #liste (partielle) de mots-clé pertinents pour un musée
keys=['attente', "d'attente", 'queue', 'patienter', 'patience', 'patient', keys=['attente', "d'attente", 'queue', 'patienter', 'patience', 'patient',
'patients', 'patiente', 'patientes', 'patients', 'patiente', 'patientes', 'file', 'files',
'impolitesse' ,'impolie', 'impolies', 'impoli', 'impolis', 'impolitesse' ,'impolie', 'impolies', 'impoli', 'impolis',
'gentillesse', 'amabilité', 'aimable', 'aimables','gentil', 'gentils', 'gentillesse', 'amabilité', 'aimable', 'aimables','gentil', 'gentils',
'gentille', 'gentilles', 'personnel', 'gentille', 'gentilles', 'personnel',
'sales', 'sale', 'saleté', 'propre', 'propres', 'propreté', 'sales', 'sale', 'saleté', 'propre', 'propres', 'propreté',
'acceuil', 'prix', 'cher', 'chers', 'chère', 'chères', 'acceuil', 'prix', 'cher', 'chers', 'chère', 'chères',
'onéreux', 'onéreuse', 'onéreuses', 'abordable', 'onéreux', 'onéreuse', 'onéreuses', 'abordable',
'raisonnable', 'raisonnables', 'accessible', 'accessibilité', 'orienter','employé', 'raisonnable', 'raisonnables', 'accessible', 'accessibilité',
'employés', 'employées', 'employée', 'handicapé', 'handicapée', 'handicapés', 'handicapées', 'orienter','employé',
'orientation', 'orienté', "s'orienter", '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', 'désorienter', 'désorienté', 'désorientée', 'désorientés', 'désorientées',
'panneau', 'panneaux', 'signalétique', 'labyrinthe', '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é #Tableau de paires mots-clé, score associé
keyWords = [] keyWords = []
@@ -57,6 +60,11 @@ keyWords = []
#Score moyen d'un avis #Score moyen d'un avis
averageScore = 0 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 #Fonction de recherche d'un mot d'un avis parmis le lexique
def search(word): def search(word):
if (len(word) != 0): if (len(word) != 0):
@@ -71,35 +79,82 @@ def search(word):
return([word, scoreTable[ord(word[0])-97][mots.index(word)][1]]) return([word, scoreTable[ord(word[0])-97][mots.index(word)][1]])
return(-1) return(-1)
for Review in reviews: #Fonction déterminant si une phrase contient une négation et renvoyant un booléen
#print(Review) def isNegative(sentence):
if (('ne' in sentence) or ("n'" in sentence) or ("pas" in sentence)):
return True
return False
vaderCriteria = ['neg', 'neu', 'pos', 'compound']
def ReviewAnalyzer(review):
reviewScore = 0 reviewScore = 0
#miniKey donne les mots-clé contenus dans l'avis en train d'être analysé
miniKey = [] miniKey = []
#recherche de mots positifs/négatifs
review = list(e.strip(',.') for e in Review.split()) ### Recherche de mots positifs/négatifs ###
for Word in review:
word = Word.lower() #On découpe l'avis en une liste de phrases
temp = search(word) sentences = Review.split('.')
#recherche d'un éventuel mot-clé associé à ce caractère positif/négatif for sent in sentences:
if (temp != -1):
for key in keys: #On découpe la phrase en une liste de mots
if (key in review): sentence = list(e.strip(',.') for e in sent.split())
cles = list(e[0] for e in keyWords) for Word in sentence:
if (key in cles):
keyWords[cles.index(key)][1] += temp[1] #On met tout les mots en minuscule pour ne pas prendre en compte les majuscules
else: word = Word.lower()
keyWords.append([key, temp[1]]) temp = search(word)
miniKey.append(key)
reviewScore += temp[1] #recherche d'un éventuel mot-clé associé à ce caractère positif/négatif
averageScore += reviewScore if (temp != -1):
#Caractéristique de l'avis analysé
#On change la valeur du score associé au mot-clé
#si la phrase contient une négation
if (isNegative(sentence)):
temp[1] = -temp[1]
for key in keys:
if (key in sentence):
#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]
#Caractéristiques de l'avis analysé
miniKey = set(miniKey) miniKey = set(miniKey)
print("Mots-Clé: ", miniKey) return(miniKey, reviewScore)
print("Score: ", reviewScore)
print('') for Review in reviews:
ReviewAnalayzer(Review)
#Ces 3 lignes sont pour comparer avec le score de VADER
score = SIA.polarity_scores(sent)
for criteria in vaderCriteria:
vaderScore[criteria] += score[criteria]
averageScore /= len(reviews) averageScore /= len(reviews)
print("Format: [[Mot-clé, score associé]]") print("Format: [[Mot-clé, score associé]]")
print(keyWords) for e in keyWords:
print(e)
print('')
print("Nombre d'avis: ", len(reviews)) print("Nombre d'avis: ", len(reviews))
print("Score moyen d'un avis: ", averageScore) 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()