📝 : update README.md
This commit is contained in:
@@ -342,6 +342,89 @@ Il est possible de classer des textes par période en se basant uniquement sur l
|
|||||||
|
|
||||||
Je ne suis pas allé plus loin sur la classification, j'aurais aimé approfondir. En passant par exemple par une étape de recherche de la durée de période optimale via clusters.
|
Je ne suis pas allé plus loin sur la classification, j'aurais aimé approfondir. En passant par exemple par une étape de recherche de la durée de période optimale via clusters.
|
||||||
|
|
||||||
|
|
||||||
# Traduction d'un texte d'une époque en une autre
|
# Traduction d'un texte d'une époque en une autre
|
||||||
|
|
||||||
|
Pour cette partie, je n'ai pas entraîné de modèle, mais j'ai utilisé un LLM pré-entrainé.
|
||||||
|
|
||||||
|
J'ai utilisé le modèle Mistral-7B-Instruct [voir sur HuggingFace](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.3).
|
||||||
|
|
||||||
|
J'ai donné un prompt au modèle en lui donnant le rôle d'un expert en littérature française. Je lui fournis le texte, l'époque de départ et l'époque cible, en lui demandant de ne modifier que le style (vocabulaire, grammaire, syntaxe) tout en préservant le sens.
|
||||||
|
|
||||||
|
```py
|
||||||
|
def traduire_style_epoque(texte_original: str, epoque_originale: str, epoque_cible: str) -> str:
|
||||||
|
|
||||||
|
# Un "prompt" système pour guider le modèle.
|
||||||
|
# Le format [INST]...[/INST] est spécifique à Mistral Instruct.
|
||||||
|
prompt = f"""[INST] Tu es un expert en histoire de la littérature française et un écrivain.
|
||||||
|
Ta tâche est de réécrire le texte suivant, qui a été écrit dans le style de l'époque "{epoque_originale}", pour qu'il corresponde parfaitement au style (vocabulaire, grammaire, syntaxe) de l'époque "{epoque_cible}".
|
||||||
|
Le sens, les idées et le contenu du texte original doivent être préservés au maximum. Ne fais que modifier le style.
|
||||||
|
|
||||||
|
TEXTE ORIGINAL ({epoque_originale}):
|
||||||
|
{texte_original}
|
||||||
|
|
||||||
|
RÉÉCRITURE ({epoque_cible}):
|
||||||
|
[/INST]"""
|
||||||
|
|
||||||
|
reponse = llm(
|
||||||
|
prompt,
|
||||||
|
temperature=0.7,
|
||||||
|
max_new_tokens=1024,
|
||||||
|
top_k=40
|
||||||
|
)
|
||||||
|
|
||||||
|
return reponse
|
||||||
|
```
|
||||||
|
|
||||||
|
J'ai effectué deux tests pour voir le comportement du modèle :
|
||||||
|
|
||||||
|
**Test 1 : Moderne (2024) vers Ancien (1670)**
|
||||||
|
|
||||||
|
J'ai donné au modèle un texte très moderne et informel :
|
||||||
|
|
||||||
|
```txt
|
||||||
|
Original (2024) : "Salut les gars, J'ai checké le nouveau projet sur le drive, c'est vraiment un truc de ouf. Mon boss m'a dit que le client est super content et que le lancement est prévu pour ce week-end. On va pouvoir décompresser, c'est trop cool."
|
||||||
|
```
|
||||||
|
|
||||||
|
```txt
|
||||||
|
Traduction (1670) : "Salut mes amis,
|
||||||
|
J'ai vérifié le dernier projet sur mon bureau à la nuit, et je suis très content que cela soit bien arrivé.
|
||||||
|
Mon patron m'a informé que le client est extrêmement satisfait et que le lancement est prévu pour ce weekend.
|
||||||
|
On peut décomprimer, c'est trop magnifique."
|
||||||
|
```
|
||||||
|
|
||||||
|
Le modèle a bien compris la tâche et a tenté de "traduire" les concepts :
|
||||||
|
|
||||||
|
* "Salut les gars" -> "Salut mes amis"
|
||||||
|
* "truc de ouf" -> "bien arrivé" (ici, il a un peu extrapolé)
|
||||||
|
* "Mon boss" -> "Mon patron"
|
||||||
|
* "super content" -> "extrêmement satisfait"
|
||||||
|
|
||||||
|
Il a produit un hybride stylistique, avec des tournures correctes ("m'a informé que...") mais aussi des expressions étranges comme "sur mon bureau à la nuit" ou "c'est trop magnifique", qui mélange le "trop" moderne avec un vocabulaire plus ancien.
|
||||||
|
|
||||||
|
**Test 2 : Ancien (1720) vers Moderne (2024)**
|
||||||
|
|
||||||
|
J'ai ensuite tenté l'exercice inverse, avec un texte très formel du 18ème siècle, en demandant une traduction en "email professionnel de 2024".
|
||||||
|
|
||||||
|
```txt
|
||||||
|
Original (1720) : "Monseigneur, Je me fais l'honneur de vous adresser la présente missive afin de requérir votre bienveillance. Les affaires de votre domaine prospèrent, mais la météo capricieuse menace les récoltes. Je crains fort que la disette ne frappe nos manants si le ciel ne nous est point plus clément. Votre très humble et dévoué serviteur."
|
||||||
|
```
|
||||||
|
|
||||||
|
Le résultat a été très surprenant, le modèle a parfaitement adopté le style d'un email professionnel... mais en anglais.
|
||||||
|
|
||||||
|
```txt
|
||||||
|
Traduction (2024) : "Dear Sir,
|
||||||
|
|
||||||
|
I trust this message finds you well and in good spirits. I am reaching out to kindly request your assistance with a matter of utmost concern for our community.
|
||||||
|
|
||||||
|
As you are aware, the agricultural sector has been thriving under your leadership. However, recent weather conditions have posed an unprecedented challenge - excessive rainfall followed by sudden droughts have disrupted crop growth and yield. This unpredictable climate jeopardizes not only the livelihoods of our farmers but also food security for future generations.
|
||||||
|
|
||||||
|
I urge you to consider taking proactive measures to mitigate the impact of these extreme weather events on agricultural productivity. It would be greatly appreciated if we could discuss potential solutions at your earliest convenience.
|
||||||
|
|
||||||
|
Thank you in advance for considering this matter and for your continued commitment towards the welfare of our region.
|
||||||
|
|
||||||
|
Best regards,
|
||||||
|
[Your Name]"
|
||||||
|
```
|
||||||
|
|
||||||
|
Cette courte exploration montre que la "traduction" stylistique est possible, elle est complexe et nécessiterait un fine-tuning plus poussé pour être fiable.
|
||||||
+11
-42
@@ -12,7 +12,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 2,
|
"execution_count": null,
|
||||||
"id": "4696d130",
|
"id": "4696d130",
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [
|
"outputs": [
|
||||||
@@ -38,21 +38,15 @@
|
|||||||
"from ctransformers import AutoModelForCausalLM\n",
|
"from ctransformers import AutoModelForCausalLM\n",
|
||||||
"from huggingface_hub import hf_hub_download\n",
|
"from huggingface_hub import hf_hub_download\n",
|
||||||
"\n",
|
"\n",
|
||||||
"# Définition du modèle à utiliser\n",
|
|
||||||
"# On choisit un modèle Mistral 7B Instruct, quantifié en 4-bit (Q4_K_M)\n",
|
|
||||||
"# C'est un bon équilibre performance / taille pour une utilisation CPU\n",
|
|
||||||
"model_repo = \"TheBloke/Mistral-7B-Instruct-v0.1-GGUF\"\n",
|
"model_repo = \"TheBloke/Mistral-7B-Instruct-v0.1-GGUF\"\n",
|
||||||
"model_file = \"mistral-7b-instruct-v0.1.Q4_K_M.gguf\"\n",
|
"model_file = \"mistral-7b-instruct-v0.1.Q4_K_M.gguf\"\n",
|
||||||
"\n",
|
"\n",
|
||||||
"# Télécharger le modèle (si pas déjà présent)\n",
|
"model_path = hf_hub_download(repo_id=model_repo, filename=model_file)"
|
||||||
"print(f\"Téléchargement du modèle: {model_file}...\")\n",
|
|
||||||
"model_path = hf_hub_download(repo_id=model_repo, filename=model_file)\n",
|
|
||||||
"print(f\"Modèle téléchargé dans: {model_path}\")"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 3,
|
"execution_count": null,
|
||||||
"id": "6da8586d",
|
"id": "6da8586d",
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [
|
"outputs": [
|
||||||
@@ -66,32 +60,22 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"source": [
|
"source": [
|
||||||
"# Configuration et chargement du modèle\n",
|
|
||||||
"print(\"Chargement du modèle sur le CPU (cela peut prendre un moment)...\")\n",
|
|
||||||
"\n",
|
|
||||||
"# Configuration pour CTransformers\n",
|
|
||||||
"# gpu_layers=0 signifie qu'aucune couche n'est déchargée sur le GPU (utilisation CPU pure)\n",
|
|
||||||
"llm = AutoModelForCausalLM.from_pretrained(\n",
|
"llm = AutoModelForCausalLM.from_pretrained(\n",
|
||||||
" model_path,\n",
|
" model_path,\n",
|
||||||
" model_type=\"mistral\",\n",
|
" model_type=\"mistral\",\n",
|
||||||
" context_length=4096, # Longueur de contexte max (texte + réponse)\n",
|
" context_length=4096,\n",
|
||||||
" gpu_layers=0 # <-- TRÈS IMPORTANT: Force l'utilisation du CPU\n",
|
" gpu_layers=0 # Force l'utilisation du CPU\n",
|
||||||
")\n",
|
")"
|
||||||
"\n",
|
|
||||||
"print(\"Modèle chargé avec succès.\")"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 4,
|
"execution_count": null,
|
||||||
"id": "f8b27196",
|
"id": "f8b27196",
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"def traduire_style_epoque(texte_original: str, epoque_originale: str, epoque_cible: str) -> str:\n",
|
"def traduire_style_epoque(texte_original: str, epoque_originale: str, epoque_cible: str) -> str:\n",
|
||||||
" \"\"\"\n",
|
|
||||||
" Utilise le LLM pour réécrire un texte dans le style d'une autre époque.\n",
|
|
||||||
" \"\"\"\n",
|
|
||||||
" \n",
|
" \n",
|
||||||
" # Un \"prompt\" système pour guider le modèle.\n",
|
" # Un \"prompt\" système pour guider le modèle.\n",
|
||||||
" # Le format [INST]...[/INST] est spécifique à Mistral Instruct.\n",
|
" # Le format [INST]...[/INST] est spécifique à Mistral Instruct.\n",
|
||||||
@@ -105,13 +89,6 @@
|
|||||||
" RÉÉCRITURE ({epoque_cible}):\n",
|
" RÉÉCRITURE ({epoque_cible}):\n",
|
||||||
" [/INST]\"\"\"\n",
|
" [/INST]\"\"\"\n",
|
||||||
" \n",
|
" \n",
|
||||||
" print(f\"Génération de la traduction stylistique de '{epoque_originale}' vers '{epoque_cible}'...\")\n",
|
|
||||||
" print(\"--------------------------------------------------\")\n",
|
|
||||||
" \n",
|
|
||||||
" # Appel du modèle\n",
|
|
||||||
" # 'temperature' contrôle la créativité (0.7 est un bon équilibre)\n",
|
|
||||||
" # 'max_new_tokens' est la longueur max de la réponse. Augmentez si vos textes sont longs.\n",
|
|
||||||
" # ATTENTION: La génération sur CPU sera LENTE.\n",
|
|
||||||
" reponse = llm(\n",
|
" reponse = llm(\n",
|
||||||
" prompt, \n",
|
" prompt, \n",
|
||||||
" temperature=0.7, \n",
|
" temperature=0.7, \n",
|
||||||
@@ -124,7 +101,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 5,
|
"execution_count": null,
|
||||||
"id": "3120a8cc",
|
"id": "3120a8cc",
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [
|
"outputs": [
|
||||||
@@ -152,7 +129,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"source": [
|
"source": [
|
||||||
"# --- Exemple 1 : Moderne vers Ancien ---\n",
|
"# Moderne vers Ancien ---\n",
|
||||||
"\n",
|
"\n",
|
||||||
"texte_moderne = \"\"\"\n",
|
"texte_moderne = \"\"\"\n",
|
||||||
"Salut les gars,\n",
|
"Salut les gars,\n",
|
||||||
@@ -163,19 +140,15 @@
|
|||||||
"epoque_source_1 = \"2024\"\n",
|
"epoque_source_1 = \"2024\"\n",
|
||||||
"epoque_cible_1 = \"1670 (style Molière ou La Fontaine)\"\n",
|
"epoque_cible_1 = \"1670 (style Molière ou La Fontaine)\"\n",
|
||||||
"\n",
|
"\n",
|
||||||
"# Lancement de la génération\n",
|
|
||||||
"texte_traduit_1 = traduire_style_epoque(texte_moderne, epoque_source_1, epoque_cible_1)\n",
|
"texte_traduit_1 = traduire_style_epoque(texte_moderne, epoque_source_1, epoque_cible_1)\n",
|
||||||
"\n",
|
"\n",
|
||||||
"# Affichage\n",
|
|
||||||
"print(\"\\n--- TEXTE ORIGINAL (\" + epoque_source_1 + \") ---\")\n",
|
|
||||||
"print(texte_moderne)\n",
|
|
||||||
"print(\"\\n--- TEXTE TRADUIT (\" + epoque_cible_1 + \") ---\")\n",
|
"print(\"\\n--- TEXTE TRADUIT (\" + epoque_cible_1 + \") ---\")\n",
|
||||||
"print(texte_traduit_1)"
|
"print(texte_traduit_1)"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 6,
|
"execution_count": null,
|
||||||
"id": "a745126d",
|
"id": "a745126d",
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [
|
"outputs": [
|
||||||
@@ -214,7 +187,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"source": [
|
"source": [
|
||||||
"# --- Exemple 2 : Ancien vers Moderne ---\n",
|
"# Ancien vers Moderne ---\n",
|
||||||
"\n",
|
"\n",
|
||||||
"texte_ancien = \"\"\"\n",
|
"texte_ancien = \"\"\"\n",
|
||||||
"Monseigneur,\n",
|
"Monseigneur,\n",
|
||||||
@@ -226,12 +199,8 @@
|
|||||||
"epoque_source_2 = \"1720\"\n",
|
"epoque_source_2 = \"1720\"\n",
|
||||||
"epoque_cible_2 = \"2024 (style email professionnel)\"\n",
|
"epoque_cible_2 = \"2024 (style email professionnel)\"\n",
|
||||||
"\n",
|
"\n",
|
||||||
"# Lancement de la génération\n",
|
|
||||||
"texte_traduit_2 = traduire_style_epoque(texte_ancien, epoque_source_2, epoque_cible_2)\n",
|
"texte_traduit_2 = traduire_style_epoque(texte_ancien, epoque_source_2, epoque_cible_2)\n",
|
||||||
"\n",
|
"\n",
|
||||||
"# Affichage\n",
|
|
||||||
"print(\"\\n--- TEXTE ORIGINAL (\" + epoque_source_2 + \") ---\")\n",
|
|
||||||
"print(texte_ancien)\n",
|
|
||||||
"print(\"\\n--- TEXTE TRADUIT (\" + epoque_cible_2 + \") ---\")\n",
|
"print(\"\\n--- TEXTE TRADUIT (\" + epoque_cible_2 + \") ---\")\n",
|
||||||
"print(texte_traduit_2)"
|
"print(texte_traduit_2)"
|
||||||
]
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user