confluent/ConfluentTranslator/tests/unit/debug-lemmatization.js
StillHammer 4b0f916d1c Restructuration complète du projet ConfluentTranslator
- Nouvelle architecture modulaire avec src/api, src/core, src/utils
- Séparation claire docs/ (admin, changelog, dev, security) et tests/ (unit, integration, scripts)
- server.js devient un simple point d'entrée
- Ajout de STRUCTURE.md documentant l'architecture
- Archivage ancien-confluent/ avec générateur de lexique complet

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-02 23:28:12 +08:00

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');