HEAD
# Les objectifs du projet
L'objectif du projet est de mettre en place une plateforme de requête d'un modèle de langue permettant la génération de résumés d'articles de presse.
# Une description du système ou des données auxquelles l’interface permet d’accéder
## Les Données 💾
Le projet utilisera pour l'entraînement du modèle de langue le corpus issu de 'Newsroom: A Dataset of 1.3 Million Summaries with Diverse Extractive Strategies' (Grusky et al., NAACL 2018) newsroom assemblé par Max Grusky et ses collègues en 2018. Newsroom est un corpus parallèle rassemblant 1,3 millions articles de presse et leur résumé en anglais. Les résumés sont réalisés en utilisant les méthodes d'extraction comme d'abstraction ainsi que des méthodes mixtes. Ce corpus est disponible sur HuggingFace mais nécessite un téléchargement préalable pour des raisons de protection des données.
Le corpus est nettoyé avant d'être utilisé pour l'entraînement du LSTM. Seules les parties 'text' et 'summary' du jsonl sont utilisées.
## Le système 🖥️
2 systèmes :
- LSTM réalisé à partir du cours et de cet exemple et de beaucoup d'autres références en ligne.
- Fine-tuned transformers
# La méthodologie
## Répartition du travail 👥
Nous avons travaillé avec le logiciel de gestion de version Github en mettant en place une intégration continue envoyant directement les `pull request` sur l'espace Huggingface.
Idéalement, les `pull request` doivent être validées par deux membres du projet avant d'être accéptées afin d'éviter les erreurs en production. Nous n'avons pas mis en place ces restrictions à cause de la difficulté à gérer Docker dans Huggingface qui nous a nécessité beaucoup de modifications.
## Problèmes rencontrés et résolutions
### Problèmes sur le corpus 📚
- [x] Problème Mojibake depuis les fichiers jsonl :
- [x] encodage en cp1252 et decodage en utf-8 avec ignore pour éviter les erreurs sur les caractères utf-8 présents dans le fichier à l'encodage
- ❔Le problème ne se présente étrangement pas sur toutes les machines.
- [x] Agglomération des pronoms et des verbes
- D'abord remplacement des `'` par des espaces avant le `split`
- Utilisation d'un dictionnaire de correspondances
- [ ] Split des noms propres composés ('Ivory Coast', 'Inter Milan') :
- [ ] pas de résolution à ce jour
- [ ] Problème des mots non disponibles dans le vocabulaire
- À terme, entraînement sur tout le corpus ?
- [ ] Problème de la qualité du corpus :
- Résumés tronqués : "Did Tatum O'Neal's latest battle with ex-husband John McEnroe put her back on drugs? The \"Paper Moon\"star checked herself into L.A.'s Promises rehab facility after a friend caught her smoking crack, according to The National Enquirer. O'Neal emerged clean and sober from Promises' 34-day recovery program in late July, the tab reports. The actress is said to have plunged into her old habits because of" ...
- Résumés plus proche de titres que de résumés : "SAN DIEGO PADRES team notebook"
- [ ] pas de résolution à ce jour
### Problèmes sur le Réseau de Neurones 🕸️
- [x] Prise en compte du padding dans l'apprentissage :
- [ ] utilisation de la fonctionnalité ignore_index de NLLLoss avec un padding d'une valeur à -100
- [ ] Temps d'apprentissage très long :
- [ ] essai de mise en place d'un entraînement par batch
- [ ] Répetition des déterminants après entraînement du modèle - https://huggingface.co/blog/how-to-generate
- [x] mise en place d'un Beam Search - non fructueux
- [ ] Passage vers du Sampling
### Problèmes sur le fine-tuning
- [x] La fonction map ne peut pas s'appliquer :
* Dans le prétraitement des données, utilisation de ```Dataset.from_dict(dataframe)``` pour obtenir les données en dataset au lieu d'un dataframe
- [x] Problème pour la permission d'appel du model privé enregistré sur HuggingFace :
* Se connecter à l'aide de huggingface-cli login et mettre use_auth_token=True en appelant le modèle.
- [x] Processus arrêté sans erreur détectée :
* Diminuer le nombre de données
* Modifier les paramètres d'entrainement en diminuant le nombre d'epoch d'entrainement
- [ ] Warning message pour les tokens non identifiables en raison de la conversion de ```sentencepiece tokenizer``` en fast tokenizer :
* Pas de résolution à ce jour
- [ ] Les résultats d'évaluation selon ROUGE sont très mauvais, rouge2 à 0 :
* Pas de résolution à ce jour
### Problèmes sur l'interface
- [x] Permettre le choix du modèle à l'utilisateur de l'application
- Envoi de deux formulaires distincts pour le choix du modèle et le texte d'entrée
- [x] Permettre la remise à zéro des deux boîtes de texte
- Utilisation de javascript pour créer une fonction de reset personnalisée
- [x] Faire en sorte qu'on ne puisse pas lancer l'inférence avec le bouton "GO" sans avoir choisi de modèle au préalable
- Désactivation des boutons "GO" et "RESET" sur le point de terminaison "/" de l'API.
- [x] Veiller à la robustesse de l'API si l'utilisateur ne fait pas les actions dans l'ordre établi
- Renvoi de messages d'erreur si le modèle n'est pas sélectionné ou si le texte n'est pas saisi.
- [x] Faire en sorte que le modèle sélectionné reste sélectionné après l'envoi du formulaire
- Utilisation d'une boucle for de jinja pour parcourir la liste des modèles et création d'une boucle if pour tester le choix du modèle et lui attribuer l'attribut "selected".
### Problèmes de l'Intégration continue
- [x] Pas de lien possible entre Huggingface et un github dont l'history contient des fichier de plus de 10Mo
- 💣 Explosion du github
- [ ] Docker qui fonctionne en local mais en sur Huggingface
- Problème de path de fichier
## Les étapes du projet
1. Initialisation du Github
2. Premiers pas dans le réseau de neurones
3. Réalisation de la plateforme
4. Intégration à Huggingface
5. Fine-tuning de modèle
6. Finalisation
# Implémentation
## modélisation
Nous avons décidé dans un premier temps de modéliser une LSTM pour le résumé automatique sur la base du réseau de neurones réalisé en cours.
Pour ce faire, nous nous sommes beaucoup inspirées du kaggle https://www.kaggle.com/code/columbine/seq2seq-pytorch ainsi que de la documentation de PyTorch https://pytorch.org/tutorials/beginner/nlp/sequence_models_tutorial.html#example-an-lstm-for-part-of-speech-tagging
## modules et API utilisés
### Dataloader :
- Data
```
A class used to get data from file
...
Attributes
----------
path : str
the path to the file containing the data
Methods
-------
open()
open the jsonl file with pandas
clean_data(text_type)
clean the data got by opening the file and adds and
tokens depending on the text_type
get_words()
get the dataset vocabulary
```
- Vectoriser
```
A class used to vectorise data
...
Attributes
----------
vocab : list
list of the vocab
Methods
-------
encode(tokens)
transforms a list of tokens to their corresponding idx
in form of troch tensor
decode(word_idx_tensor)
converts a tensor to a list of tokens
vectorize(row)
encode an entire row from the dataset
```
### Model :
- Forward function in the EncoderDecoderModel class
```
:param source: tensor
the input text
:param num_beams: int
the number of outputs to iterate on for beam_search
:param summary_len: int
length ratio of the summary compared to the text
```
### Train :
- Train function for LSTM
```
Train the EncoderDecoderModel network for a given number of epoch
-----------
Parameters
model: torch.nn.Module
EncoderDecoderModel defined in model.py
train_set: Sequence[Tuple[torch.tensor, torch.tensor]]
tuple of vectorized (text, summary) from the training set
dev_set: Sequence[Tuple[torch.tensor, torch.tensor]]
tuple of vectorized (text, summary) for the dev set
epochs: int
the number of epochs to train on
clip: int
Return
None
```
### Inference :
- Inference function for LSTM
```
Predict the summary for an input text
--------
Parameter
text: str
the text to sumarize
Return
str
The summary for the input text
```
### API :
- Summarize function
```
Returns the summary of an input text.
---------
Parameter
text : str
A text to summarize.
Returns
:str
The summary of the input text.
```
## Langages de programmation & utilitaires
- 🐳 Docker
- yaml
- jinja2
- 🐍 et python evidemment
# Les résultats (fichiers output, visualisations…)
## Les metriques d'évaluation
- ROUGE
- BLEU
# Discussion des résultats
## Résultats du LSTM
Les résultats du LSTM sont inutilisables mais ont permis au moins de se confronter à la difficulté de mettre en place des réseaux de neurones depuis pas grand chose.
On aurait aimé avoir plus detemps pour aller plus loin et comprendre mieux encore : l'entraîement par batch, pourquoi les résultats sont si mauvais, mettre d'autres stratégies de génération en place, ...
## Résultat du fine-tuning
Les résumés générés ne sont pas grammaticalement corrects à 100% mais les informations importantes du texte sont bien présentes dans le résumé, et la longueur du résumé correspond bien à notre attente. Cependant, les résultats d'évaluation selon ROUGE sont très mauvais, malgré une amélioration de 0.007 à 0.06 pour rouge1, il n'est plus possible d'obtenir de meilleurs scores.
=======
# Les objectifs du projet
L'objectif du projet est de mettre en place une plateforme de requête d'un modèle de langue permettant la génération de résumé d'article de presse.
# Une description du système ou des données auxquelles l’interface permet d’accéder
## Les Données 💾
Le projet utilisera pour l'entraînement du modèle de langue le corpus issu de 'Newsroom: A Dataset of 1.3 Million Summaries with Diverse Extractive Strategies' (Grusky et al., NAACL 2018) newsroom assemblé par Max Grusky et ses collègues en 2018. Newsroom est un corpus parallèle rassemblant 1,3 millions articles de presse et leur résumé en anglais. Les résumés sont réalisés en utilisant les méthodes d'extraction comme d'abstraction ainsi que des méthodes mixtes. Ce corpus est disponible sur HuggingFace mais necessite un téléchargement préalable pour des raisons de protection des données.
Le corpus est nettoyé avant d'être utilisé pour l'entraînement du LSTM. Seule les parties 'text' et 'summary' du jsonl sont utilisées.
## Le système 🖥️
2 systèmes :
- LSTM réalisé à partir du cours et de cet exemple et de beaucoup d'autres référence en ligne.
- Fine-tuned transformers modèle lancé et pré-entrainé par Google :google/mt5-small, il s'agit d'une variance du mT5. Le model est entrainé pour notre tâche en se basant sur la documentation sur Summarisation proposé par Huggingface.
# La méthodologie
## Répartition du travail 👥
Nous avons travaillé avec le logiciel de gestion de version Github en mettant en place une intégration continue envoyant directement les `pull request` sur l'espace Huggingface.
Idéalement, les `pull request` doivent être validées par deux membres du projet avant d'être accéptées afin d'éviter les erreurs en production. Nous n'avons pas mis en place ces restrictions à cause de la difficulté à gérer Docker dans Huggingface qui nous a nécessité beaucoup de modification.
## Problèmes rencontrés et résolution
### Problème sur le corpus 📚
- [x] Problème Mojibake depuis les fichiers jsonl :
- [x] encodage en cp1252 et decodage en utf-8 avec ignore pour éviter les erreurs sur les caractères utf-8 présents dans le fichier à l'encodage
- ❔Le problème ne se présente étrangement pas sur toutes les machines.
- [x] Agglomération des pronoms et des verbes
- D'abord remplacement des `'` par des espaces avant le `split`
- Utilisation d'un dictionnaire de correspondance
- [ ] Split des noms propres composés ('Ivory Coast', 'Inter Milan') :
- [ ] pas de résolution à ce jour
- [ ] Problème des mots non disponibles dans le vocabulaire
- À terme, entraînement sur tout le corpus ?
- [ ] Problème de la qualité du corpus :
- Résumés tronqués : "Did Tatum O'Neal's latest battle with ex-husband John McEnroe put her back on drugs? The \"Paper Moon\"star checked herself into L.A.'s Promises rehab facility after a friend caught her smoking crack, according to The National Enquirer. O'Neal emerged clean and sober from Promises' 34-day recovery program in late July, the tab reports. The actress is said to have plunged into her old habits because of" ...
- Résumés plus proche de titres que de résumés : "SAN DIEGO PADRES team notebook"
- [ ] pas de résolution à ce jour
### Problème sur le Réseau de Neurone 🕸️
- [x] Prise en compte du padding dans l'apprentissage :
- [ ] utilisation de la fonctionnalité ignore_index de NLLLoss avec un padding d'une valeur à -100
- [ ] Temps d'apprentissage très long :
- [ ] essai de mise en place d'un entraînement par batch
- [ ] Répetition des déterminants après entraînement du modèle - https://huggingface.co/blog/how-to-generate
- [x] mise en place d'un Beam Search - non fructueux
- [ ] Passage vers du Sampling
### Problème sur le fine-tuning
- [x] La fonction map ne peut pas s'appliquer :
- Dans le prétrainement des données, utilise Dataset.from_dict(dataframe) pour obtenir les donneés en Dataset au lieu de Dataframe
- [x] Problème de la permission d'appel du model privé enregistré sur HuggingFace :
- Se connecter à l'aide de `huggingface-cli login` et mettre `use_auth_token=True` en appelant le model.
- [x] Processus arrêté sans erruers détectées :
- Diminuer le nombre de données
- Modifier les paramètres d'entrainement en diminuant le nombre d'epoch d'entrainement
- [ ] Warning message pour les tokens non identifiables causé par
la conversion de sentencepiece tokenizer en fast tokenizer:
- [ ] pas de résolution à ce jour
- [ ] Les résultats d'évaluation selon ROUGE sont très mauvais, rouge2 à 0:
- [ ] pas de résolution à ce jour
### Problème sur l'interface
### Problème de l'Intégration continue
- [x] Pas de lien possible entre Huggingface et un github dont l'history contient des fichier de plus de 10Mo
- 💣 Explosion du github
- [ ] Docker qui fonctionne en local mais en sur Huggingface
- Problème de path de fichier
## Les étapes du projet
1. Initialisation du Github
2. Premiers pas dans le réseau de neurone
3. Réalisation de la plateforme
4. Intégration à Huggingface
5. Fine-tuning de modèle
6. Finalisation
# Implémentation
## modélisation
Nous avons décidé dans un premier temps de modéliser une LSTM pour le résumé automatique sur la base du réseau de neurone réalisé en cours.
Pour ce faire nous nous sommes beaucoup inspirée du kaggle https://www.kaggle.com/code/columbine/seq2seq-pytorch ainsi que de la documentation de PyTorch https://pytorch.org/tutorials/beginner/nlp/sequence_models_tutorial.html#example-an-lstm-for-part-of-speech-tagging
## modules et API utilisés
### Dataloader :
- Data
```
A class used to get data from file
...
Attributes
----------
path : str
the path to the file containing the data
Methods
-------
open()
open the jsonl file with pandas
clean_data(text_type)
clean the data got by opening the file and adds and
tokens depending on the text_type
get_words()
get the dataset vocabulary
```
- Vectoriser
```
```
### Model :
### train :
### inference :
### api :
### templates :
## Langages de programmation
- 🐳 Docker
- yaml
- 🐍 et python evidemment
# Les résultats (fichiers output, visualisations…)
## Les metriques d'évaluation
- ROUGE
- BLEU
# Discussion des résultats
## Résultats du LSTM
Les résultats du LSTM sont inutilisables mais ont permis au moins de se confronter à la difficulté de mettre en place des réseaux de neurones depuis pas grand chose.
On aurait aimé avoir plus de temps pour aller plus loin et comprendre mieux encore : l'entraîement par batch, pourquoi les résultats sont si mauvais, mettre d'autres stratégies de génération en place, ...
## Résultat du fine-tuning
Les résumés générés ne sont pas grammaticalement corrects à 100% mais les informations importantes du texte sont bien présentes dans le résumé, et la longeur du résumé correspond bien à notre attente. Cependant les résultats d'évaluation selon ROUGE est très mauvais, malgré une amélioration de 0.007 à 0.06 pour rouge1, il n'ést plus possible d'obtenir de meilleurs scores.
>>>>>>> 7f1c2ca2f0a0475d3903b3261a03b02bfaad7374