Browse Source

ajouts description algorithmes au rapport

master
FRANCOIS PELLETIER 1 year ago
parent
commit
a2d179a3c0
4 changed files with 92 additions and 56 deletions
  1. +12
    -51
      Analyse_Articles.ipynb
  2. +18
    -0
      NLP-TP3.bib
  3. +33
    -4
      README.md
  4. +29
    -1
      rapport.md

+ 12
- 51
Analyse_Articles.ipynb View File

@@ -55,22 +55,6 @@
"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": {},
"source": [
"### Lecture des données des commentaires"
]
},
@@ -88,30 +72,10 @@
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"jupyter": {
"source_hidden": true
}
},
"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)"
"commentaires_df = commentaires_df[commentaires_df[\"media\"]!='CNN']"
]
},
{
@@ -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"
]
},
{


+ 18
- 0
NLP-TP3.bib 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}
}

+ 33
- 4
README.md 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')
```

## Obtenir CoreNLP

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
## Compilation du rapport en PDF (requiert pandoc et texlive, a installer depuis les paquets de la distribution linux utilisée):

make
```bash
make
```

+ 29
- 1
rapport.md 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.


Loading…
Cancel
Save