diff --git a/rapport.md b/rapport.md index 57f7ff8..ab57915 100644 --- a/rapport.md +++ b/rapport.md @@ -8,13 +8,13 @@ output: pdf_document # Travail pratique 2 -## Classification de textes - analyse de sentiments +# Classification de textes - analyse de sentiments -### Introduction +## Introduction -L'objectif de cet exercice est de construire des modèles qui permettent de classifier des commentaires variés selon leur polarité. Nous disposons d'un jeu d'entraînement balancé composé de 3000 commentaires positifs et 3000 négatifs. Le jeu de test est aussi balancé et est composé de 986 commentaires positifs et 982 négatifs. Tous les commentaires sont en anglais. +L'objectif de cet exercice est de construire des modèles qui permettent de classifier des commentaires variés selon leur polarité. Nous disposons d'un jeu d'entraînement balancé composé de 3000 commentaires positifs et 3000 négatifs. Le jeu de test est aussi balancé et est composé de 986 commentaires positifs et 982 négatifs. Tous les commentaires sont en anglais. Toutes les tâches de traitement du langage naturel ont été effectuées à l'aide de la librairie *nltk* de Python. -### Prétraitement +## Prétraitement Nous effectuons quatre étapes de prétraitement: @@ -25,26 +25,42 @@ Nous effectuons quatre étapes de prétraitement: Pour chacune de ces étapes, certaines techniques seront expérimentées. Celles-ci produisent, aprèsla dernière étape, une matrice creuse de caractéristiques qui servira à entraîner les différents modèles. Nous ajoutons trois caractéristiques additionnelles à cette matrice, soit les nombres de mots positifs et négatifs, et le nombre total de mot du document. -#### Tokenisation +### Tokenisation -#### Normalisation +La tokenisation a été effectuée à l'aide de **Tok-tok**. Ce tokenizer récent fonctionne à l'aide d'expressions régulières. Comme il fonctionne à l'aide de phrases et non de documents, les commentaires ont d'abord été segmentés en phrases à l'aide de **Punkt**. La segmentation sera aussi conservée, car elle sera utilisée à l'étape de la sélection des types, en utilisant un étiquetage de classes grammaticale (POS). Une correction a été apportée aux documents, car de nombreuses fin de phrases étaient représentées par deux espaces au lieu d'un point et d'un espace. Cette substitution a été effectuée avec une expression régulière. Enfin, comme Tok-tok conserve le dernier caractère de ponctuation de la phrase comme un token, celui-ci est supprimé avant de retourner le résultat. -#### Sélection des types +### Normalisation -#### Vectorisation +Deux types de normalisation sont testées dans cet exercice: la désuffixation et la lemmatisation. -### Entraînement des modèles +La désuffixation (*stemming*) est effectuée à l'aide de l'algorithme **Porter stemmer**. Cet algorithme ne conserve que la racine du mot, ce qui a pour effet de produire des racines qui peuvent n'avoir aucun lien avec la nature du mot. Par exemple, *was* devient *wa*. La lemmatisation est effectuée à l'aide du **WordNet Lemmatizer**, qui utiliser la fonction *morphy* incluse dans WordNet. Si le mot n'est pas trouvé dans WordNet, il est retourné inchangé. Cet algorithme retourne par défaut un lemme qui est un nom, mais il est aussi possible de spécifier de retourner un verbe. C'est ce choix qui a été effectué dans le cas de cet exercice, car dans plusieurs cas nous avons des phrases incomplètes et ceci nous assure de retrouver au moins un verbe dans la phrase. + +### Sélection des types + +Trois types de sélection des types sont testés dans cet exercice: + +- La fréquence du mot est supérieure à 3 dans le corpus. Cette approche est implémentée à l'aide d'un dictionnaire qui recense le dénombrement de chaque type. +- Le mot ne figure pas dans une liste de mots-outils (*stop-words*). Cette approche utilise la liste de mots-outils incluse dans *nltk* pour l'anglais. +- Le mot appartient à une classe grammaticale ouverte. L'algorithme par défaut utilise le Penn Treebank, mais on effectue l'étiquetage à l'aide des **Universal POS tags** qui sont plus simples, comme on veut identifier des classes ouvertes à haut niveau, soit les noms, adjectifs, adverbes et verbes, représentés par NOUN, ADJ, ADV et VERB. Le mot *I* n'est pas classé correctement dans plusieurs cas, il est considéré comme un nom. Comme c'est un pronom, qui est une classe fermée, il est aussi éliminé de la liste des tokens sélectionnés. + +### Vectorisation + +Trois types de vectorisations ont été testées dans cet exercice: + +- + +## Entraînement des modèles Deux types de modèles sont entrainés: - Naive Bayes - Régression logistique -#### Naive Bayes +### Naive Bayes -#### Régression logistique +### Régression logistique -### Analyse de la performance +## Analyse de la performance Pour chacun des modèles entraînés, différentes métriques de performance sont calculées à l'aide du jeu de données de test. @@ -52,15 +68,18 @@ Pour chacun des modèles entraînés, différentes métriques de performance son ![Métriques de performance: Régression logistique](table_metriques_rl.pdf) -### Conclusion +## Conclusion -## Analyse syntaxique - portée d'une négation +# Analyse syntaxique - portée d'une négation -### Introduction - -### Conclusion - -## Références +## Introduction +## Conclusion +# Références +- [Punkt Sentence Tokenizer](https://www.nltk.org/api/nltk.tokenize.html#module-nltk.tokenize.punkt) +- [Tok-tok tokenizer](https://www.nltk.org/api/nltk.tokenize.html#module-nltk.tokenize.toktok) +- [Porter stemmer](https://www.nltk.org/api/nltk.stem.html#nltk.stem.porter.PorterStemmer) +- [WordNet Lemmatizer](https://www.nltk.org/api/nltk.stem.html#nltk.stem.wordnet.WordNetLemmatizer) +- [POS tagging](https://www.nltk.org/api/nltk.tag.html#module-nltk.tag) diff --git a/sentiment_analysis_functions.py b/sentiment_analysis_functions.py index aee37b0..7a10a23 100644 --- a/sentiment_analysis_functions.py +++ b/sentiment_analysis_functions.py @@ -8,7 +8,6 @@ Created on Sun Oct 27 17:16:54 2019 import nltk import re -import math from collections import defaultdict from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer from nltk.corpus import wordnet as wn