IvanMiao/Outils-de-Traitement-de-Corpus

Diversa tempora, diversa poesis.

Python

0

23 commits

updated May 27, 2025

See the code

README

詩分唐宋: Classification poème-dynastie

中文 English

Ce projet s'inscrit dans le cadre du cours "Outils de Traitement de Corpus" du Master 1 Plurital.

Le dataset et le modèle sont tous les deux disponibles sur 🤗Hugging Face : Dataset, Model

Gestion de l'environnement

Ce projet utilise uv pour la gestion de l'environnement.

Pour exécuter les scripts (assurez-vous d'avoir installé uv):

uv run chemin/vers/le/script.py

Objectif du projet

L'objectif de ce projet est d'effectuer une classification textuelle sur un corpus de poèmes chinois classiques (à l'exclusion des formes ci(词) et qu(曲)). Le but est de prédire la dynastie (par ordre chronologique : WeiJin 魏晋, NanBei 南北朝, Tang 唐, Song 宋, Yuan 元, Ming 明, Qing 清) à laquelle un poème donné appartient.

Bien que les formes de la poésie chinoise classique soient restées relativement stables après la dynastie Tang, ce projet s'inspire de deux observations principales :

  1. Linguistique : Les caractéristiques linguistiques et l'usage des mots présentent des variations distinctes d'une dynastie à l'autre.

  2. Stylistique et théorie littéraire : En stylistique et selon la théorie littéraire chinoise ancienne, la poésie de chaque dynastie possède un style distinctif, souvent décrit comme un "zeitgeist".

Données

Les données du projet proviennent du site sou-yun.cn, qui n'interdit pas l'extraction de données.

Ce site a déjà classifié les poèmes par dynastie et fournit un index de tous les poèmes par auteur. Par conséquent, le projet utilise request et bs4 pour analyser la structure HTML du site et extraire les données poétiques des sept dynasties sélectionnées. Pour des raisons d'efficacité lors de l'entraînement, le script d'extraction récupère les 20 premiers poèmes de chaque poète (ou le maximum disponible si inférieur à 20) pour les dynasties comptant moins de 1000 poètes, et seulement les 20 premiers poèmes des 1000 premiers poètes pour les dynasties plus prolifiques.

Les données obtenues sont sauvegardées en format .csv, puis fusionnées en un seul grand ensemble de données qui est ensuite mélangé et divisé en trois sous-ensembles : entraînement/validation/test (selon un ratio 7 : 1.5 : 1.5, avec une répartition réelle des données de 17418 : 3733 : 3738). Ces ensembles sont stockés au format dataset de HuggingFace.

Ensemble de donnéesRatioQuantité réelle
Entraînement717 418
Validation1,53 733
Test1,53 738
Total1024 889

La visualisation des données est présentée ci-dessous :

Les deux premières dynasties (Weijin et Nanbei) présentent le plus petit nombre de poèmes, ce qui est logique car ce sont les dynasties les plus anciennes et donc celles dont le moins d'œuvres ont été conservées. La dynastie Weijin montre la longueur moyenne de poèmes la plus élevée, car dans notre corpus, les fu 赋 sont également considérés comme des poèmes. Durant cette période, la création de poèmes en quatre mots et de fu était proportionnellement plus fréquente que dans les six autres dynasties. Ces dernières, particulièrement après la dynastie Tang, privilégiaient les formes poétiques jueju 绝句 (24 ou 32 caractères, ponctuation incluse) et lüshi 律诗 (48 ou 64 caractères). Considérant que les poèmes de style ancien et les "fu" étaient occasionnellement créés et qu'ils sont beaucoup plus longs que les "jueju" et les "lüshi", la longueur moyenne obtenue (60-80 caractères) paraît raisonnable.

Entraînement

Ce projet utilise la HuggingFace Text Classification comme référence pour effectuer le fine-tuning des modèles de classification textuelle.

Le jeu de données a été entraîné sur trois modèles pré-entraînés de type BERT :

  1. distilled-bert-multilingual: un modèle BERT multilingue distillé, permettant un entraînement rapide
  2. bert-case-chinese: un modèle BERT pour le chinois
  3. ethanyt/guwenbert-base: un modèle basé sur bert-case-chinese ayant déjà été fine-tuné sur un grand corpus de textes chinois classiques

Le nombre d'époques (epoch) du premier modèle est fixé à 3. Afin de réduire le temps d'entraînement, il est fixé à 2 pour les deux autres modèles plus grands. Les autres paramètres restent inchangés.

En analysant les journaux de logs durant l'entraînement, on a obtenu l'évolution de la perte (Loss) par époque (Epoch) et les performances de chaque modèle sur l'ensemble de validation :

On peut observer que la tendance des pertes (loss) des trois modèles est globalement similaire, et que bert-case-chinese et ethanyt/guwenbert-base présentent presque une évolution parallèle — ce qui peut s'expliquer par le fait que le second a été fine-tuné à partir du premier. Un autre fait intéressant est que, pour distillBERT, la perte de validation augmente après la deuxième époque ; cependant, par manque de temps et de ressources, il n’a pas été possible d’observer ce phénomène sur les deux autres modèles plus grands.

Évaluation

Après l'entraînement des trois modèles, une évaluation a été effectué sur le sous-ensemble de test. La classe classification_report de sklearn est utilisé pour obtenir une évaluation plus détaillée des tâches de classification.

Pour le modèle distilled-bert-multilingual, on a:

DynastyPrecisionRecallF1-scoreSupport
WeiJin0.56270.82480.6690234
NanBei0.59860.53970.5676315
Tang0.49530.36800.4222568
Song0.35530.12110.1806446
Yuan0.41400.51150.4576823
Ming0.33890.36320.3506782
Qing0.37680.45090.4105570
accuracy0.42483738
macro avg0.44880.45420.43693738
weighted avg0.42280.42480.41213738

Pour le modèle bert-case-chinese, on a:

DynastyPrecisionRecallF1-scoreSupport
WeiJin0.65650.73500.6935234
NanBei0.59940.60320.6013315
Tang0.41100.58980.4845568
Song0.31030.14130.1941446
Yuan0.41830.53220.4684823
Ming0.37890.40030.3893782
Qing0.58580.27540.3747570
accuracy0.44623738
macro avg0.48000.46820.45803738
weighted avg0.45180.44620.43263738

Pour le modèle ethanyt/guwenbert-base, on a:

DynastyPrecisionRecallF1-scoreSupport
WeiJin0.76260.83760.7984234
NanBei0.79530.64130.7100315
Tang0.56860.55460.5615568
Song0.41630.22870.2952446
Yuan0.40600.68770.5106823
Ming0.38530.43610.4091782
Qing0.77180.20180.3199570
accuracy0.49143738
macro avg0.58660.51250.51503738
weighted avg0.53850.49140.47713738

En représentant le rappel (Recall) de chaque dynastie — c'est-à-dire le taux de bonne prédiction pour les poèmes de chaque dynastie — sous forme de graphique, des résultats obtenus sont intéressants :

Le modèle ethanyt/guwenbert-base, spécialisé en chinois classique, affiche globalement les meilleures performances avec une exactitude (accuracy) de 0.4914 et un F1-score macro moyen de 0.5150. Il est suivi par bert-case-chinese (exactitude 0.4462, F1-macro 0.4580) puis distilled-bert-multilingual (exactitude 0.4248, F1-macro 0.4369).

Les poèmes de la dynastie WeiJin possèdent probablement des caractéristiques linguistiques ou stylistiques très distinctives qui les rendent plus faciles à identifier pour les modèles.

La difficulté à classifier correctement les poèmes de la dynastie Song pourrait indiquer que leurs traits stylistiques sont moins uniques, ou qu'ils partagent plus de similitudes avec les poèmes des dynasties adjacentes (Tang, Yuan, Ming), rendant la distinction plus complexe même pour un modèle spécialisé.

La performance plus faible du modèle ethanyt/guwenbert-base sur la poésie Qing pourrait suggérer que les caractéristiques sur lesquelles ce modèle a été finement ajusté (spécifiques au chinois "classique" plus ancien) sont moins prédominantes ou discriminantes pour la poésie Qing, ou que la poésie Qing présente une plus grande hétérogénéité stylistique non capturée efficacement.

Norme

Le code de ce projet a été révisé avec pycodestyle pour assurer sa conformité au PEP 8.

IvanMiao/Outils-de-Traitement-de-Corpus

Diversa tempora, diversa poesis.

Python

0

23 commits

updated May 27, 2025

See the code

README

詩分唐宋: Classification poème-dynastie

中文 English

Ce projet s'inscrit dans le cadre du cours "Outils de Traitement de Corpus" du Master 1 Plurital.

Le dataset et le modèle sont tous les deux disponibles sur 🤗Hugging Face : Dataset, Model

Gestion de l'environnement

Ce projet utilise uv pour la gestion de l'environnement.

Pour exécuter les scripts (assurez-vous d'avoir installé uv):

uv run chemin/vers/le/script.py

Objectif du projet

L'objectif de ce projet est d'effectuer une classification textuelle sur un corpus de poèmes chinois classiques (à l'exclusion des formes ci(词) et qu(曲)). Le but est de prédire la dynastie (par ordre chronologique : WeiJin 魏晋, NanBei 南北朝, Tang 唐, Song 宋, Yuan 元, Ming 明, Qing 清) à laquelle un poème donné appartient.

Bien que les formes de la poésie chinoise classique soient restées relativement stables après la dynastie Tang, ce projet s'inspire de deux observations principales :

  1. Linguistique : Les caractéristiques linguistiques et l'usage des mots présentent des variations distinctes d'une dynastie à l'autre.

  2. Stylistique et théorie littéraire : En stylistique et selon la théorie littéraire chinoise ancienne, la poésie de chaque dynastie possède un style distinctif, souvent décrit comme un "zeitgeist".

Données

Les données du projet proviennent du site sou-yun.cn, qui n'interdit pas l'extraction de données.

Ce site a déjà classifié les poèmes par dynastie et fournit un index de tous les poèmes par auteur. Par conséquent, le projet utilise request et bs4 pour analyser la structure HTML du site et extraire les données poétiques des sept dynasties sélectionnées. Pour des raisons d'efficacité lors de l'entraînement, le script d'extraction récupère les 20 premiers poèmes de chaque poète (ou le maximum disponible si inférieur à 20) pour les dynasties comptant moins de 1000 poètes, et seulement les 20 premiers poèmes des 1000 premiers poètes pour les dynasties plus prolifiques.

Les données obtenues sont sauvegardées en format .csv, puis fusionnées en un seul grand ensemble de données qui est ensuite mélangé et divisé en trois sous-ensembles : entraînement/validation/test (selon un ratio 7 : 1.5 : 1.5, avec une répartition réelle des données de 17418 : 3733 : 3738). Ces ensembles sont stockés au format dataset de HuggingFace.

Ensemble de donnéesRatioQuantité réelle
Entraînement717 418
Validation1,53 733
Test1,53 738
Total1024 889

La visualisation des données est présentée ci-dessous :

Les deux premières dynasties (Weijin et Nanbei) présentent le plus petit nombre de poèmes, ce qui est logique car ce sont les dynasties les plus anciennes et donc celles dont le moins d'œuvres ont été conservées. La dynastie Weijin montre la longueur moyenne de poèmes la plus élevée, car dans notre corpus, les fu 赋 sont également considérés comme des poèmes. Durant cette période, la création de poèmes en quatre mots et de fu était proportionnellement plus fréquente que dans les six autres dynasties. Ces dernières, particulièrement après la dynastie Tang, privilégiaient les formes poétiques jueju 绝句 (24 ou 32 caractères, ponctuation incluse) et lüshi 律诗 (48 ou 64 caractères). Considérant que les poèmes de style ancien et les "fu" étaient occasionnellement créés et qu'ils sont beaucoup plus longs que les "jueju" et les "lüshi", la longueur moyenne obtenue (60-80 caractères) paraît raisonnable.

Entraînement

Ce projet utilise la HuggingFace Text Classification comme référence pour effectuer le fine-tuning des modèles de classification textuelle.

Le jeu de données a été entraîné sur trois modèles pré-entraînés de type BERT :

  1. distilled-bert-multilingual: un modèle BERT multilingue distillé, permettant un entraînement rapide
  2. bert-case-chinese: un modèle BERT pour le chinois
  3. ethanyt/guwenbert-base: un modèle basé sur bert-case-chinese ayant déjà été fine-tuné sur un grand corpus de textes chinois classiques

Le nombre d'époques (epoch) du premier modèle est fixé à 3. Afin de réduire le temps d'entraînement, il est fixé à 2 pour les deux autres modèles plus grands. Les autres paramètres restent inchangés.

En analysant les journaux de logs durant l'entraînement, on a obtenu l'évolution de la perte (Loss) par époque (Epoch) et les performances de chaque modèle sur l'ensemble de validation :

On peut observer que la tendance des pertes (loss) des trois modèles est globalement similaire, et que bert-case-chinese et ethanyt/guwenbert-base présentent presque une évolution parallèle — ce qui peut s'expliquer par le fait que le second a été fine-tuné à partir du premier. Un autre fait intéressant est que, pour distillBERT, la perte de validation augmente après la deuxième époque ; cependant, par manque de temps et de ressources, il n’a pas été possible d’observer ce phénomène sur les deux autres modèles plus grands.

Évaluation

Après l'entraînement des trois modèles, une évaluation a été effectué sur le sous-ensemble de test. La classe classification_report de sklearn est utilisé pour obtenir une évaluation plus détaillée des tâches de classification.

Pour le modèle distilled-bert-multilingual, on a:

DynastyPrecisionRecallF1-scoreSupport
WeiJin0.56270.82480.6690234
NanBei0.59860.53970.5676315
Tang0.49530.36800.4222568
Song0.35530.12110.1806446
Yuan0.41400.51150.4576823
Ming0.33890.36320.3506782
Qing0.37680.45090.4105570
accuracy0.42483738
macro avg0.44880.45420.43693738
weighted avg0.42280.42480.41213738

Pour le modèle bert-case-chinese, on a:

DynastyPrecisionRecallF1-scoreSupport
WeiJin0.65650.73500.6935234
NanBei0.59940.60320.6013315
Tang0.41100.58980.4845568
Song0.31030.14130.1941446
Yuan0.41830.53220.4684823
Ming0.37890.40030.3893782
Qing0.58580.27540.3747570
accuracy0.44623738
macro avg0.48000.46820.45803738
weighted avg0.45180.44620.43263738

Pour le modèle ethanyt/guwenbert-base, on a:

DynastyPrecisionRecallF1-scoreSupport
WeiJin0.76260.83760.7984234
NanBei0.79530.64130.7100315
Tang0.56860.55460.5615568
Song0.41630.22870.2952446
Yuan0.40600.68770.5106823
Ming0.38530.43610.4091782
Qing0.77180.20180.3199570
accuracy0.49143738
macro avg0.58660.51250.51503738
weighted avg0.53850.49140.47713738

En représentant le rappel (Recall) de chaque dynastie — c'est-à-dire le taux de bonne prédiction pour les poèmes de chaque dynastie — sous forme de graphique, des résultats obtenus sont intéressants :

Le modèle ethanyt/guwenbert-base, spécialisé en chinois classique, affiche globalement les meilleures performances avec une exactitude (accuracy) de 0.4914 et un F1-score macro moyen de 0.5150. Il est suivi par bert-case-chinese (exactitude 0.4462, F1-macro 0.4580) puis distilled-bert-multilingual (exactitude 0.4248, F1-macro 0.4369).

Les poèmes de la dynastie WeiJin possèdent probablement des caractéristiques linguistiques ou stylistiques très distinctives qui les rendent plus faciles à identifier pour les modèles.

La difficulté à classifier correctement les poèmes de la dynastie Song pourrait indiquer que leurs traits stylistiques sont moins uniques, ou qu'ils partagent plus de similitudes avec les poèmes des dynasties adjacentes (Tang, Yuan, Ming), rendant la distinction plus complexe même pour un modèle spécialisé.

La performance plus faible du modèle ethanyt/guwenbert-base sur la poésie Qing pourrait suggérer que les caractéristiques sur lesquelles ce modèle a été finement ajusté (spécifiques au chinois "classique" plus ancien) sont moins prédominantes ou discriminantes pour la poésie Qing, ou que la poésie Qing présente une plus grande hétérogénéité stylistique non capturée efficacement.

Norme

Le code de ce projet a été révisé avec pycodestyle pour assurer sa conformité au PEP 8.