ajouts description algorithmes au rapport

This commit is contained in:
François Pelletier 2019-12-27 20:27:21 -05:00
parent c8c4c2b137
commit a2d179a3c0
4 changed files with 92 additions and 56 deletions

View file

@ -51,22 +51,6 @@
"f.close()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Aperçu des données"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"textes_articles_df.head(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
@ -88,32 +72,12 @@
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"jupyter": {
"source_hidden": true
}
},
"metadata": {},
"outputs": [],
"source": [
"commentaires_df = commentaires_df[commentaires_df[\"media\"]!='CNN']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Aperçu des données"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"commentaires_df.head(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
@ -221,9 +185,7 @@
"source": [
"# Analyse des commentaires\n",
"## Niveau de langage\n",
"### Nombre de jetons dans WordNet\n",
"\n",
"On utilise le POS tag identifié depuis Stanford POS Tagger, puis on le convertis en tag compatible pour Wordnet. On recherche ensuite le mot lemmatisé dans Wordnet en français, puis on filtre les résultats avec le POS. Ceci permet d'identifier tous les synsets réalistes pour les mots du commentaire."
"### Nombre de jetons dans WordNet"
]
},
{
@ -540,7 +502,7 @@
"metadata": {},
"outputs": [],
"source": [
"commentaires_df['nb_mots_majuscules'] = commentaires_df.apply(lambda x: len([word for word,_ in x[\"pos_dict\"] if word.isupper()]), axis=1)"
"commentaires_df['nb_mots_majuscules'] = commentaires_df.apply(lambda x: min(10,len([word for word,_ in x[\"pos_dict\"] if word.isupper()])), axis=1)"
]
},
{
@ -553,7 +515,7 @@
"g004 = sns.catplot(x=\"media\", y=\"nb_mots_majuscules\",\n",
" kind=\"boxen\",\n",
" data=d004);\n",
"g004.set_axis_labels(\"Média\", \"Nombre de mots en majuscules\")\n",
"g004.set_axis_labels(\"Média\", \"Nombre de mots en majuscules\\n(limité à 10)\")\n",
"g004.despine(offset=10, trim=True)\n",
"g004.savefig(\"g004.pdf\")"
]
@ -602,7 +564,8 @@
"metadata": {},
"outputs": [],
"source": [
"commentaires_df['nb_punct_succ'] = commentaires_df.apply(lambda x: nb_punct_succ(x['comment_clean']), axis=1)"
"commentaires_df['nb_punct_succ'] = commentaires_df.apply(lambda x: min(10,nb_punct_succ(x['comment_clean'])), axis=1)\n",
"commentaires_df['units'] = 1"
]
},
{
@ -611,13 +574,11 @@
"metadata": {},
"outputs": [],
"source": [
"d005 = commentaires_df[commentaires_df.nb_punct_succ > 0][['media','nb_punct_succ']].copy()\n",
"g005 = sns.catplot(x=\"media\", y=\"nb_punct_succ\",\n",
" kind=\"boxen\",\n",
" data=d005);\n",
"g005.set_axis_labels(\"Média\", \"Nombre ponctuations successives totales\")\n",
"g005.despine(offset=10, trim=True)\n",
"g005.savefig(\"g005.pdf\")"
"d005 = commentaires_df[['media','nb_punct_succ','units']].groupby([\"media\",'nb_punct_succ']).agg(\"sum\").reset_index([\"media\",'nb_punct_succ']).copy()\n",
"g005 = sns.barplot(x='nb_punct_succ',y='units', hue='media',data=d005);\n",
"g005.set_ylabel(\"Nombre de commentaires\")\n",
"g005.set_xlabel(\"Ponctuations successives totales (limité à 10)\")\n",
"g005.figure.savefig(\"g005.pdf\")"
]
},
{
@ -766,7 +727,7 @@
"source": [
"def intersection(lst1, lst2): \n",
" lst3 = [value for value in lst1 if value in lst2] \n",
" return lst3 "
" return lst3"
]
},
{

View file

@ -116,4 +116,22 @@
url = {http://hdl.handle.net/11234/1-3105},
year = {2019},
annote = {LINDAT/CLARIN digital library at the Institute of Formal and Applied Linguistics (ÚFAL), Faculty of Mathematics and Physics, Charles University}
}
@inproceedings{manning_stanford_2014,
title = {The {Stanford} {CoreNLP} {Natural} {Language} {Processing} {Toolkit}},
url = {http://www.aclweb.org/anthology/P/P14/P14-5010},
booktitle = {Association for {Computational} {Linguistics} ({ACL}) {System} {Demonstrations}},
author = {Manning, Christopher D. and Surdeanu, Mihai and Bauer, John and Finkel, Jenny and Bethard, Steven J. and McClosky, David},
year = {2014},
pages = {55--60}
}
@misc{taehoon_kim_emoji_2019,
title = {emoji},
url = {https://github.com/carpedm20/emoji/commit/f2598b78eecec9c6839c0d8b4fea820c0feb29e8},
abstract = {emoji terminal output for Python},
author = {{Taehoon Kim} and {Kevin Wurster}},
month = sep,
year = {2019}
}

View file

@ -1,19 +1,48 @@
# nlp_a2019_tp3
# Travail pratique 3
Cours: IFT-7022
Session: Automne 2019
Auteur: François Pelletier
## Installation des dépendances du projet
Installer Anaconda3
Installer Anaconda3 depuis https://www.anaconda.com/distribution/#download-section
Installer ces paquets additionnels dans l'environnement
```bash
pip install newspaper3k
pip install emoji
pip install git+https://github.com/ClaudeCoulombe/FrenchLefffLemmatizer.git
```
## Installations des dépendances de nltk
```python
import nltk
nltk.download('wordnet')
nltk.download('omw')
```
## Compilation du rapport
## Obtenir CoreNLP
make
Télécharger CoreNLP depuis
https://stanfordnlp.github.io/CoreNLP/download.html
- Le fichier principal: `stanford-corenlp-full-2018-10-05.zip`
- Les fichiers de modèles pour le français, à mettre dans le même dossier que CoreNLP: `stanford-french-corenlp-2018-10-05-models.jar`
## Démarrer le serveur CoreNLP
Exécuter cette commande dans le répertoire de CoreNLP
```bash
java -mx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer -serverProperties StanfordCoreNLP-french.properties -preload tokenize,ssplit,pos,lemma,ner,parse,depparse -status_port 9000 -port 9000 -timeout 15000 &
```
## Compilation du rapport en PDF (requiert pandoc et texlive, a installer depuis les paquets de la distribution linux utilisée):
```bash
make
```

View file

@ -166,7 +166,23 @@ Ces deux corpus ont été créés à l'aide des données de commentaires extrait
## Méthodologie et algorithmes
J'ai effectué la lemmatisation en français à l'aide du French LEFFF Lemmatizer de Claude Coulombe [@coulombe_french_2019], qui est compatible avec la syntaxe utilisée dans la librairie NLTK et les étiquettes POS utilisées dans WordNet.
La plupart des analyses ont été effectuées à l'aide des différents algorithmes inclus dans la librairie NLTK et le logiciel Stanford CoreNLP [@manning_stanford_2014].
### Traitement des articles et des commentaires
La segmentation en phrases a été effectuée à l'aide de l'algorithme `PunktSentenceTokenizer` et la segmentation en mots à l'aide de `ToktokTokenizer` ou `TweetTokenizer`.
L'étiquetage des POS et l'extraction des entités nommées dans les articles ont été effectuées à l'aide de l'analyseur Stanford CoreNLP. Seules les étiquettes POS suivantes ont été conservées: `['ADJ','ADV','INTJ','NOUN','PROPN','VERB']` dans un dictionnaire Python. Les entités nommées ont aussi été enregistrées dans un dictionnaire Python.
### Traitement additionnel pour les commentaires
Les références aux auteurs ont été identifiées en effectuant la liste des auteurs des commentaires pour chacun des articles, puis en identifiant ceux-ci dans le texte des commentaires pour le même article.
Puis, les émojis ont été convertis en texte à l'aide de la librairie `emoji` pour Python [@taehoon_kim_emoji_2019]. Ils ont aussi été extraits dans un dictionnaire Python.
La lemmatisation en français a été effectuée à l'aide du French LEFFF Lemmatizer de Claude Coulombe [@coulombe_french_2019], qui est compatible avec la syntaxe utilisée dans la librairie NLTK et les étiquettes POS utilisées dans WordNet.
On identifie les synsets réalistes pour chaque mot admissible depuis WordNet en convertissant les étiquettes POS identifiées depuis avec CoreNLP POS Tagger en étiquettes compatibles. On recherche ensuite le mot lemmatisé dans WordNet, et on filtre les résultats obtenus selon les POS possibles.
## Analyse statistique des commentaires
@ -174,18 +190,30 @@ J'ai effectué la lemmatisation en français à l'aide du French LEFFF Lemmatize
![Nombre de jetons avec POS dans WordNet, par commentaire, par média](g000.pdf)
On observe une médiane entre 2 et 5 pour le nombre de mots ayant une étiquette POS et un synset dans Wordnet. Ce nombre est remarquablement plus élevé pour les commentaires sur les publications de RC. Dans presque tous les cas, il est possible d'utiliser au moins un synset pour inférer le sens de la publication et ainsi établir une relation sémantique avec l'article.
![Proportion de jetons avec POS dans WordNet, par commentaire, par média](g001.pdf)
Dans plus de la moitié des cas, 75% des mots ayant une étiquette POS dans les commentaires sont présents dans WordNet.
![Nombre de types de POS avec classes fermées, par commentaire, par média](g002.pdf)
La majorité des commentaires contiennent entre deux et quatre types d'étiquettes POS.
### Distribution des marqueurs d'emphase
![Emojis les plus fréquents, par médias](g003.pdf)
Les émojis les plus fréquents, par une large proportion, expriment le rire. Le plus fréquent est *Face With Tears of Joy*.
![Nombre de mots en majuscules, par commentaire, par média](g004.pdf)
On retrouve généralement peu de mots en majuscules, mais les rares commentaires qui en contiennent en ont beaucoup. Cette caractéristique ne ferait cependant pas un bon attribut pour un modèle de classification.
![Nombre de ponctuations successives totales, par commentaire, par média](g005.pdf)
On remarque qu'il y a une quantité non-négligeable de commentaires qui contiennent des ponctuations successives. Ce serait un attribut à considérer dans un modèle de classification.
### Indicateurs d'intertextualité
Le principal indicateur de l'intertextualité est la référence directe à l'auteur d'un commentaire précédent.