Nouvelles fonctionnalités: - Endpoint /api/translate/conf2fr/llm avec raffinement LLM - Prompt cf2fr-refinement.txt expliquant structure Confluent - Test test-llm-refinement.bat pour validation Améliorations lexique: - Ajout lexique 23-nourriture.json (vocabulaire alimentaire) - Ajout lexique 24-habitat.json (habitat et construction) - Correction "generation" → noviuaita (nouvelles générations) - Ajout "cuisiner" → mukunekas (composition muk-u-nekas) - Fix Ariaska → Aliaska dans prompts Tests et outils: - Tests de coverage et reverse translation - Convertisseur de nombres - Debug lemmatisation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
110 lines
3.4 KiB
JavaScript
110 lines
3.4 KiB
JavaScript
/**
|
|
* DEBUG COMPLET - PROBLÈME DE LEMMATISATION
|
|
*
|
|
* Objectif: Comprendre EXACTEMENT où le traitement casse les mots accentués
|
|
*/
|
|
|
|
const { tokenizeFrench } = require('./contextAnalyzer');
|
|
|
|
console.log('\n' + '='.repeat(70));
|
|
console.log('DEBUG COMPLET - LEMMATISATION ACCENTS');
|
|
console.log('='.repeat(70) + '\n');
|
|
|
|
// Cas problématiques reportés
|
|
const problemes = [
|
|
'mémoire', // → m + moire
|
|
'échos', // → chos
|
|
'légume', // → l + gume
|
|
'épice', // → pice
|
|
'lumière', // → lumi + re
|
|
'fenêtre', // → fen + tre
|
|
];
|
|
|
|
console.log('1. TEST TOKENIZATION ACTUELLE:\n');
|
|
problemes.forEach(mot => {
|
|
const tokens = tokenizeFrench(mot);
|
|
const status = tokens.length === 1 && tokens[0].length > 2 ? '✅' : '❌';
|
|
console.log(` ${status} "${mot}" → [${tokens.map(t => `"${t}"`).join(', ')}]`);
|
|
});
|
|
|
|
console.log('\n' + '-'.repeat(70));
|
|
console.log('2. ANALYSE ÉTAPE PAR ÉTAPE:\n');
|
|
|
|
function analyzeStep(mot) {
|
|
console.log(`\n Mot: "${mot}"`);
|
|
console.log(` Code points: ${[...mot].map(c => 'U+' + c.charCodeAt(0).toString(16).toUpperCase().padStart(4, '0')).join(' ')}`);
|
|
|
|
// Étape 1: lowercase
|
|
let step1 = mot.toLowerCase();
|
|
console.log(` 1. toLowerCase: "${step1}"`);
|
|
|
|
// Étape 2: ligatures
|
|
let step2 = step1.replace(/œ/g, 'oe').replace(/æ/g, 'ae');
|
|
console.log(` 2. Ligatures: "${step2}"`);
|
|
|
|
// Étape 3: NFD normalize
|
|
let step3 = step2.normalize('NFD');
|
|
console.log(` 3. NFD: "${step3}" (length: ${step3.length})`);
|
|
console.log(` Code points: ${[...step3].map(c => 'U+' + c.charCodeAt(0).toString(16).toUpperCase().padStart(4, '0')).join(' ')}`);
|
|
|
|
// Étape 4: Retirer diacritiques
|
|
let step4 = step3.replace(/[\u0300-\u036f]/g, '');
|
|
console.log(` 4. Sans diacritiques: "${step4}"`);
|
|
|
|
// Étape 5: Contractions (ne devrait rien faire ici)
|
|
let step5 = step4
|
|
.replace(/l[''']/g, 'le ')
|
|
.replace(/d[''']/g, 'de ')
|
|
.replace(/n[''']/g, 'ne ')
|
|
.replace(/j[''']/g, 'je ')
|
|
.replace(/m[''']/g, 'me ')
|
|
.replace(/t[''']/g, 'te ')
|
|
.replace(/s[''']/g, 'se ')
|
|
.replace(/c[''']/g, 'ce ')
|
|
.replace(/qu[''']/g, 'que ');
|
|
console.log(` 5. Après contractions: "${step5}"`);
|
|
|
|
// Étape 6: Retirer ponctuation
|
|
let step6 = step5.replace(/[^\w\s]/g, ' ');
|
|
console.log(` 6. Sans ponctuation: "${step6}"`);
|
|
|
|
// Étape 7: Split
|
|
let step7 = step6.split(/\s+/).filter(w => w.length > 0);
|
|
console.log(` 7. Tokens: [${step7.map(t => `"${t}"`).join(', ')}]`);
|
|
|
|
return step7;
|
|
}
|
|
|
|
problemes.forEach(mot => analyzeStep(mot));
|
|
|
|
console.log('\n' + '-'.repeat(70));
|
|
console.log('3. TEST AVEC CONTEXTE (apostrophes):\n');
|
|
|
|
const contextTests = [
|
|
"l'échos",
|
|
"l'épice",
|
|
"la mémoire",
|
|
"les légumes",
|
|
"la lumière",
|
|
"la fenêtre"
|
|
];
|
|
|
|
contextTests.forEach(phrase => {
|
|
const tokens = tokenizeFrench(phrase);
|
|
console.log(` "${phrase}" → [${tokens.map(t => `"${t}"`).join(', ')}]`);
|
|
});
|
|
|
|
console.log('\n' + '-'.repeat(70));
|
|
console.log('4. VÉRIFICATION REGEX \\w AVEC ACCENTS:\n');
|
|
|
|
const testW = 'é';
|
|
console.log(` Le caractère "é" matche \\w ? ${/\w/.test(testW) ? 'OUI' : 'NON'}`);
|
|
console.log(` Le caractère "é" matche [^\\w\\s] ? ${/[^\w\s]/.test(testW) ? 'OUI (sera remplacé!)' : 'NON'}`);
|
|
|
|
const testE = 'e';
|
|
console.log(` Le caractère "e" matche \\w ? ${/\w/.test(testE) ? 'OUI' : 'NON'}`);
|
|
|
|
console.log('\n' + '='.repeat(70));
|
|
console.log('FIN DEBUG');
|
|
console.log('='.repeat(70) + '\n');
|