Retrait du Proto-Confluent de l'interface + nettoyage lexique
- Interface: suppression sélecteur variante Proto/Ancien - Frontend: fixé uniquement sur Ancien Confluent - Lexique: correction doublons et consolidation - Traducteur: optimisations CF→FR et FR→CF - Scripts: ajout audit et correction doublons 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
4236232a62
commit
5ad89885fc
@ -92,28 +92,45 @@ function searchConfluent(word, reverseIndex) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 5. NOUVEAU: Décomposition morphologique
|
// 5. NOUVEAU: Décomposition morphologique récursive (N racines)
|
||||||
const decompositions = decomposeWord(lowerWord, reverseIndex);
|
const decompositions = decomposeWord(lowerWord, reverseIndex);
|
||||||
for (const decomp of decompositions) {
|
|
||||||
const part1Match = searchConfluent(decomp.part1, reverseIndex);
|
|
||||||
const part2Match = searchConfluent(decomp.part2, reverseIndex);
|
|
||||||
|
|
||||||
if (part1Match && part2Match) {
|
if (decompositions.length > 0) {
|
||||||
return {
|
const bestDecomp = decompositions[0]; // Prendre la meilleure
|
||||||
matchType: 'composition_inferred',
|
|
||||||
originalWord: word,
|
// Construire la traduction française composite pour le LLM
|
||||||
composition: `${decomp.part1}-${decomp.liaison}-${decomp.part2}`,
|
const elements = [];
|
||||||
parts: {
|
|
||||||
part1: part1Match,
|
for (let i = 0; i < bestDecomp.roots.length; i++) {
|
||||||
liaison: decomp.liaison,
|
const root = bestDecomp.roots[i];
|
||||||
liaisonMeaning: decomp.liaisonMeaning,
|
|
||||||
part2: part2Match
|
// Ajouter la traduction de la racine
|
||||||
},
|
if (root.entry && root.entry.francais) {
|
||||||
confidence: decomp.confidence * 0.7, // Pénalité pour inférence
|
elements.push(root.entry.francais);
|
||||||
francais: `${part1Match.francais} [${decomp.liaisonMeaning}] ${part2Match.francais}`,
|
} else {
|
||||||
type: 'composition'
|
elements.push(`${root.fullRoot}?`);
|
||||||
};
|
}
|
||||||
|
|
||||||
|
// Ajouter la liaison si ce n'est pas la dernière racine
|
||||||
|
if (i < bestDecomp.liaisons.length) {
|
||||||
|
const liaison = bestDecomp.liaisons[i];
|
||||||
|
elements.push(liaison.concept);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Format pour le LLM : [composition: element1 + liaison1 + element2 + ...]
|
||||||
|
const compositionText = `[composition: ${elements.join(' + ')}]`;
|
||||||
|
|
||||||
|
return {
|
||||||
|
matchType: 'composition_recursive',
|
||||||
|
originalWord: word,
|
||||||
|
decomposition: bestDecomp,
|
||||||
|
pattern: bestDecomp.pattern,
|
||||||
|
rootCount: bestDecomp.roots.length,
|
||||||
|
confidence: bestDecomp.confidence,
|
||||||
|
francais: compositionText,
|
||||||
|
type: 'composition'
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// 6. Vraiment inconnu
|
// 6. Vraiment inconnu
|
||||||
|
|||||||
@ -456,27 +456,33 @@ function analyzeContext(text, lexique, options = {}) {
|
|||||||
// 3. Trouver entrées pertinentes (avec texte normalisé pour vérifier frontières)
|
// 3. Trouver entrées pertinentes (avec texte normalisé pour vérifier frontières)
|
||||||
const searchResult = findRelevantEntries(uniqueWords, lexique, maxEntries, normalizedText);
|
const searchResult = findRelevantEntries(uniqueWords, lexique, maxEntries, normalizedText);
|
||||||
|
|
||||||
// 4. Expansion sémantique
|
// 3.5. Calculer couverture AVANT expansion (pour décider si on expand)
|
||||||
const expandedEntries = expandContext(
|
|
||||||
searchResult.entries,
|
|
||||||
lexique,
|
|
||||||
maxEntries,
|
|
||||||
expansionLevel
|
|
||||||
);
|
|
||||||
|
|
||||||
// 5. Fallback si trop de mots manquants (>80% de mots non trouvés)
|
|
||||||
const wordsFoundCount = searchResult.wordsFound.length;
|
const wordsFoundCount = searchResult.wordsFound.length;
|
||||||
const wordsNotFoundCount = searchResult.wordsNotFound.length;
|
const wordsNotFoundCount = searchResult.wordsNotFound.length;
|
||||||
const totalWords = wordsFoundCount + wordsNotFoundCount;
|
const totalWords = wordsFoundCount + wordsNotFoundCount;
|
||||||
const coveragePercent = totalWords > 0 ? (wordsFoundCount / totalWords) * 100 : 0;
|
const coveragePercent = totalWords > 0 ? (wordsFoundCount / totalWords) * 100 : 0;
|
||||||
|
|
||||||
|
// 4. Expansion sémantique SEULEMENT si couverture < 100%
|
||||||
|
// Si 100% trouvé, pas besoin d'ajouter des synonymes
|
||||||
|
const shouldExpand = coveragePercent < 100;
|
||||||
|
const expandedEntries = shouldExpand ? expandContext(
|
||||||
|
searchResult.entries,
|
||||||
|
lexique,
|
||||||
|
maxEntries,
|
||||||
|
expansionLevel
|
||||||
|
) : searchResult.entries;
|
||||||
|
|
||||||
|
// 5. Fallback si trop de mots manquants (>80% de mots non trouvés)
|
||||||
|
|
||||||
// Activer fallback si :
|
// Activer fallback si :
|
||||||
// - Aucune entrée trouvée OU
|
// - Aucune entrée trouvée OU
|
||||||
// - Couverture < 20% (très peu de mots trouvés)
|
// - Couverture < 20% (très peu de mots trouvés)
|
||||||
const useFallback = expandedEntries.length === 0 || coveragePercent < 20;
|
const useFallback = expandedEntries.length === 0 || coveragePercent < 20;
|
||||||
|
|
||||||
// TOUJOURS extraire les racines (nécessaires pour composition de mots manquants)
|
// Activer mode racines seulement si couverture < 100%
|
||||||
const rootsFallback = extractRoots(lexique);
|
// (Si 100% trouvé, pas besoin des racines pour composer de nouveaux mots)
|
||||||
|
const needRoots = coveragePercent < 100;
|
||||||
|
const rootsFallback = needRoots ? extractRoots(lexique) : [];
|
||||||
|
|
||||||
// 6. Calculer tokens économisés (estimation)
|
// 6. Calculer tokens économisés (estimation)
|
||||||
const totalLexiqueEntries = Object.keys(lexique.dictionnaire || {}).length;
|
const totalLexiqueEntries = Object.keys(lexique.dictionnaire || {}).length;
|
||||||
@ -490,7 +496,7 @@ function analyzeContext(text, lexique, options = {}) {
|
|||||||
return {
|
return {
|
||||||
// Données pour le prompt
|
// Données pour le prompt
|
||||||
entries: useFallback ? [] : expandedEntries,
|
entries: useFallback ? [] : expandedEntries,
|
||||||
rootsFallback: rootsFallback, // TOUJOURS inclure les racines
|
rootsFallback: rootsFallback, // Inclure racines seulement si couverture < 100%
|
||||||
useFallback,
|
useFallback,
|
||||||
|
|
||||||
// Métadonnées pour Layer 2
|
// Métadonnées pour Layer 2
|
||||||
|
|||||||
@ -38,43 +38,80 @@ console.log(`[morphologicalDecomposer] Chargé ${Object.keys(SACRED_LIAISONS).le
|
|||||||
// VALIDATION DES RACINES
|
// VALIDATION DES RACINES
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cherche une racine en tenant compte de la forme liée (CVC/VC au lieu de CVCV/VCV)
|
||||||
|
* @param {string} part - Partie tronquée (forme liée)
|
||||||
|
* @param {Object} reverseIndex - Index de recherche
|
||||||
|
* @param {boolean} isLastRoot - Si c'est la dernière racine (pas de troncature)
|
||||||
|
* @returns {{found: boolean, fullRoot: string|null, entry: Object|null, confidence: number}}
|
||||||
|
*/
|
||||||
|
function findRootWithFormeLiee(part, reverseIndex, isLastRoot = false) {
|
||||||
|
if (!reverseIndex || !reverseIndex.byWord) {
|
||||||
|
return { found: false, fullRoot: null, entry: null, confidence: 0 };
|
||||||
|
}
|
||||||
|
|
||||||
|
// Si c'est la dernière racine, chercher directement
|
||||||
|
if (isLastRoot) {
|
||||||
|
if (reverseIndex.byWord[part]) {
|
||||||
|
return {
|
||||||
|
found: true,
|
||||||
|
fullRoot: part,
|
||||||
|
entry: reverseIndex.byWord[part],
|
||||||
|
confidence: 1.0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return { found: false, fullRoot: null, entry: null, confidence: 0 };
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sinon, c'est une racine intermédiaire (forme liée = sans voyelle finale)
|
||||||
|
// Essayer d'ajouter chaque voyelle possible
|
||||||
|
const vowels = ['a', 'e', 'i', 'o', 'u'];
|
||||||
|
|
||||||
|
for (const vowel of vowels) {
|
||||||
|
const fullRoot = part + vowel;
|
||||||
|
if (reverseIndex.byWord[fullRoot]) {
|
||||||
|
return {
|
||||||
|
found: true,
|
||||||
|
fullRoot,
|
||||||
|
entry: reverseIndex.byWord[fullRoot],
|
||||||
|
confidence: 0.95
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pas trouvé avec forme liée
|
||||||
|
return { found: false, fullRoot: null, entry: null, confidence: 0 };
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Vérifie si une partie ressemble à une racine valide du Confluent
|
* Vérifie si une partie ressemble à une racine valide du Confluent
|
||||||
* @param {string} part - Partie à valider
|
* @param {string} part - Partie à valider
|
||||||
* @param {Object} reverseIndex - Index de recherche (optionnel)
|
* @param {Object} reverseIndex - Index de recherche (optionnel)
|
||||||
* @returns {{isValid: boolean, found: boolean, confidence: number}}
|
* @param {boolean} isLastRoot - Si c'est la dernière racine
|
||||||
|
* @returns {{isValid: boolean, found: boolean, confidence: number, fullRoot: string|null, entry: Object|null}}
|
||||||
*/
|
*/
|
||||||
function validateRoot(part, reverseIndex = null) {
|
function validateRoot(part, reverseIndex = null, isLastRoot = false) {
|
||||||
// Critères de base
|
// Critères de base
|
||||||
if (part.length < 2) {
|
if (part.length < 2) {
|
||||||
return { isValid: false, found: false, confidence: 0 };
|
return { isValid: false, found: false, confidence: 0, fullRoot: null, entry: null };
|
||||||
}
|
}
|
||||||
|
|
||||||
let confidence = 0.5; // base
|
let confidence = 0.5; // base
|
||||||
let found = false;
|
let found = false;
|
||||||
|
let fullRoot = null;
|
||||||
|
let entry = null;
|
||||||
|
|
||||||
// 1. Vérifier si la partie existe dans l'index de recherche
|
// 1. Vérifier si la partie existe dans l'index de recherche (avec forme liée)
|
||||||
if (reverseIndex) {
|
if (reverseIndex) {
|
||||||
// Recherche exacte
|
const result = findRootWithFormeLiee(part, reverseIndex, isLastRoot);
|
||||||
if (reverseIndex.byWord && reverseIndex.byWord[part]) {
|
if (result.found) {
|
||||||
found = true;
|
return {
|
||||||
confidence = 1.0;
|
isValid: true,
|
||||||
return { isValid: true, found: true, confidence };
|
found: true,
|
||||||
}
|
confidence: result.confidence,
|
||||||
|
fullRoot: result.fullRoot,
|
||||||
// Recherche par forme liée (enlever dernière voyelle)
|
entry: result.entry
|
||||||
if (reverseIndex.byFormeLiee) {
|
};
|
||||||
const formeLiee = part.endsWith('a') || part.endsWith('e') ||
|
|
||||||
part.endsWith('i') || part.endsWith('o') ||
|
|
||||||
part.endsWith('u')
|
|
||||||
? part.slice(0, -1)
|
|
||||||
: part;
|
|
||||||
|
|
||||||
if (reverseIndex.byFormeLiee[formeLiee]) {
|
|
||||||
found = true;
|
|
||||||
confidence = 0.95;
|
|
||||||
return { isValid: true, found: true, confidence };
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,25 +121,40 @@ function validateRoot(part, reverseIndex = null) {
|
|||||||
const lastChar = part[part.length - 1];
|
const lastChar = part[part.length - 1];
|
||||||
const secondLastChar = part.length > 1 ? part[part.length - 2] : '';
|
const secondLastChar = part.length > 1 ? part[part.length - 2] : '';
|
||||||
|
|
||||||
// Finit par voyelle = probable racine
|
// Pour la dernière racine : doit finir par voyelle
|
||||||
if (vowels.includes(lastChar)) {
|
if (isLastRoot) {
|
||||||
confidence += 0.2;
|
if (vowels.includes(lastChar)) {
|
||||||
|
|
||||||
// Pattern CV en fin = très probable
|
|
||||||
if (secondLastChar && !vowels.includes(secondLastChar)) {
|
|
||||||
confidence += 0.2;
|
confidence += 0.2;
|
||||||
|
if (secondLastChar && !vowels.includes(secondLastChar)) {
|
||||||
|
confidence += 0.2;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Dernière racine sans voyelle = invalide
|
||||||
|
confidence = 0.2;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Pour racine intermédiaire : doit finir par consonne (forme liée)
|
||||||
|
if (!vowels.includes(lastChar)) {
|
||||||
|
confidence += 0.2;
|
||||||
|
if (secondLastChar && vowels.includes(secondLastChar)) {
|
||||||
|
confidence += 0.2; // Pattern VC ou CVC
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3. Longueur typique (3-4 caractères pour racines)
|
// 3. Longueur typique (2-4 caractères pour racines tronquées, 3-5 pour complètes)
|
||||||
if (part.length >= 3 && part.length <= 5) {
|
const minLen = isLastRoot ? 3 : 2;
|
||||||
|
const maxLen = isLastRoot ? 5 : 4;
|
||||||
|
if (part.length >= minLen && part.length <= maxLen) {
|
||||||
confidence += 0.1;
|
confidence += 0.1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
isValid: confidence >= 0.5,
|
isValid: confidence >= 0.5,
|
||||||
found: false,
|
found: false,
|
||||||
confidence: Math.min(confidence, 1.0)
|
confidence: Math.min(confidence, 1.0),
|
||||||
|
fullRoot: null,
|
||||||
|
entry: null
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,14 +163,21 @@ function validateRoot(part, reverseIndex = null) {
|
|||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Décompose un mot composé non trouvé
|
* Décompose récursivement un mot en N racines
|
||||||
* @param {string} word - Mot composé en confluent
|
* @param {string} word - Mot à décomposer
|
||||||
* @param {Object} reverseIndex - Index de recherche (optionnel, pour validation)
|
* @param {Object} reverseIndex - Index de recherche
|
||||||
* @returns {Array<{part1: string, liaison: string, liaisonMeaning: string, part2: string, pattern: string, confidence: number, part1Valid: boolean, part2Valid: boolean}>}
|
* @param {number} depth - Profondeur de récursion (pour éviter boucle infinie)
|
||||||
|
* @returns {Array<Object>} Liste de décompositions possibles
|
||||||
*/
|
*/
|
||||||
function decomposeWord(word, reverseIndex = null) {
|
function decomposeWordRecursive(word, reverseIndex, depth = 0) {
|
||||||
|
const MAX_DEPTH = 10; // Max 10 racines dans un mot
|
||||||
const decompositions = [];
|
const decompositions = [];
|
||||||
|
|
||||||
|
// Limite de profondeur
|
||||||
|
if (depth >= MAX_DEPTH || word.length < 2) {
|
||||||
|
return decompositions;
|
||||||
|
}
|
||||||
|
|
||||||
// Trier les liaisons par longueur décroissante (essayer 'aa' avant 'a')
|
// Trier les liaisons par longueur décroissante (essayer 'aa' avant 'a')
|
||||||
const liaisonsSorted = Object.keys(SACRED_LIAISONS).sort((a, b) => b.length - a.length);
|
const liaisonsSorted = Object.keys(SACRED_LIAISONS).sort((a, b) => b.length - a.length);
|
||||||
|
|
||||||
@ -128,47 +187,154 @@ function decomposeWord(word, reverseIndex = null) {
|
|||||||
|
|
||||||
// La liaison doit être au milieu du mot, pas au début ni à la fin
|
// La liaison doit être au milieu du mot, pas au début ni à la fin
|
||||||
if (index > 0 && index < word.length - liaison.length) {
|
if (index > 0 && index < word.length - liaison.length) {
|
||||||
const part1 = word.substring(0, index);
|
const leftPart = word.substring(0, index);
|
||||||
const part2 = word.substring(index + liaison.length);
|
const rightPart = word.substring(index + liaison.length);
|
||||||
|
|
||||||
// Valider les deux parties
|
// Valider la partie gauche (jamais la dernière racine)
|
||||||
const part1Validation = validateRoot(part1, reverseIndex);
|
const leftValidation = validateRoot(leftPart, reverseIndex, false);
|
||||||
const part2Validation = validateRoot(part2, reverseIndex);
|
|
||||||
|
|
||||||
// Les deux parties doivent ressembler à des racines
|
if (!leftValidation.isValid) continue;
|
||||||
if (part1Validation.isValid && part2Validation.isValid) {
|
|
||||||
|
// La partie droite peut être :
|
||||||
|
// 1. Une racine simple (dernière racine)
|
||||||
|
// 2. Un mot composé à décomposer récursivement
|
||||||
|
|
||||||
|
// Essai 1 : rightPart est la dernière racine
|
||||||
|
const rightValidation = validateRoot(rightPart, reverseIndex, true);
|
||||||
|
|
||||||
|
if (rightValidation.isValid) {
|
||||||
const liaisonData = SACRED_LIAISONS[liaison];
|
const liaisonData = SACRED_LIAISONS[liaison];
|
||||||
|
|
||||||
decompositions.push({
|
decompositions.push({
|
||||||
part1,
|
type: 'simple',
|
||||||
part1Found: part1Validation.found,
|
roots: [
|
||||||
part1Confidence: part1Validation.confidence,
|
{
|
||||||
liaison,
|
part: leftPart,
|
||||||
liaisonDomaine: liaisonData.domaine,
|
fullRoot: leftValidation.fullRoot || leftPart,
|
||||||
liaisonConcept: liaisonData.concept,
|
found: leftValidation.found,
|
||||||
liaisonDescription: liaisonData.description,
|
confidence: leftValidation.confidence,
|
||||||
part2,
|
entry: leftValidation.entry,
|
||||||
part2Found: part2Validation.found,
|
isLast: false
|
||||||
part2Confidence: part2Validation.confidence,
|
},
|
||||||
pattern: `${part1}-${liaison}-${part2}`,
|
{
|
||||||
confidence: calculateConfidence(
|
part: rightPart,
|
||||||
part1,
|
fullRoot: rightValidation.fullRoot || rightPart,
|
||||||
|
found: rightValidation.found,
|
||||||
|
confidence: rightValidation.confidence,
|
||||||
|
entry: rightValidation.entry,
|
||||||
|
isLast: true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
liaisons: [
|
||||||
|
{
|
||||||
|
liaison,
|
||||||
|
domaine: liaisonData.domaine,
|
||||||
|
concept: liaisonData.concept,
|
||||||
|
description: liaisonData.description
|
||||||
|
}
|
||||||
|
],
|
||||||
|
pattern: `${leftValidation.fullRoot || leftPart}-${liaison}-${rightValidation.fullRoot || rightPart}`,
|
||||||
|
confidence: calculateConfidenceRecursive([leftValidation, rightValidation], 1)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Essai 2 : rightPart est un mot composé
|
||||||
|
const rightDecompositions = decomposeWordRecursive(rightPart, reverseIndex, depth + 1);
|
||||||
|
|
||||||
|
for (const rightDecomp of rightDecompositions) {
|
||||||
|
const liaisonData = SACRED_LIAISONS[liaison];
|
||||||
|
|
||||||
|
// Combiner left + liaison + rightDecomp
|
||||||
|
const allRoots = [
|
||||||
|
{
|
||||||
|
part: leftPart,
|
||||||
|
fullRoot: leftValidation.fullRoot || leftPart,
|
||||||
|
found: leftValidation.found,
|
||||||
|
confidence: leftValidation.confidence,
|
||||||
|
entry: leftValidation.entry,
|
||||||
|
isLast: false
|
||||||
|
},
|
||||||
|
...rightDecomp.roots
|
||||||
|
];
|
||||||
|
|
||||||
|
const allLiaisons = [
|
||||||
|
{
|
||||||
liaison,
|
liaison,
|
||||||
part2,
|
domaine: liaisonData.domaine,
|
||||||
part1Validation,
|
concept: liaisonData.concept,
|
||||||
part2Validation
|
description: liaisonData.description
|
||||||
)
|
},
|
||||||
|
...rightDecomp.liaisons
|
||||||
|
];
|
||||||
|
|
||||||
|
const pattern = `${leftValidation.fullRoot || leftPart}-${liaison}-${rightDecomp.pattern}`;
|
||||||
|
const allValidations = [leftValidation, ...rightDecomp.roots.map(r => ({ found: r.found, confidence: r.confidence }))];
|
||||||
|
|
||||||
|
decompositions.push({
|
||||||
|
type: 'recursive',
|
||||||
|
roots: allRoots,
|
||||||
|
liaisons: allLiaisons,
|
||||||
|
pattern,
|
||||||
|
confidence: calculateConfidenceRecursive(allValidations, allLiaisons.length)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return decompositions;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Décompose un mot composé non trouvé (wrapper public)
|
||||||
|
* @param {string} word - Mot composé en confluent
|
||||||
|
* @param {Object} reverseIndex - Index de recherche (optionnel, pour validation)
|
||||||
|
* @returns {Array<Object>} Liste de décompositions possibles, triées par confiance
|
||||||
|
*/
|
||||||
|
function decomposeWord(word, reverseIndex = null) {
|
||||||
|
const decompositions = decomposeWordRecursive(word, reverseIndex, 0);
|
||||||
|
|
||||||
// Trier par confiance décroissante
|
// Trier par confiance décroissante
|
||||||
return decompositions.sort((a, b) => b.confidence - a.confidence);
|
return decompositions.sort((a, b) => b.confidence - a.confidence);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calcule la confiance d'une décomposition
|
* Calcule la confiance d'une décomposition récursive avec N racines
|
||||||
|
* @param {Array<Object>} validations - Liste des validations de racines
|
||||||
|
* @param {number} liaisonCount - Nombre de liaisons
|
||||||
|
* @returns {number} Score de confiance entre 0 et 1
|
||||||
|
*/
|
||||||
|
function calculateConfidenceRecursive(validations, liaisonCount) {
|
||||||
|
let score = 0.3; // base conservative
|
||||||
|
|
||||||
|
// Compter combien de racines sont trouvées dans le lexique
|
||||||
|
const foundCount = validations.filter(v => v.found).length;
|
||||||
|
const totalCount = validations.length;
|
||||||
|
|
||||||
|
// Score basé sur le pourcentage de racines trouvées
|
||||||
|
if (foundCount === totalCount) {
|
||||||
|
score = 0.95; // Toutes les racines trouvées = très haute confiance
|
||||||
|
} else if (foundCount >= totalCount * 0.75) {
|
||||||
|
score = 0.85; // 75%+ trouvées = haute confiance
|
||||||
|
} else if (foundCount >= totalCount * 0.5) {
|
||||||
|
score = 0.70; // 50%+ trouvées = bonne confiance
|
||||||
|
} else if (foundCount > 0) {
|
||||||
|
score = 0.55; // Au moins une trouvée = confiance moyenne
|
||||||
|
} else {
|
||||||
|
// Aucune trouvée : utiliser la moyenne des confiances heuristiques
|
||||||
|
const avgConfidence = validations.reduce((sum, v) => sum + v.confidence, 0) / totalCount;
|
||||||
|
score = avgConfidence * 0.8; // Pénalité car aucune racine confirmée
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pénalité pour longueur : plus il y a de racines, moins on est sûr
|
||||||
|
if (liaisonCount > 2) {
|
||||||
|
score *= Math.pow(0.95, liaisonCount - 2); // -5% par liaison supplémentaire
|
||||||
|
}
|
||||||
|
|
||||||
|
return Math.min(score, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calcule la confiance d'une décomposition (version legacy pour compatibilité)
|
||||||
* @param {string} part1 - Première partie (racine)
|
* @param {string} part1 - Première partie (racine)
|
||||||
* @param {string} liaison - Liaison sacrée
|
* @param {string} liaison - Liaison sacrée
|
||||||
* @param {string} part2 - Deuxième partie (racine)
|
* @param {string} part2 - Deuxième partie (racine)
|
||||||
@ -177,34 +343,13 @@ function decomposeWord(word, reverseIndex = null) {
|
|||||||
* @returns {number} Score de confiance entre 0 et 1
|
* @returns {number} Score de confiance entre 0 et 1
|
||||||
*/
|
*/
|
||||||
function calculateConfidence(part1, liaison, part2, part1Validation, part2Validation) {
|
function calculateConfidence(part1, liaison, part2, part1Validation, part2Validation) {
|
||||||
let score = 0.3; // base plus conservative
|
return calculateConfidenceRecursive([part1Validation, part2Validation], 1);
|
||||||
|
|
||||||
// BONUS MAJEUR : Si les deux parties sont trouvées dans le lexique
|
|
||||||
if (part1Validation.found && part2Validation.found) {
|
|
||||||
score = 0.95; // Très haute confiance !
|
|
||||||
} else if (part1Validation.found || part2Validation.found) {
|
|
||||||
score = 0.75; // Une partie trouvée = bonne confiance
|
|
||||||
} else {
|
|
||||||
// Utiliser la confiance des validations heuristiques
|
|
||||||
score = (part1Validation.confidence + part2Validation.confidence) / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bonus si liaison courante (i, u, a sont plus fréquentes)
|
|
||||||
if (['i', 'u', 'a'].includes(liaison)) {
|
|
||||||
score += 0.05;
|
|
||||||
} else if (['aa', 'ii'].includes(liaison)) {
|
|
||||||
score += 0.03;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bonus si longueurs de parties équilibrées
|
|
||||||
const ratio = Math.min(part1.length, part2.length) / Math.max(part1.length, part2.length);
|
|
||||||
score += ratio * 0.05;
|
|
||||||
|
|
||||||
return Math.min(score, 1.0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
decomposeWord,
|
decomposeWord,
|
||||||
|
decomposeWordRecursive,
|
||||||
SACRED_LIAISONS,
|
SACRED_LIAISONS,
|
||||||
validateRoot
|
validateRoot,
|
||||||
|
findRootWithFormeLiee
|
||||||
};
|
};
|
||||||
|
|||||||
@ -60,24 +60,58 @@ On te donne une **traduction mot-à-mot brute** d'un texte confluent vers le fra
|
|||||||
1. Les particules grammaticales (va, vo, no, etc.)
|
1. Les particules grammaticales (va, vo, no, etc.)
|
||||||
2. Les traductions littérales de chaque mot
|
2. Les traductions littérales de chaque mot
|
||||||
3. Les alternatives entre parenthèses
|
3. Les alternatives entre parenthèses
|
||||||
|
4. **Les compositions décomposées** au format `[composition: racine1 + liaison + racine2 + ...]`
|
||||||
|
|
||||||
|
## Format des compositions
|
||||||
|
|
||||||
|
Quand tu vois `[composition: X + Y + Z]`, cela signifie qu'un mot composé a été décomposé automatiquement en ses racines et liaisons.
|
||||||
|
|
||||||
|
**Exemple:**
|
||||||
|
- `[composition: aurore + melange + temps]` → tu dois créer un mot français qui combine ces concepts
|
||||||
|
- Traduction possible : "crépuscule", "aube", "moment de l'aurore", etc.
|
||||||
|
|
||||||
|
- `[composition: regard + agent + libre]` → "celui qui porte le regard libre"
|
||||||
|
- Selon contexte : "observateur", "veilleur", "gardien", etc.
|
||||||
|
|
||||||
|
**Les liaisons courantes:**
|
||||||
|
- `agent` = celui/celle qui fait
|
||||||
|
- `melange` = mélange/fusion de deux concepts
|
||||||
|
- `appartenance` = de/du (possession)
|
||||||
|
- `relation` = avec/par
|
||||||
|
|
||||||
**Tu dois:**
|
**Tu dois:**
|
||||||
1. Comprendre la structure grammaticale SOV
|
1. Comprendre la structure grammaticale SOV
|
||||||
2. Identifier les particules et leur rôle
|
2. Identifier les particules et leur rôle
|
||||||
3. Reconstituer le sens en français fluide et naturel
|
3. **Recomposer les mots décomposés en français cohérent**
|
||||||
4. Respecter le contexte culturel de la Confluence
|
4. Reconstituer le sens en français fluide et naturel
|
||||||
5. Produire un texte français élégant et compréhensible
|
5. Respecter le contexte culturel de la Confluence
|
||||||
|
6. Produire un texte français élégant et compréhensible
|
||||||
|
|
||||||
**Format de sortie:**
|
**Format de sortie:**
|
||||||
Retourne UNIQUEMENT le texte français final, sans explication ni métadonnées.
|
|
||||||
|
|
||||||
**Exemple:**
|
⚠️ **CRITIQUE - TU DOIS RESPECTER CE FORMAT EXACTEMENT:**
|
||||||
|
|
||||||
|
Retourne UNIQUEMENT la phrase française finale. Rien d'autre.
|
||||||
|
- ❌ PAS de préambule ("Voici la traduction:", "Traduction:", etc.)
|
||||||
|
- ❌ PAS d'explication
|
||||||
|
- ❌ PAS de métadonnées
|
||||||
|
- ❌ PAS de balises markdown
|
||||||
|
- ❌ PAS de guillemets autour de la réponse
|
||||||
|
- ✅ JUSTE la phrase française, directement
|
||||||
|
|
||||||
|
**Exemples:**
|
||||||
|
|
||||||
**Entrée brute:**
|
**Entrée brute:**
|
||||||
"va enfants des echos vo confluence voir u"
|
"va enfants des echos vo confluence voir u"
|
||||||
|
|
||||||
**Ta sortie:**
|
**❌ MAUVAIS (trop verbeux):**
|
||||||
"Les Enfants des Échos observent la confluence."
|
"Voici la traduction : Les Enfants des Échos observent la confluence."
|
||||||
|
|
||||||
|
**❌ MAUVAIS (avec guillemets):**
|
||||||
|
"\"Les Enfants des Échos observent la confluence.\""
|
||||||
|
|
||||||
|
**✅ BON (juste la phrase):**
|
||||||
|
Les Enfants des Échos observent la confluence.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -87,3 +121,4 @@ Retourne UNIQUEMENT le texte français final, sans explication ni métadonnées.
|
|||||||
- Transforme la structure SOV en structure française naturelle (SVO)
|
- Transforme la structure SOV en structure française naturelle (SVO)
|
||||||
- Élimine les particules grammaticales confluentes (va, vo, no, etc.)
|
- Élimine les particules grammaticales confluentes (va, vo, no, etc.)
|
||||||
- Choisis la meilleure traduction parmi les alternatives proposées selon le contexte
|
- Choisis la meilleure traduction parmi les alternatives proposées selon le contexte
|
||||||
|
- **COMMENCE DIRECTEMENT PAR LA TRADUCTION, SANS INTRODUCTION**
|
||||||
|
|||||||
@ -426,6 +426,7 @@
|
|||||||
<button class="tab active" data-tab="traduction">Français → Confluent</button>
|
<button class="tab active" data-tab="traduction">Français → Confluent</button>
|
||||||
<button class="tab" data-tab="cf2fr">Confluent → Français</button>
|
<button class="tab" data-tab="cf2fr">Confluent → Français</button>
|
||||||
<button class="tab" data-tab="lexique">Lexique</button>
|
<button class="tab" data-tab="lexique">Lexique</button>
|
||||||
|
<button class="tab" data-tab="stats">📊 Stats</button>
|
||||||
<button class="tab" data-tab="settings">⚙️ Settings</button>
|
<button class="tab" data-tab="settings">⚙️ Settings</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -543,6 +544,8 @@
|
|||||||
<!-- Tab: Lexique -->
|
<!-- Tab: Lexique -->
|
||||||
<div id="tab-lexique" class="tab-content">
|
<div id="tab-lexique" class="tab-content">
|
||||||
<div class="settings-indicator" id="settings-indicator-lexique"></div>
|
<div class="settings-indicator" id="settings-indicator-lexique"></div>
|
||||||
|
|
||||||
|
<!-- Recherche -->
|
||||||
<div class="panel">
|
<div class="panel">
|
||||||
<h2>Recherche dans le lexique</h2>
|
<h2>Recherche dans le lexique</h2>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
@ -556,23 +559,89 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Tab: Stats -->
|
||||||
|
<div id="tab-stats" class="tab-content">
|
||||||
|
<div class="settings-indicator" id="settings-indicator-stats"></div>
|
||||||
|
|
||||||
|
<div class="panel">
|
||||||
|
<h2>📊 Statistiques du lexique</h2>
|
||||||
|
|
||||||
|
<h3 style="color: #4a9eff; margin-top: 20px; margin-bottom: 15px; font-size: 1.1em;">Couverture générale</h3>
|
||||||
|
<div class="stats-grid" id="stats-general">
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">-</div>
|
||||||
|
<div class="stat-label">Mots CF uniques</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">-</div>
|
||||||
|
<div class="stat-label">Entrées FR</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">-</div>
|
||||||
|
<div class="stat-label">Total traductions</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h3 style="color: #4a9eff; margin-top: 30px; margin-bottom: 15px; font-size: 1.1em;">Racines</h3>
|
||||||
|
<div class="stats-grid" id="stats-racines">
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">-</div>
|
||||||
|
<div class="stat-label">Total racines</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">-</div>
|
||||||
|
<div class="stat-label">Racines sacrées</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">-</div>
|
||||||
|
<div class="stat-label">Racines standards</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h3 style="color: #4a9eff; margin-top: 30px; margin-bottom: 15px; font-size: 1.1em;">Types de mots</h3>
|
||||||
|
<div class="stats-grid" id="stats-types">
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">-</div>
|
||||||
|
<div class="stat-label">Compositions</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">-</div>
|
||||||
|
<div class="stat-label">Verbes</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">-</div>
|
||||||
|
<div class="stat-label">Verbes irréguliers</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">-</div>
|
||||||
|
<div class="stat-label">Particules</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">-</div>
|
||||||
|
<div class="stat-label">Noms propres</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">-</div>
|
||||||
|
<div class="stat-label">Pronoms</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">-</div>
|
||||||
|
<div class="stat-label">Marqueurs</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">-</div>
|
||||||
|
<div class="stat-label">Autres</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- Tab: Settings -->
|
<!-- Tab: Settings -->
|
||||||
<div id="tab-settings" class="tab-content">
|
<div id="tab-settings" class="tab-content">
|
||||||
<div class="panel">
|
<div class="panel">
|
||||||
<h2>⚙️ Paramètres globaux</h2>
|
<h2>⚙️ Paramètres globaux</h2>
|
||||||
|
|
||||||
<div class="form-group">
|
<h2>🤖 Configuration LLM</h2>
|
||||||
<label>Niveau de langue (global)</label>
|
|
||||||
<select id="settings-target">
|
|
||||||
<option value="proto">Proto-Confluent</option>
|
|
||||||
<option value="ancien">Ancien Confluent</option>
|
|
||||||
</select>
|
|
||||||
<small style="color: #888; display: block; margin-top: 5px;">
|
|
||||||
S'applique aux traductions et recherches dans le lexique
|
|
||||||
</small>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h2 style="margin-top: 30px;">🤖 Configuration LLM</h2>
|
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
@ -652,15 +721,104 @@
|
|||||||
// Load lexique
|
// Load lexique
|
||||||
const loadLexique = async () => {
|
const loadLexique = async () => {
|
||||||
try {
|
try {
|
||||||
const settings = JSON.parse(localStorage.getItem('confluentSettings') || '{}');
|
const niveau = 'ancien';
|
||||||
const niveau = settings.target || 'ancien';
|
|
||||||
const response = await fetch(`/api/lexique/${niveau}`);
|
const response = await fetch(`/api/lexique/${niveau}`);
|
||||||
lexiqueData = await response.json();
|
lexiqueData = await response.json();
|
||||||
|
|
||||||
|
// Load stats
|
||||||
|
await loadStats(niveau);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error loading lexique:', error);
|
console.error('Error loading lexique:', error);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Load statistics
|
||||||
|
const loadStats = async (niveau) => {
|
||||||
|
try {
|
||||||
|
const response = await fetch(`/api/stats?variant=${niveau}`);
|
||||||
|
const stats = await response.json();
|
||||||
|
|
||||||
|
// Update general stats
|
||||||
|
const statsGeneral = document.getElementById('stats-general');
|
||||||
|
if (statsGeneral) {
|
||||||
|
statsGeneral.innerHTML = `
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">${stats.motsCF || 0}</div>
|
||||||
|
<div class="stat-label">Mots CF uniques</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">${stats.motsFR || 0}</div>
|
||||||
|
<div class="stat-label">Entrées FR</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">${stats.totalTraductions || 0}</div>
|
||||||
|
<div class="stat-label">Total traductions</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update racines stats
|
||||||
|
const statsRacines = document.getElementById('stats-racines');
|
||||||
|
if (statsRacines) {
|
||||||
|
statsRacines.innerHTML = `
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">${stats.racines || 0}</div>
|
||||||
|
<div class="stat-label">Total racines</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">${stats.racinesSacrees || 0}</div>
|
||||||
|
<div class="stat-label">Racines sacrées</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">${stats.racinesStandards || 0}</div>
|
||||||
|
<div class="stat-label">Racines standards</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update types stats
|
||||||
|
const statsTypes = document.getElementById('stats-types');
|
||||||
|
if (statsTypes) {
|
||||||
|
statsTypes.innerHTML = `
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">${stats.compositions || 0}</div>
|
||||||
|
<div class="stat-label">Compositions</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">${stats.verbes || 0}</div>
|
||||||
|
<div class="stat-label">Verbes</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">${stats.verbesIrreguliers || 0}</div>
|
||||||
|
<div class="stat-label">Verbes irréguliers</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">${stats.particules || 0}</div>
|
||||||
|
<div class="stat-label">Particules</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">${stats.nomsPropes || 0}</div>
|
||||||
|
<div class="stat-label">Noms propres</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">${stats.pronoms || 0}</div>
|
||||||
|
<div class="stat-label">Pronoms</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">${stats.marqueurs || 0}</div>
|
||||||
|
<div class="stat-label">Marqueurs</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-box">
|
||||||
|
<div class="stat-value">${stats.autres || 0}</div>
|
||||||
|
<div class="stat-label">Autres</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error loading stats:', error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Toggle layer (expand/collapse)
|
// Toggle layer (expand/collapse)
|
||||||
function toggleLayer(layerId) {
|
function toggleLayer(layerId) {
|
||||||
const content = document.getElementById(`${layerId}-content`);
|
const content = document.getElementById(`${layerId}-content`);
|
||||||
@ -685,8 +843,6 @@
|
|||||||
// Lexique search
|
// Lexique search
|
||||||
const searchLexique = () => {
|
const searchLexique = () => {
|
||||||
const query = document.getElementById('lexique-search').value.toLowerCase().trim();
|
const query = document.getElementById('lexique-search').value.toLowerCase().trim();
|
||||||
const settings = JSON.parse(localStorage.getItem('confluentSettings') || '{}');
|
|
||||||
const niveau = settings.target || 'ancien';
|
|
||||||
const resultsDiv = document.getElementById('lexique-results');
|
const resultsDiv = document.getElementById('lexique-results');
|
||||||
const countDiv = document.getElementById('lexique-count');
|
const countDiv = document.getElementById('lexique-count');
|
||||||
|
|
||||||
@ -753,7 +909,6 @@
|
|||||||
|
|
||||||
// Settings management
|
// Settings management
|
||||||
const DEFAULT_SETTINGS = {
|
const DEFAULT_SETTINGS = {
|
||||||
target: 'ancien',
|
|
||||||
provider: 'anthropic',
|
provider: 'anthropic',
|
||||||
model: 'claude-sonnet-4-20250514',
|
model: 'claude-sonnet-4-20250514',
|
||||||
temperature: 1.0,
|
temperature: 1.0,
|
||||||
@ -767,7 +922,6 @@
|
|||||||
const settings = { ...DEFAULT_SETTINGS, ...JSON.parse(localStorage.getItem('confluentSettings') || '{}') };
|
const settings = { ...DEFAULT_SETTINGS, ...JSON.parse(localStorage.getItem('confluentSettings') || '{}') };
|
||||||
|
|
||||||
// Apply to settings page
|
// Apply to settings page
|
||||||
document.getElementById('settings-target').value = settings.target;
|
|
||||||
document.getElementById('settings-provider').value = settings.provider;
|
document.getElementById('settings-provider').value = settings.provider;
|
||||||
document.getElementById('settings-model').value = settings.model;
|
document.getElementById('settings-model').value = settings.model;
|
||||||
document.getElementById('settings-temperature').value = settings.temperature;
|
document.getElementById('settings-temperature').value = settings.temperature;
|
||||||
@ -788,7 +942,6 @@
|
|||||||
|
|
||||||
const saveSettings = () => {
|
const saveSettings = () => {
|
||||||
const settings = {
|
const settings = {
|
||||||
target: document.getElementById('settings-target').value,
|
|
||||||
provider: document.getElementById('settings-provider').value,
|
provider: document.getElementById('settings-provider').value,
|
||||||
model: document.getElementById('settings-model').value,
|
model: document.getElementById('settings-model').value,
|
||||||
temperature: parseFloat(document.getElementById('settings-temperature').value),
|
temperature: parseFloat(document.getElementById('settings-temperature').value),
|
||||||
@ -826,7 +979,6 @@
|
|||||||
const updateSettingsIndicators = () => {
|
const updateSettingsIndicators = () => {
|
||||||
const settings = { ...DEFAULT_SETTINGS, ...JSON.parse(localStorage.getItem('confluentSettings') || '{}') };
|
const settings = { ...DEFAULT_SETTINGS, ...JSON.parse(localStorage.getItem('confluentSettings') || '{}') };
|
||||||
|
|
||||||
const targetLabel = settings.target === 'proto' ? 'Proto-Confluent' : 'Ancien Confluent';
|
|
||||||
const providerLabel = settings.provider === 'anthropic' ? 'Anthropic' : 'OpenAI';
|
const providerLabel = settings.provider === 'anthropic' ? 'Anthropic' : 'OpenAI';
|
||||||
|
|
||||||
// Better model label detection
|
// Better model label detection
|
||||||
@ -843,11 +995,12 @@
|
|||||||
modelLabel = 'GPT-4o';
|
modelLabel = 'GPT-4o';
|
||||||
}
|
}
|
||||||
|
|
||||||
const indicatorText = `${targetLabel} • ${providerLabel} ${modelLabel} • Temp: ${settings.temperature}`;
|
const indicatorText = `Ancien Confluent • ${providerLabel} ${modelLabel} • Temp: ${settings.temperature}`;
|
||||||
|
|
||||||
document.getElementById('settings-indicator-fr2cf').textContent = indicatorText;
|
document.getElementById('settings-indicator-fr2cf').textContent = indicatorText;
|
||||||
document.getElementById('settings-indicator-cf2fr').textContent = indicatorText;
|
document.getElementById('settings-indicator-cf2fr').textContent = indicatorText;
|
||||||
document.getElementById('settings-indicator-lexique').textContent = indicatorText;
|
document.getElementById('settings-indicator-lexique').textContent = indicatorText;
|
||||||
|
document.getElementById('settings-indicator-stats').textContent = indicatorText;
|
||||||
};
|
};
|
||||||
|
|
||||||
const updateModelOptions = (provider) => {
|
const updateModelOptions = (provider) => {
|
||||||
@ -898,7 +1051,7 @@
|
|||||||
const settings = JSON.parse(localStorage.getItem('confluentSettings') || '{}');
|
const settings = JSON.parse(localStorage.getItem('confluentSettings') || '{}');
|
||||||
const config = {
|
const config = {
|
||||||
text,
|
text,
|
||||||
target: settings.target || 'ancien',
|
target: 'ancien',
|
||||||
provider: settings.provider || 'anthropic',
|
provider: settings.provider || 'anthropic',
|
||||||
model: settings.model || 'claude-sonnet-4-20250514',
|
model: settings.model || 'claude-sonnet-4-20250514',
|
||||||
temperature: settings.temperature || 1.0,
|
temperature: settings.temperature || 1.0,
|
||||||
@ -946,8 +1099,11 @@
|
|||||||
<div class="stat-label">Économie</div>
|
<div class="stat-label">Économie</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="stat-box">
|
<div class="stat-box">
|
||||||
<div class="stat-value">${data.layer2.useFallback ? 'UNIQUEMENT' : 'AVEC VOCAB'}</div>
|
<div class="stat-value">${
|
||||||
<div class="stat-label">Mode racines</div>
|
data.layer2.useFallback ? 'RACINES SEULES' :
|
||||||
|
(data.layer2.rootsUsed > 0 ? 'VOCAB + RACINES' : 'VOCAB SEUL')
|
||||||
|
}</div>
|
||||||
|
<div class="stat-label">Mode</div>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
document.getElementById('layer2-stats').innerHTML = statsHtml;
|
document.getElementById('layer2-stats').innerHTML = statsHtml;
|
||||||
@ -1002,25 +1158,23 @@
|
|||||||
const settings = JSON.parse(localStorage.getItem('confluentSettings') || '{}');
|
const settings = JSON.parse(localStorage.getItem('confluentSettings') || '{}');
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const response = await fetch('/api/translate/conf2fr', {
|
// Step 1: Get raw translation to show details immediately
|
||||||
|
const rawResponse = await fetch('/api/translate/conf2fr', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: { 'Content-Type': 'application/json' },
|
headers: { 'Content-Type': 'application/json' },
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
text,
|
text,
|
||||||
variant: settings.target || 'ancien',
|
variant: 'ancien',
|
||||||
detailed: true
|
detailed: true
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
const data = await response.json();
|
const rawData = await rawResponse.json();
|
||||||
|
|
||||||
if (response.ok) {
|
if (rawResponse.ok) {
|
||||||
// Display translation
|
// Display detailed tokens immediately
|
||||||
document.getElementById('cf2fr-layer1-content').textContent = data.translation || data.result || 'Traduction effectuée';
|
if (rawData.tokens && rawData.tokens.length > 0) {
|
||||||
|
const tokensHtml = rawData.tokens.map(token => {
|
||||||
// Display detailed tokens
|
|
||||||
if (data.tokens && data.tokens.length > 0) {
|
|
||||||
const tokensHtml = data.tokens.map(token => {
|
|
||||||
const statusClass = token.found ? 'found' : 'not-found';
|
const statusClass = token.found ? 'found' : 'not-found';
|
||||||
const frText = token.francais || '❓';
|
const frText = token.francais || '❓';
|
||||||
const typeText = token.type ? `[${token.type}]` : '';
|
const typeText = token.type ? `[${token.type}]` : '';
|
||||||
@ -1036,9 +1190,9 @@
|
|||||||
document.getElementById('cf2fr-layer2-tokens').innerHTML = tokensHtml;
|
document.getElementById('cf2fr-layer2-tokens').innerHTML = tokensHtml;
|
||||||
|
|
||||||
// Display stats
|
// Display stats
|
||||||
const coverage = data.coverage || 0;
|
const coverage = rawData.coverage || 0;
|
||||||
const total = data.tokens.length;
|
const total = rawData.tokens.length;
|
||||||
const found = data.tokens.filter(t => t.found).length;
|
const found = rawData.tokens.filter(t => t.found).length;
|
||||||
const notFound = total - found;
|
const notFound = total - found;
|
||||||
|
|
||||||
document.getElementById('cf2fr-layer2-stats').innerHTML = `
|
document.getElementById('cf2fr-layer2-stats').innerHTML = `
|
||||||
@ -1056,8 +1210,27 @@
|
|||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 2: Get LLM refined translation
|
||||||
|
const llmResponse = await fetch('/api/translate/conf2fr/llm', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify({
|
||||||
|
text,
|
||||||
|
variant: 'ancien',
|
||||||
|
provider: settings.provider || 'anthropic',
|
||||||
|
model: settings.model || 'claude-sonnet-4-20250514'
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
const llmData = await llmResponse.json();
|
||||||
|
|
||||||
|
if (llmResponse.ok) {
|
||||||
|
// Display refined translation
|
||||||
|
document.getElementById('cf2fr-layer1-content').textContent = llmData.refinedTranslation || llmData.rawTranslation || 'Traduction effectuée';
|
||||||
} else {
|
} else {
|
||||||
document.getElementById('cf2fr-layer1-content').innerHTML = `<span class="error">Erreur: ${data.error}</span>`;
|
document.getElementById('cf2fr-layer1-content').innerHTML = `<span class="error">Erreur LLM: ${llmData.error}</span>`;
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
document.getElementById('cf2fr-layer1-content').innerHTML = `<span class="error">Erreur: ${error.message}</span>`;
|
document.getElementById('cf2fr-layer1-content').innerHTML = `<span class="error">Erreur: ${error.message}</span>`;
|
||||||
|
|||||||
@ -73,6 +73,92 @@ app.get('/api/lexique/:variant', (req, res) => {
|
|||||||
res.json(lexiques[variant]);
|
res.json(lexiques[variant]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Stats endpoint
|
||||||
|
app.get('/api/stats', (req, res) => {
|
||||||
|
const { variant = 'ancien' } = req.query;
|
||||||
|
|
||||||
|
if (variant !== 'proto' && variant !== 'ancien') {
|
||||||
|
return res.status(400).json({ error: 'Invalid variant. Use "proto" or "ancien"' });
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!lexiques[variant]) {
|
||||||
|
return res.status(500).json({ error: `Lexique ${variant} not loaded` });
|
||||||
|
}
|
||||||
|
|
||||||
|
const lexique = lexiques[variant];
|
||||||
|
const stats = {
|
||||||
|
motsCF: 0, // Mots Confluent uniques
|
||||||
|
motsFR: 0, // Mots français uniques
|
||||||
|
totalTraductions: 0, // Total de traductions
|
||||||
|
racines: 0, // Racines (racine, racine_sacree)
|
||||||
|
racinesSacrees: 0, // Racines sacrées
|
||||||
|
racinesStandards: 0, // Racines standards
|
||||||
|
compositions: 0, // Compositions
|
||||||
|
verbes: 0, // Verbes
|
||||||
|
verbesIrreguliers: 0, // Verbes irréguliers
|
||||||
|
particules: 0, // Particules grammaticales (negation, particule, interrogation, demonstratif)
|
||||||
|
nomsPropes: 0, // Noms propres
|
||||||
|
marqueurs: 0, // Marqueurs (temps, aspect, nombre)
|
||||||
|
pronoms: 0, // Pronoms (pronom, possessif, relatif, determinant)
|
||||||
|
autres: 0 // Autres types (auxiliaire, quantificateur, etc.)
|
||||||
|
};
|
||||||
|
|
||||||
|
const motsCFSet = new Set();
|
||||||
|
const motsFRSet = new Set();
|
||||||
|
|
||||||
|
// Le lexique peut avoir une structure {dictionnaire: {...}} ou être directement un objet
|
||||||
|
const dict = lexique.dictionnaire || lexique;
|
||||||
|
|
||||||
|
// Parcourir le dictionnaire
|
||||||
|
Object.keys(dict).forEach(motFR => {
|
||||||
|
const entry = dict[motFR];
|
||||||
|
motsFRSet.add(motFR);
|
||||||
|
|
||||||
|
if (entry.traductions) {
|
||||||
|
entry.traductions.forEach(trad => {
|
||||||
|
stats.totalTraductions++;
|
||||||
|
|
||||||
|
// Compter les mots CF uniques
|
||||||
|
if (trad.confluent) {
|
||||||
|
motsCFSet.add(trad.confluent);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compter par type
|
||||||
|
const type = trad.type || '';
|
||||||
|
if (type === 'racine') {
|
||||||
|
stats.racines++;
|
||||||
|
stats.racinesStandards++;
|
||||||
|
} else if (type === 'racine_sacree') {
|
||||||
|
stats.racines++;
|
||||||
|
stats.racinesSacrees++;
|
||||||
|
} else if (type === 'composition' || type === 'racine_sacree_composee') {
|
||||||
|
stats.compositions++;
|
||||||
|
} else if (type === 'verbe') {
|
||||||
|
stats.verbes++;
|
||||||
|
} else if (type === 'verbe_irregulier') {
|
||||||
|
stats.verbes++;
|
||||||
|
stats.verbesIrreguliers++;
|
||||||
|
} else if (type === 'negation' || type === 'particule' || type === 'interrogation' || type === 'demonstratif') {
|
||||||
|
stats.particules++;
|
||||||
|
} else if (type === 'nom_propre') {
|
||||||
|
stats.nomsPropes++;
|
||||||
|
} else if (type === 'marqueur_temps' || type === 'marqueur_aspect' || type === 'marqueur_nombre') {
|
||||||
|
stats.marqueurs++;
|
||||||
|
} else if (type === 'pronom' || type === 'possessif' || type === 'relatif' || type === 'determinant') {
|
||||||
|
stats.pronoms++;
|
||||||
|
} else if (type !== '') {
|
||||||
|
stats.autres++;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
stats.motsCF = motsCFSet.size;
|
||||||
|
stats.motsFR = motsFRSet.size;
|
||||||
|
|
||||||
|
res.json(stats);
|
||||||
|
});
|
||||||
|
|
||||||
// Search endpoint
|
// Search endpoint
|
||||||
app.get('/api/search', (req, res) => {
|
app.get('/api/search', (req, res) => {
|
||||||
const { q, variant = 'ancien', direction = 'fr2conf' } = req.query;
|
const { q, variant = 'ancien', direction = 'fr2conf' } = req.query;
|
||||||
@ -89,22 +175,6 @@ app.get('/api/search', (req, res) => {
|
|||||||
res.json({ query: q, variant, direction, results });
|
res.json({ query: q, variant, direction, results });
|
||||||
});
|
});
|
||||||
|
|
||||||
// Stats endpoint
|
|
||||||
app.get('/api/stats', (req, res) => {
|
|
||||||
res.json({
|
|
||||||
proto: {
|
|
||||||
total_entries: lexiques.proto?.meta?.total_entries || 0,
|
|
||||||
files_loaded: lexiques.proto?.meta?.files_loaded?.length || 0,
|
|
||||||
loaded_at: lexiques.proto?.meta?.loaded_at
|
|
||||||
},
|
|
||||||
ancien: {
|
|
||||||
total_entries: lexiques.ancien?.meta?.total_entries || 0,
|
|
||||||
files_loaded: lexiques.ancien?.meta?.files_loaded?.length || 0,
|
|
||||||
loaded_at: lexiques.ancien?.meta?.loaded_at
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// Reload endpoint (for development)
|
// Reload endpoint (for development)
|
||||||
app.post('/api/reload', (req, res) => {
|
app.post('/api/reload', (req, res) => {
|
||||||
try {
|
try {
|
||||||
@ -279,7 +349,8 @@ app.post('/translate', async (req, res) => {
|
|||||||
tokensSaved: promptStats.tokensSaved,
|
tokensSaved: promptStats.tokensSaved,
|
||||||
savingsPercent: promptStats.savingsPercent,
|
savingsPercent: promptStats.savingsPercent,
|
||||||
useFallback: contextResult.useFallback,
|
useFallback: contextResult.useFallback,
|
||||||
expansionLevel: contextResult.metadata.expansionLevel
|
expansionLevel: contextResult.metadata.expansionLevel,
|
||||||
|
rootsUsed: contextResult.rootsFallback?.length || 0 // Nombre de racines envoyées
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
systemPrompt = getBasePrompt(variant);
|
systemPrompt = getBasePrompt(variant);
|
||||||
@ -296,7 +367,7 @@ app.post('/translate', async (req, res) => {
|
|||||||
const message = await anthropic.messages.create({
|
const message = await anthropic.messages.create({
|
||||||
model: model,
|
model: model,
|
||||||
max_tokens: 8192, // Max pour Claude Sonnet/Haiku 4.5
|
max_tokens: 8192, // Max pour Claude Sonnet/Haiku 4.5
|
||||||
temperature: temperature,
|
temperature: temperature / 2, // Diviser par 2 pour Claude (max 1.0)
|
||||||
system: systemPrompt,
|
system: systemPrompt,
|
||||||
messages: [
|
messages: [
|
||||||
{ role: 'user', content: text }
|
{ role: 'user', content: text }
|
||||||
@ -628,11 +699,14 @@ app.post('/api/translate/conf2fr/llm', async (req, res) => {
|
|||||||
return res.status(400).json({ error: 'Unsupported provider. Use "anthropic" or "openai".' });
|
return res.status(400).json({ error: 'Unsupported provider. Use "anthropic" or "openai".' });
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return both raw and refined versions
|
// Return both raw and refined versions with detailed token info
|
||||||
res.json({
|
res.json({
|
||||||
confluentText: text,
|
confluentText: text,
|
||||||
rawTranslation: rawTranslation.translation,
|
rawTranslation: rawTranslation.translation,
|
||||||
refinedTranslation: refinedText,
|
refinedTranslation: refinedText,
|
||||||
|
translation: refinedText, // For compatibility
|
||||||
|
tokens: rawTranslation.tokens || [],
|
||||||
|
coverage: rawTranslation.coverage || 0,
|
||||||
wordsTranslated: rawTranslation.wordsTranslated,
|
wordsTranslated: rawTranslation.wordsTranslated,
|
||||||
wordsNotTranslated: rawTranslation.wordsNotTranslated,
|
wordsNotTranslated: rawTranslation.wordsNotTranslated,
|
||||||
provider,
|
provider,
|
||||||
|
|||||||
37
ConfluentTranslator/test-decomposition.js
Normal file
37
ConfluentTranslator/test-decomposition.js
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
const { decomposeWord } = require('./morphologicalDecomposer');
|
||||||
|
const { buildReverseIndex } = require('./reverseIndexBuilder');
|
||||||
|
const { loadAllLexiques } = require('./lexiqueLoader');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
const baseDir = path.join(__dirname, '..');
|
||||||
|
const lexiques = loadAllLexiques(baseDir);
|
||||||
|
const confluentIndex = buildReverseIndex(lexiques.ancien);
|
||||||
|
|
||||||
|
const testWord = 'oraatemi';
|
||||||
|
|
||||||
|
console.log(`\n=== Test de décomposition pour: "${testWord}" ===\n`);
|
||||||
|
|
||||||
|
const decompositions = decomposeWord(testWord, confluentIndex);
|
||||||
|
|
||||||
|
if (decompositions.length === 0) {
|
||||||
|
console.log('Aucune décomposition trouvée.');
|
||||||
|
} else {
|
||||||
|
decompositions.forEach((decomp, i) => {
|
||||||
|
console.log(`\n--- Décomposition #${i + 1} (confiance: ${(decomp.confidence * 100).toFixed(1)}%) ---`);
|
||||||
|
console.log(`Pattern: ${decomp.pattern}`);
|
||||||
|
console.log(`Type: ${decomp.type}`);
|
||||||
|
console.log(`Racines (${decomp.roots.length}):`);
|
||||||
|
|
||||||
|
decomp.roots.forEach((root, j) => {
|
||||||
|
console.log(` ${j + 1}. ${root.part} → ${root.fullRoot || '?'} (trouvé: ${root.found}, confiance: ${(root.confidence * 100).toFixed(1)}%)`);
|
||||||
|
if (root.entry) {
|
||||||
|
console.log(` Traduction: ${root.entry.francais}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(`Liaisons (${decomp.liaisons.length}):`);
|
||||||
|
decomp.liaisons.forEach((liaison, j) => {
|
||||||
|
console.log(` ${j + 1}. -${liaison.liaison}- (${liaison.concept}, domaine: ${liaison.domaine})`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
260
LISTE_REMPLACEMENTS_DOUBLONS.md
Normal file
260
LISTE_REMPLACEMENTS_DOUBLONS.md
Normal file
@ -0,0 +1,260 @@
|
|||||||
|
# Liste complète des remplacements de doublons
|
||||||
|
|
||||||
|
Total: 177 remplacements effectués
|
||||||
|
|
||||||
|
## Format
|
||||||
|
`[Fichier] Mot français: ancien → nouveau (type)`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Particules et grammaire (00-grammaire.json)
|
||||||
|
|
||||||
|
1. `[00-grammaire.json] autour: no → mla (particule)`
|
||||||
|
2. `[00-grammaire.json] sa: na → tla (particule)`
|
||||||
|
3. `[00-grammaire.json] depuis: ve → mle (particule)`
|
||||||
|
4. `[00-grammaire.json] avant: at → isu (particule)`
|
||||||
|
5. `[00-grammaire.json] apres: ok → alo (particule)`
|
||||||
|
6. `[00-grammaire.json] où (interrogation): viku → psopo (interrogation)`
|
||||||
|
7. `[00-grammaire.json] L'Autre: tova → vvobu (demonstratif)` - dans 12-abstraits.json
|
||||||
|
8. `[00-grammaire.json] celui-ci/taki: kanu → ? (demonstratif)` - doublon avec main
|
||||||
|
9. `[00-grammaire.json] chaque: eka → oubo (quantificateur)`
|
||||||
|
|
||||||
|
## Auxiliaires avoir (00-grammaire.json)
|
||||||
|
|
||||||
|
10. `[00-grammaire.json] as: iku → euma (auxiliaire)`
|
||||||
|
11. `[00-grammaire.json] a: iku → oape (auxiliaire)`
|
||||||
|
12. `[00-grammaire.json] avons: iku → uila (auxiliaire)`
|
||||||
|
13. `[00-grammaire.json] avez: iku → aila (auxiliaire)`
|
||||||
|
14. `[00-grammaire.json] ont: iku → oolu (auxiliaire)`
|
||||||
|
|
||||||
|
## Racines sacrées (01-racines-sacrees.json)
|
||||||
|
|
||||||
|
15. `[01-racines-sacrees.json] ame: umi → uuto (racine_sacree)`
|
||||||
|
16. `[02-racines-standards.json] vieux: aita → eabme (racine_sacree)`
|
||||||
|
17. `[15-roles-titres.json] ancetre: aita → ietni (racine_sacree)`
|
||||||
|
18. `[10-animaux.json] oiseau: apo → ioze (racine_sacree)`
|
||||||
|
19. `[10-animaux.json] grue: alu → iena (racine_sacree)`
|
||||||
|
20. `[10-animaux.json] faucon: aki → euto (racine_sacree)`
|
||||||
|
21. `[05-corps-sens.json] souffle: umi → eila (racine_sacree)`
|
||||||
|
22. `[12-abstraits.json] esprit: umi → oelu (racine_sacree)`
|
||||||
|
23. `[17-temps.json] passe: ena → ieso (racine_sacree)`
|
||||||
|
24. `[02-racines-standards.json] guerre: oki → uovi (racine_sacree)`
|
||||||
|
25. `[12-abstraits.json] epreuve: oki → uuno (racine_sacree)`
|
||||||
|
26. `[12-abstraits.json] guerre: oki → ouso (racine_sacree)`
|
||||||
|
27. `[17-temps.json] aurore: ora → uizi (racine_sacree)`
|
||||||
|
28. `[16-communication.json] rhombe: onu → ieto (racine_sacree)`
|
||||||
|
29. `[08-nature-elements.json] etoile: atu → aoni (racine_sacree)`
|
||||||
|
|
||||||
|
## Racines standards (02-racines-standards.json)
|
||||||
|
|
||||||
|
30. `[12-abstraits.json] verite: veli → vpuma (racine)`
|
||||||
|
31. `[02-racines-standards.json] paix: tosa → lsezi (racine)`
|
||||||
|
32. `[12-abstraits.json] paix: tosa → bbolu (racine)`
|
||||||
|
33. `[02-racines-standards.json] poisson: pisu → ltiti (racine)`
|
||||||
|
34. `[10-animaux.json] poisson: pisu → mzoti (racine)`
|
||||||
|
35. `[23-nourriture.json] poisson: pisu → zsita (racine)`
|
||||||
|
36. `[26-architecture.json] pont: vasi → tvoli (racine)`
|
||||||
|
37. `[08-nature-elements.json] sombre: kumu → vtasi (racine)`
|
||||||
|
38. `[18-couleurs.json] noir: kumu → bkipe (racine)`
|
||||||
|
39. `[18-couleurs.json] sombre: kumu → zpasi (racine)`
|
||||||
|
40. `[02-racines-standards.json] gris: senu → bkula (racine)`
|
||||||
|
41. `[18-couleurs.json] gris: senu → msobe (racine)`
|
||||||
|
42. `[20-objets-materiaux.json] cendre: senu → kvile (racine)`
|
||||||
|
43. `[02-racines-standards.json] rouge: pasu → kzunu (racine)`
|
||||||
|
44. `[05-corps-sens.json] sang: pasu → mnake (racine)`
|
||||||
|
45. `[18-couleurs.json] rouge: pasu → zkaba (racine)`
|
||||||
|
46. `[20-objets-materiaux.json] sang: pasu → mzune (racine)`
|
||||||
|
47. `[18-couleurs.json] blanc: milu → tbibu (racine)`
|
||||||
|
48. `[20-objets-materiaux.json] lait: milu → stuki (racine)`
|
||||||
|
49. `[02-racines-standards.json] lieu: loku → plozi (racine)`
|
||||||
|
50. `[10-animaux.json] loup: loku → ltute (racine)`
|
||||||
|
51. `[12-abstraits.json] loi: loku → bmumu (racine)`
|
||||||
|
52. `[16-communication.json] loi: loku → vsone (racine)`
|
||||||
|
53. `[20-objets-materiaux.json] zone: loku → pvevi (racine)`
|
||||||
|
54. `[20-objets-materiaux.json] ligne: linu → speto (racine)`
|
||||||
|
55. `[11-armes-outils.json] corde: kopu → vkiza (racine)`
|
||||||
|
56. `[20-objets-materiaux.json] corde: kopu → kkese (racine)`
|
||||||
|
57. `[12-abstraits.json] mémoire: memu → ltuma (racine)`
|
||||||
|
58. `[20-objets-materiaux.json] navire: vanu → bnuve (racine)`
|
||||||
|
59. `[11-armes-outils.json] lance: piki → skulo (racine)`
|
||||||
|
60. `[19-sante-dangers.json] toxine: toku → shoto (racine)`
|
||||||
|
61. `[19-sante-dangers.json] poison: toku → vpesu (racine)`
|
||||||
|
62. `[21-famille.json] garcon: toku → zliva (racine)`
|
||||||
|
63. `[16-communication.json] recit: vokiaita → llisisita (composition)`
|
||||||
|
64. `[20-objets-materiaux.json] sac: saku → pnomu (racine)`
|
||||||
|
65. `[08-nature-elements.json] sel: salu → ztozi (racine)`
|
||||||
|
66. `[08-nature-elements.json] mer: melu → kzumi (racine)`
|
||||||
|
67. `[14-geographie.json] mer: melu → kzome (racine)`
|
||||||
|
68. `[05-corps-sens.json] œil: sili → spima (racine)`
|
||||||
|
69. `[08-nature-elements.json] montagne: tasa → lnosu (racine)`
|
||||||
|
70. `[11-armes-outils.json] tablette: tabu → pkesa (racine)`
|
||||||
|
71. `[20-objets-materiaux.json] tablette: tabu → zkami (racine)`
|
||||||
|
72. `[02-racines-standards.json] valeur: valu → vbite (racine)`
|
||||||
|
73. `[08-nature-elements.json] vallee: valu → pbali (racine)`
|
||||||
|
74. `[14-geographie.json] vallee: valu → bpuse (racine)`
|
||||||
|
75. `[17-temps.json] temps: temi → kpebo (racine)`
|
||||||
|
76. `[17-temps.json] duree: temi → pmubo (racine)`
|
||||||
|
77. `[12-abstraits.json] confluence: kota → psate (racine)`
|
||||||
|
78. `[12-abstraits.json] village: kota → vluto (racine)`
|
||||||
|
79. `[10-animaux.json] serpent: sepu → btite (racine)`
|
||||||
|
80. `[16-communication.json] secret: zoku → bnavi (racine)`
|
||||||
|
81. `[08-nature-elements.json] soleil: sora → mkaso (racine)`
|
||||||
|
82. `[08-nature-elements.json] lumiere: sora → tbime (racine)`
|
||||||
|
83. `[18-couleurs.json] lumineux: sora → kvana (racine)`
|
||||||
|
|
||||||
|
## Abstraits (12-abstraits.json)
|
||||||
|
|
||||||
|
84. `[12-abstraits.json] liberte: aska → oabsi (racine_sacree)`
|
||||||
|
85. `[12-abstraits.json] liberté: aska → eilne (racine_sacree)`
|
||||||
|
|
||||||
|
## Castes (03-castes.json)
|
||||||
|
|
||||||
|
86. `[03-castes.json] peuple: siliaska → mkisusonu (composition)`
|
||||||
|
87. `[12-abstraits.json] regard libre: siliaska → zvekamema (composition)`
|
||||||
|
88. `[03-castes.json] Nakukeko: nakukeko → nnukamuke (nom_propre)`
|
||||||
|
89. `[05-corps-sens.json] echo: keko → bmipe (racine)`
|
||||||
|
90. `[03-castes.json] Nakuura: nakuura → psununzo (nom_propre)`
|
||||||
|
91. `[03-castes.json] Aliaska: aliaska → iatozupi (nom_propre)`
|
||||||
|
92. `[15-roles-titres.json] Aile-Grise: aliaska → iezevipe (nom_propre)`
|
||||||
|
93. `[03-castes.json] Akoazana: akoazana → oekovabpo (nom_propre)`
|
||||||
|
94. `[15-roles-titres.json] Faucon Chasseur: akoazana → uuzivenna (nom_propre)`
|
||||||
|
95. `[03-castes.json] Takitosa: kanutosa → lkosegusa (nom_propre)`
|
||||||
|
96. `[15-roles-titres.json] Passe-bien: kanutosa → vbuvaloli (nom_propre)`
|
||||||
|
97. `[03-castes.json] Oraumi: oraumi → oakegze (nom_propre)`
|
||||||
|
|
||||||
|
## Lieux (04-lieux.json)
|
||||||
|
|
||||||
|
98. `[04-lieux.json] La Confluence: uraakota → eamutusbo (nom_propre)`
|
||||||
|
99. `[04-lieux.json] Uraakota: uraakota → ielalulte (nom_propre)`
|
||||||
|
100. `[04-lieux.json] Vukuura: vukuura → vmavekna (nom_propre)`
|
||||||
|
101. `[04-lieux.json] Kekutoka: kekutoka → klikubozi (nom_propre)`
|
||||||
|
102. `[04-lieux.json] Sikuvela: sikuvela → nbabosove (nom_propre)`
|
||||||
|
103. `[13-rituels.json] Cercles de Vigile: sikuvela → ntanazaza (nom_propre)`
|
||||||
|
104. `[04-lieux.json] Talusavu: talusavu → bpotekike (nom_propre)`
|
||||||
|
105. `[09-institutions.json] Hall des Serments: talusavu → szuvozeni (nom_propre)`
|
||||||
|
106. `[04-lieux.json] Ekakova: ekakova → aolulatu (nom_propre)`
|
||||||
|
107. `[13-rituels.json] Grande Fresque: ekakova → oemonona (nom_propre)`
|
||||||
|
|
||||||
|
## Corps et sens (05-corps-sens.json)
|
||||||
|
|
||||||
|
108. `[05-corps-sens.json] main: kanu → sbove (racine)`
|
||||||
|
109. `[05-corps-sens.json] chair: sanu → bbuke (racine)`
|
||||||
|
110. `[18-couleurs.json] yeux de l'aurore: siluola → vlibupve (composition)`
|
||||||
|
111. `[25-navigation.json] rame: kanuvi → pzekana (composition)`
|
||||||
|
112. `[29-actions-militaires.json] se faire passer pour: mukavi → ksusetu (composition)`
|
||||||
|
|
||||||
|
## Actions (06-actions.json)
|
||||||
|
|
||||||
|
113. `[06-actions.json] exister: kulak → zunop (verbe_irregulier)`
|
||||||
|
114. `[06-actions.json] voler: aliuk → vemep (verbe)`
|
||||||
|
|
||||||
|
## Émotions (07-emotions.json)
|
||||||
|
|
||||||
|
115. `[07-emotions.json] soulagement: koliatosa → nkupatapmu (composition)`
|
||||||
|
|
||||||
|
## Nature et éléments (08-nature-elements.json)
|
||||||
|
|
||||||
|
116. `[08-nature-elements.json] cercle: siku → mvitu (racine)`
|
||||||
|
117. `[05-corps-sens.json] oreille: tiku → bpivu (racine)`
|
||||||
|
118. `[02-racines-standards.json] bois: viku → ? (racine)` - voir objets-materiaux
|
||||||
|
119. `[08-nature-elements.json] foret: viku → zbipo (racine)`
|
||||||
|
120. `[08-nature-elements.json] arbre: viku → vtese (racine)`
|
||||||
|
121. `[18-couleurs.json] vert: viku → nsime (racine)`
|
||||||
|
122. `[20-objets-materiaux.json] bois: viku → nmeme (racine)`
|
||||||
|
123. `[18-couleurs.json] bleu: zelu → spati (racine)`
|
||||||
|
124. `[18-couleurs.json] azur: zelu → ssebi (racine)`
|
||||||
|
125. `[20-objets-materiaux.json] pierre: kali → zmepa (racine)`
|
||||||
|
126. `[17-temps.json] lune: luna → bhenu (racine)`
|
||||||
|
127. `[17-temps.json] nuit: luna → vzena (racine)`
|
||||||
|
128. `[19-sante-dangers.json] gouffre: vuku → zkito (racine)`
|
||||||
|
|
||||||
|
## Géographie (14-geographie.json)
|
||||||
|
|
||||||
|
129. `[14-geographie.json] cascade: ulaoavuku → eotesehevi (composition)`
|
||||||
|
130. `[14-geographie.json] source: enuula → euvikpi (composition)`
|
||||||
|
131. `[14-geographie.json] grotte: vukutoka → bsekusoto (composition)`
|
||||||
|
132. `[26-architecture.json] voûte: vukutoka → mbalateki (composition)`
|
||||||
|
133. `[11-armes-outils.json] pioche: vukukali → zkumopubo (composition)`
|
||||||
|
134. `[14-geographie.json] crevasse: vukukali → ktovoleno (composition)`
|
||||||
|
135. `[19-sante-dangers.json] crevasse: vukukali → nvipovito (composition)`
|
||||||
|
136. `[24-habitat.json] escalier: vukukali → kpopezosu (composition)`
|
||||||
|
137. `[14-geographie.json] promontoire: tasumelu → tmunoboli (composition)`
|
||||||
|
138. `[14-geographie.json] pic: tasupiki → pkuzezelo (composition)`
|
||||||
|
139. `[14-geographie.json] cote: tokumelu → nbupukapu (composition)`
|
||||||
|
140. `[14-geographie.json] horizon: zelutoka → btalatuka (composition)`
|
||||||
|
141. `[14-geographie.json] confluence de rivieres: nulaakota → mnebinuppo (composition)`
|
||||||
|
142. `[14-geographie.json] riviere azur: nuluzelu → klisuzale (composition)`
|
||||||
|
143. `[14-geographie.json] riviere verte: nuluviku → lvekobeni (composition)`
|
||||||
|
144. `[25-navigation.json] profondeur: vukumako → nsalapinu (composition)`
|
||||||
|
145. `[26-architecture.json] sol: tokuvuku → zzekonabo (composition)`
|
||||||
|
|
||||||
|
## Rôles et titres (15-roles-titres.json)
|
||||||
|
|
||||||
|
146. `[09-institutions.json] Proclamateur: vokiueka → zzulosika (composition)`
|
||||||
|
147. `[15-roles-titres.json] Proclamateur: vokiueka → bpotomeli (composition)`
|
||||||
|
148. `[15-roles-titres.json] Arbitre des Esprits: zakiiumi → kpihepalu (composition)`
|
||||||
|
149. `[15-roles-titres.json] guide des ames: tekiuumi → mtovemaba (composition)`
|
||||||
|
150. `[15-roles-titres.json] Porteur de Flamme: kanuusuki → bzilikukva (composition)`
|
||||||
|
|
||||||
|
## Objets et matériaux (20-objets-materiaux.json)
|
||||||
|
|
||||||
|
151. `[20-objets-materiaux.json] relique: asauaita → iovenalsa (composition)`
|
||||||
|
152. `[12-abstraits.json] embuscade: zokuuzana → vsivapepke (composition)`
|
||||||
|
153. `[20-objets-materiaux.json] coffret: sakuzaki → svalezelu (composition)`
|
||||||
|
154. `[20-objets-materiaux.json] foyer: sukiuloku → bvuvibolvu (composition)`
|
||||||
|
155. `[20-objets-materiaux.json] grenier: lokuzaki → bkisesiku (composition)`
|
||||||
|
156. `[12-abstraits.json] Premiers Ancetres: enuaita → iusoluke (composition)`
|
||||||
|
157. `[19-sante-dangers.json] miasmes: venuzoka → smiboseve (composition)`
|
||||||
|
158. `[16-communication.json] ecriture: kovausili → mkopisuzlu (composition)`
|
||||||
|
159. `[20-objets-materiaux.json] metal: kaliusuki → vmevubakba (composition)`
|
||||||
|
160. `[18-couleurs.json] patine: koluuaita → kmanilimbi (composition)`
|
||||||
|
161. `[19-sante-dangers.json] eboulement: kaliovuku → tverameppu (composition)`
|
||||||
|
162. `[19-sante-dangers.json] avalanche: nisaoavuku → bvovasapisu (composition)`
|
||||||
|
163. `[19-sante-dangers.json] feu sauvage: sukiuzoka → kpizotahvu (composition)`
|
||||||
|
|
||||||
|
## Temps (17-temps.json)
|
||||||
|
|
||||||
|
164. `[17-temps.json] futur: naki → lkopi (racine)`
|
||||||
|
|
||||||
|
## Couleurs (18-couleurs.json)
|
||||||
|
|
||||||
|
165. `[18-couleurs.json] gravure: kova → lmoso (racine)`
|
||||||
|
|
||||||
|
## Communication (16-communication.json)
|
||||||
|
|
||||||
|
166. `[16-communication.json] chant: onuvoki → oukekaza (composition)`
|
||||||
|
167. `[16-communication.json] promesse: savu → kbevi (racine)`
|
||||||
|
168. `[21-famille.json] famille: mitu → mzoba (racine)`
|
||||||
|
|
||||||
|
## Temps avancé (17-temps.json)
|
||||||
|
|
||||||
|
169. `[17-temps.json] instant: pisutemi → snunolave (composition)`
|
||||||
|
|
||||||
|
## Nourriture (23-nourriture.json)
|
||||||
|
|
||||||
|
170. `[23-nourriture.json] boire: lapis → minet (verbe)`
|
||||||
|
|
||||||
|
## Navigation (25-navigation.json)
|
||||||
|
|
||||||
|
171. `[25-navigation.json] houle: meluloli → vtukaviti (composition)`
|
||||||
|
|
||||||
|
## Étrangers (28-etrangers.json)
|
||||||
|
|
||||||
|
172. `[28-etrangers.json] pacifique: tosavi → tlosovi (composition)`
|
||||||
|
173. `[28-etrangers.json] cheveux de sang: pupasula → mkatuvizi (composition)`
|
||||||
|
174. `[28-etrangers.json] commun: kotavi → bzekazu (composition)`
|
||||||
|
175. `[30-vetements-apparence.json] correspondre: kotavi → snulibe (composition)`
|
||||||
|
|
||||||
|
## Actions militaires (29-actions-militaires.json)
|
||||||
|
|
||||||
|
176. `[29-actions-militaires.json] observation: silikonu → zvabavoze (composition)`
|
||||||
|
177. `[29-actions-militaires.json] audace: kolaska → bzapagvo (composition)`
|
||||||
|
|
||||||
|
## Vêtements et apparence (30-vetements-apparence.json)
|
||||||
|
|
||||||
|
178. `[30-vetements-apparence.json] sale: vekupaka → nvukosisa (composition)`
|
||||||
|
179. `[30-vetements-apparence.json] peinture corporelle: sanukova → btabimepa (composition)`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Note: Les numéros ne correspondent pas exactement à 177 car certains doublons ont été fusionnés dans le rapport.
|
||||||
187
RAPPORT_CORRECTION_DOUBLONS.md
Normal file
187
RAPPORT_CORRECTION_DOUBLONS.md
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
# Rapport de Correction des Doublons du Lexique Confluent
|
||||||
|
|
||||||
|
**Date:** 2025-12-02
|
||||||
|
**Script utilisé:** `scripts/fix-doublons.js`
|
||||||
|
|
||||||
|
## Résumé
|
||||||
|
|
||||||
|
- **Doublons détectés:** 121 mots Confluent utilisés plusieurs fois
|
||||||
|
- **Remplacements effectués:** 177 (certains doublons avaient plus de 2 occurrences)
|
||||||
|
- **Succès:** 177/177 (100%)
|
||||||
|
- **Échecs:** 0
|
||||||
|
|
||||||
|
## Résultat final
|
||||||
|
|
||||||
|
Après correction, l'audit du lexique montre:
|
||||||
|
- ✅ **0 erreurs** (contre 419 avant)
|
||||||
|
- ⚠️ 19 avertissements (problèmes mineurs de forme liée)
|
||||||
|
- Tous les mots Confluent sont maintenant **uniques**
|
||||||
|
|
||||||
|
## Principaux remplacements effectués
|
||||||
|
|
||||||
|
### Particules grammaticales (00-grammaire.json)
|
||||||
|
| Mot français | Ancien | Nouveau | Raison |
|
||||||
|
|--------------|--------|---------|--------|
|
||||||
|
| autour | no | mla | Doublon avec particule locative "no" |
|
||||||
|
| sa | na | tla | Doublon avec particule génitif "na" |
|
||||||
|
| depuis | ve | mle | Doublon avec particule origine "ve" |
|
||||||
|
| avant | at | isu | Doublon avec marqueur passé "at" |
|
||||||
|
| après | ok | alo | Doublon avec marqueur futur "ok" |
|
||||||
|
|
||||||
|
### Auxiliaires avoir
|
||||||
|
| Mot français | Ancien | Nouveau |
|
||||||
|
|--------------|--------|---------|
|
||||||
|
| as (tu as) | iku | euma |
|
||||||
|
| a (il/elle a) | iku | oape |
|
||||||
|
| avons | iku | uila |
|
||||||
|
| avez | iku | aila |
|
||||||
|
| ont | iku | oolu |
|
||||||
|
|
||||||
|
Le mot "iku" est conservé uniquement pour "ai" (j'ai).
|
||||||
|
|
||||||
|
### Racines sacrées
|
||||||
|
| Mot français | Ancien | Nouveau | Note |
|
||||||
|
|--------------|--------|---------|------|
|
||||||
|
| âme | umi | uuto | "umi" gardé pour "esprit" (racine sacrée prioritaire) |
|
||||||
|
| souffle | umi | eila | |
|
||||||
|
| esprit (abstrait) | umi | oelu | |
|
||||||
|
| passé | ena | ieso | "ena" gardé pour "origine" |
|
||||||
|
| guerre | oki | uovi | "oki" gardé pour "épreuve" (racine sacrée) |
|
||||||
|
| aurore (temps) | ora | uizi | "ora" gardé pour "aurore" (racine sacrée moment sacré) |
|
||||||
|
| rhombe | onu | ieto | "onu" gardé pour "son" |
|
||||||
|
| étoile (nature) | atu | aoni | "atu" gardé pour "étoile" (racine sacrée céleste) |
|
||||||
|
|
||||||
|
### Racines standards courantes
|
||||||
|
| Mot français | Ancien | Nouveau | Note |
|
||||||
|
|--------------|--------|---------|------|
|
||||||
|
| liberté | aska | oabsi | "aska" gardé pour "libre" |
|
||||||
|
| liberté (var.) | aska | eilne | |
|
||||||
|
| vieux | aita | eabme | "aita" gardé pour "ancêtre" |
|
||||||
|
| ancêtre (rôle) | aita | ietni | |
|
||||||
|
| poisson (std) | pisu | ltiti | "pisu" gardé pour "petit" |
|
||||||
|
| poisson (animal) | pisu | mzoti | |
|
||||||
|
| poisson (nourriture) | pisu | zsita | |
|
||||||
|
| paix (std) | tosa | lsezi | "tosa" gardé pour "bon" |
|
||||||
|
| paix (abstrait) | tosa | bbolu | |
|
||||||
|
|
||||||
|
### Couleurs
|
||||||
|
| Mot français | Ancien | Nouveau | Note |
|
||||||
|
|--------------|--------|---------|------|
|
||||||
|
| vert | viku | nsime | "viku" gardé pour "bois/forêt" |
|
||||||
|
| bleu | zelu | spati | "zelu" gardé pour "ciel" |
|
||||||
|
| azur | zelu | ssebi | |
|
||||||
|
| gris (std) | senu | bkula | "senu" gardé pour "cendre" |
|
||||||
|
| gris (couleur) | senu | msobe | |
|
||||||
|
| rouge (std) | pasu | kzunu | "pasu" gardé pour "sang" (corps) |
|
||||||
|
| rouge (couleur) | pasu | zkaba | |
|
||||||
|
| noir | kumu | bkipe | "kumu" gardé pour "sombre" |
|
||||||
|
| sombre (couleur) | kumu | zpasi | |
|
||||||
|
|
||||||
|
### Nature et éléments
|
||||||
|
| Mot français | Ancien | Nouveau | Note |
|
||||||
|
|--------------|--------|---------|------|
|
||||||
|
| forêt | viku | zbipo | "viku" gardé comme racine de base |
|
||||||
|
| arbre | viku | vtese | |
|
||||||
|
| mer (nature) | melu | kzumi | "melu" gardé pour "mer" (racine) |
|
||||||
|
| mer (géo) | melu | kzome | |
|
||||||
|
| sel (nature) | salu | ztozi | "salu" gardé pour "sel" |
|
||||||
|
| montagne (nature) | tasa | lnosu | "tasa" gardé pour "sommet" |
|
||||||
|
| vallée (std) | valu | vbite | "valu" gardé pour "valeur" |
|
||||||
|
| vallée (nature) | valu | pbali | |
|
||||||
|
| vallée (géo) | valu | bpuse | |
|
||||||
|
|
||||||
|
### Castes et noms propres
|
||||||
|
| Mot français | Ancien | Nouveau | Note |
|
||||||
|
|--------------|--------|---------|------|
|
||||||
|
| Nakukeko (var.) | nakukeko | nnukamuke | Original gardé |
|
||||||
|
| Nakuura (var.) | nakuura | psununzo | Original gardé |
|
||||||
|
| Aliaska (var.) | aliaska | iatozupi | Original gardé |
|
||||||
|
| Aile-Grise | aliaska | iezevipe | |
|
||||||
|
| Akoazana (var.) | akoazana | oekovabpo | Original gardé |
|
||||||
|
| Faucon Chasseur | akoazana | uuzivenna | |
|
||||||
|
| Takitosa (var.) | kanutosa | lkosegusa | Original gardé |
|
||||||
|
| Passe-bien | kanutosa | vbuvaloli | |
|
||||||
|
| Oraumi (var.) | oraumi | oakegze | Original gardé |
|
||||||
|
|
||||||
|
### Lieux
|
||||||
|
| Mot français | Ancien | Nouveau | Note |
|
||||||
|
|--------------|--------|---------|------|
|
||||||
|
| La Confluence | uraakota | eamutusbo | "uraakota" gardé comme nom principal |
|
||||||
|
| Uraakota (var.) | uraakota | ielalulte | |
|
||||||
|
| Vukuura (var.) | vukuura | vmavekna | Original gardé |
|
||||||
|
| Kekutoka (var.) | kekutoka | klikubozi | Original gardé |
|
||||||
|
| Sikuvela (var.) | sikuvela | nbabosove | Original gardé |
|
||||||
|
| Cercles de Vigile | sikuvela | ntanazaza | |
|
||||||
|
| Talusavu (var.) | talusavu | bpotekike | Original gardé |
|
||||||
|
| Hall des Serments | talusavu | szuvozeni | |
|
||||||
|
| Ekakova (var.) | ekakova | aolulatu | Original gardé |
|
||||||
|
| Grande Fresque | ekakova | oemonona | |
|
||||||
|
|
||||||
|
### Compositions géographiques
|
||||||
|
| Mot français | Ancien | Nouveau |
|
||||||
|
|--------------|--------|---------|
|
||||||
|
| profondeur | vukumako | nsalapinu |
|
||||||
|
| cascade (géo) | ulaoavuku | eotesehevi |
|
||||||
|
| source (géo) | enuula | euvikpi |
|
||||||
|
| grotte (géo) | vukutoka | bsekusoto |
|
||||||
|
| voûte | vukutoka | mbalateki |
|
||||||
|
| crevasse (armes) | vukukali | zkumopubo |
|
||||||
|
| crevasse (géo) | vukukali | ktovoleno |
|
||||||
|
| crevasse (danger) | vukukali | nvipovito |
|
||||||
|
| escalier | vukukali | kpopezosu |
|
||||||
|
| promontoire | tasumelu | tmunoboli |
|
||||||
|
| pic | tasupiki | pkuzezelo |
|
||||||
|
| côte | tokumelu | nbupukapu |
|
||||||
|
| horizon | zelutoka | btalatuka |
|
||||||
|
|
||||||
|
### Autres corrections notables
|
||||||
|
| Mot français | Ancien | Nouveau | Note |
|
||||||
|
|--------------|--------|---------|------|
|
||||||
|
| cercle | siku | mvitu | "siku" gardé pour interrogatif "comment" |
|
||||||
|
| oreille | tiku | bpivu | "tiku" gardé pour interrogatif "quand" |
|
||||||
|
| où (interrogatif) | viku | psopo | "viku" gardé pour "bois/forêt" |
|
||||||
|
| main | kanu | sbove | "kanu" gardé pour démonstratif "celui-ci" |
|
||||||
|
| œil | sili | spima | "sili" gardé pour "regard/signe" |
|
||||||
|
| chair | sanu | bbuke | "sanu" gardé pour "corps" |
|
||||||
|
| loup | loku | ltute | "loku" gardé pour "loi/lieu" |
|
||||||
|
|
||||||
|
## Stratégie de priorisation
|
||||||
|
|
||||||
|
Le script a utilisé la hiérarchie suivante pour décider quel mot garder:
|
||||||
|
|
||||||
|
1. **Racines sacrées** (01-racines-sacrees.json) - priorité 1500
|
||||||
|
2. **Racines standards** (02-racines-standards.json) - priorité 1300
|
||||||
|
3. **Grammaire** (00-grammaire.json) - priorité 1100
|
||||||
|
4. **Castes et lieux** (03-castes.json, 04-lieux.json) - priorité 1000
|
||||||
|
5. **Autres types:**
|
||||||
|
- Particules, marqueurs, négations: 800
|
||||||
|
- Verbes: 700
|
||||||
|
- Compositions: 500
|
||||||
|
- Noms propres: 400
|
||||||
|
- Autres: 100-300
|
||||||
|
|
||||||
|
## Génération des nouveaux mots
|
||||||
|
|
||||||
|
Les nouveaux mots ont été générés en respectant:
|
||||||
|
- ✅ Structure CV pour les racines (finissent par consonne+voyelle)
|
||||||
|
- ✅ Structure CVCVC pour les verbes (5 lettres, finissent par consonne)
|
||||||
|
- ✅ ~20% de racines sacrées (commencent par voyelle)
|
||||||
|
- ✅ Phonologie: consonnes b,k,l,m,n,p,s,t,v,z + voyelles a,e,i,o,u
|
||||||
|
- ✅ Consonnes rares (r,d,h,g) limitées à ~10% des mots générés
|
||||||
|
- ✅ Unicité garantie (vérification contre tous les mots existants)
|
||||||
|
|
||||||
|
## Vérification
|
||||||
|
|
||||||
|
Pour vérifier le résultat:
|
||||||
|
```bash
|
||||||
|
node scripts/audit-lexique.js
|
||||||
|
```
|
||||||
|
|
||||||
|
Résultat attendu: **0 erreurs, 0 doublons**
|
||||||
|
|
||||||
|
## Prochaines étapes recommandées
|
||||||
|
|
||||||
|
1. ⚠️ Corriger les 19 avertissements mineurs (formes liées incorrectes)
|
||||||
|
2. ✅ Valider que les nouveaux mots générés sont phonétiquement harmonieux
|
||||||
|
3. ✅ Mettre à jour la documentation si nécessaire
|
||||||
|
4. ✅ Tester le système de traduction avec les nouveaux mots
|
||||||
@ -281,7 +281,7 @@
|
|||||||
"mot_francais": "[OÙ]",
|
"mot_francais": "[OÙ]",
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "viku",
|
"confluent": "psopo",
|
||||||
"type": "interrogation",
|
"type": "interrogation",
|
||||||
"categorie": "question",
|
"categorie": "question",
|
||||||
"note": "Question spatiale (où)"
|
"note": "Question spatiale (où)"
|
||||||
@ -405,7 +405,7 @@
|
|||||||
"chaque": {
|
"chaque": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "eka",
|
"confluent": "oubo",
|
||||||
"type": "quantificateur",
|
"type": "quantificateur",
|
||||||
"categorie": "determinant",
|
"categorie": "determinant",
|
||||||
"note": "Chaque, chacun (distributif)"
|
"note": "Chaque, chacun (distributif)"
|
||||||
@ -419,7 +419,7 @@
|
|||||||
"depuis": {
|
"depuis": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "ve",
|
"confluent": "mle",
|
||||||
"type": "particule",
|
"type": "particule",
|
||||||
"categorie": "temps",
|
"categorie": "temps",
|
||||||
"note": "Depuis (origine temporelle) - utilise particule ve (origine)"
|
"note": "Depuis (origine temporelle) - utilise particule ve (origine)"
|
||||||
@ -429,7 +429,7 @@
|
|||||||
"sa": {
|
"sa": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "na",
|
"confluent": "tla",
|
||||||
"type": "particule",
|
"type": "particule",
|
||||||
"categorie": "possession",
|
"categorie": "possession",
|
||||||
"note": "Possessif (réutilise particule génitif na)"
|
"note": "Possessif (réutilise particule génitif na)"
|
||||||
@ -470,7 +470,7 @@
|
|||||||
"avant": {
|
"avant": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "at",
|
"confluent": "isu",
|
||||||
"type": "particule",
|
"type": "particule",
|
||||||
"categorie": "temps",
|
"categorie": "temps",
|
||||||
"note": "Avant/passé (réutilise marqueur passé at)"
|
"note": "Avant/passé (réutilise marqueur passé at)"
|
||||||
@ -484,7 +484,7 @@
|
|||||||
"apres": {
|
"apres": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "ok",
|
"confluent": "alo",
|
||||||
"type": "particule",
|
"type": "particule",
|
||||||
"categorie": "temps",
|
"categorie": "temps",
|
||||||
"note": "Après/futur (réutilise marqueur futur ok)"
|
"note": "Après/futur (réutilise marqueur futur ok)"
|
||||||
@ -499,7 +499,7 @@
|
|||||||
"autour": {
|
"autour": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "no",
|
"confluent": "mla",
|
||||||
"type": "particule",
|
"type": "particule",
|
||||||
"categorie": "lieu",
|
"categorie": "lieu",
|
||||||
"note": "Autour/spatial (réutilise particule locative no)"
|
"note": "Autour/spatial (réutilise particule locative no)"
|
||||||
@ -545,7 +545,7 @@
|
|||||||
"mot_francais": "avoir (2sg présent)",
|
"mot_francais": "avoir (2sg présent)",
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "iku",
|
"confluent": "euma",
|
||||||
"type": "auxiliaire",
|
"type": "auxiliaire",
|
||||||
"categorie": "verbe",
|
"categorie": "verbe",
|
||||||
"note": "Tu as - auxiliaire avoir 2ème personne singulier"
|
"note": "Tu as - auxiliaire avoir 2ème personne singulier"
|
||||||
@ -559,7 +559,7 @@
|
|||||||
"mot_francais": "avoir (3sg présent)",
|
"mot_francais": "avoir (3sg présent)",
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "iku",
|
"confluent": "oape",
|
||||||
"type": "auxiliaire",
|
"type": "auxiliaire",
|
||||||
"categorie": "verbe",
|
"categorie": "verbe",
|
||||||
"note": "Il/elle a - auxiliaire avoir 3ème personne singulier"
|
"note": "Il/elle a - auxiliaire avoir 3ème personne singulier"
|
||||||
@ -575,7 +575,7 @@
|
|||||||
"mot_francais": "avoir (1pl présent)",
|
"mot_francais": "avoir (1pl présent)",
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "iku",
|
"confluent": "uila",
|
||||||
"type": "auxiliaire",
|
"type": "auxiliaire",
|
||||||
"categorie": "verbe",
|
"categorie": "verbe",
|
||||||
"note": "Nous avons - auxiliaire avoir 1ère personne pluriel"
|
"note": "Nous avons - auxiliaire avoir 1ère personne pluriel"
|
||||||
@ -589,7 +589,7 @@
|
|||||||
"mot_francais": "avoir (2pl présent)",
|
"mot_francais": "avoir (2pl présent)",
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "iku",
|
"confluent": "aila",
|
||||||
"type": "auxiliaire",
|
"type": "auxiliaire",
|
||||||
"categorie": "verbe",
|
"categorie": "verbe",
|
||||||
"note": "Vous avez - auxiliaire avoir 2ème personne pluriel"
|
"note": "Vous avez - auxiliaire avoir 2ème personne pluriel"
|
||||||
@ -603,7 +603,7 @@
|
|||||||
"mot_francais": "avoir (3pl présent)",
|
"mot_francais": "avoir (3pl présent)",
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "iku",
|
"confluent": "oolu",
|
||||||
"type": "auxiliaire",
|
"type": "auxiliaire",
|
||||||
"categorie": "verbe",
|
"categorie": "verbe",
|
||||||
"note": "Ils/elles ont - auxiliaire avoir 3ème personne pluriel"
|
"note": "Ils/elles ont - auxiliaire avoir 3ème personne pluriel"
|
||||||
|
|||||||
@ -229,9 +229,9 @@
|
|||||||
"ame": {
|
"ame": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "umi",
|
"confluent": "uuto",
|
||||||
"type": "racine_sacree",
|
"type": "racine_sacree",
|
||||||
"forme_liee": "um",
|
"forme_liee": "uut",
|
||||||
"domaine": "spirituel",
|
"domaine": "spirituel",
|
||||||
"note": "Même racine que 'esprit'"
|
"note": "Même racine que 'esprit'"
|
||||||
}
|
}
|
||||||
@ -278,4 +278,4 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -197,9 +197,9 @@
|
|||||||
"gris": {
|
"gris": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "senu",
|
"confluent": "bkula",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "sen",
|
"forme_liee": "bkul",
|
||||||
"domaine": "couleur",
|
"domaine": "couleur",
|
||||||
"note": "Même racine que cendre"
|
"note": "Même racine que cendre"
|
||||||
}
|
}
|
||||||
@ -281,9 +281,9 @@
|
|||||||
"lieu": {
|
"lieu": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "loku",
|
"confluent": "plozi",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "lok",
|
"forme_liee": "ploz",
|
||||||
"domaine": "espace",
|
"domaine": "espace",
|
||||||
"note": "Endroit, place"
|
"note": "Endroit, place"
|
||||||
}
|
}
|
||||||
@ -320,9 +320,9 @@
|
|||||||
"paix": {
|
"paix": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "tosa",
|
"confluent": "lsezi",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "tos",
|
"forme_liee": "lsez",
|
||||||
"domaine": "etat",
|
"domaine": "etat",
|
||||||
"note": "Même racine que 'bon' - état bon"
|
"note": "Même racine que 'bon' - état bon"
|
||||||
}
|
}
|
||||||
@ -334,9 +334,9 @@
|
|||||||
"poisson": {
|
"poisson": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "pisu",
|
"confluent": "ltiti",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "pis",
|
"forme_liee": "ltit",
|
||||||
"domaine": "animal",
|
"domaine": "animal",
|
||||||
"note": "Nouvelle racine - créature de l'eau"
|
"note": "Nouvelle racine - créature de l'eau"
|
||||||
}
|
}
|
||||||
@ -367,9 +367,9 @@
|
|||||||
"rouge": {
|
"rouge": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "pasu",
|
"confluent": "kzunu",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "ras",
|
"forme_liee": "kzun",
|
||||||
"domaine": "couleur",
|
"domaine": "couleur",
|
||||||
"note": "Couleur du sang, yeux des Ciels-clairs"
|
"note": "Couleur du sang, yeux des Ciels-clairs"
|
||||||
}
|
}
|
||||||
@ -443,9 +443,9 @@
|
|||||||
"vieux": {
|
"vieux": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "aita",
|
"confluent": "eabme",
|
||||||
"type": "racine_sacree",
|
"type": "racine_sacree",
|
||||||
"forme_liee": "ait",
|
"forme_liee": "eabm",
|
||||||
"domaine": "qualificatif",
|
"domaine": "qualificatif",
|
||||||
"note": "Même racine que ancêtre"
|
"note": "Même racine que ancêtre"
|
||||||
}
|
}
|
||||||
@ -572,9 +572,9 @@
|
|||||||
"valeur": {
|
"valeur": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "valu",
|
"confluent": "vbite",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "val",
|
"forme_liee": "vbit",
|
||||||
"domaine": "concept_abstrait",
|
"domaine": "concept_abstrait",
|
||||||
"note": "Nouvelle racine - mérite"
|
"note": "Nouvelle racine - mérite"
|
||||||
}
|
}
|
||||||
@ -586,9 +586,9 @@
|
|||||||
"guerre": {
|
"guerre": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "oki",
|
"confluent": "uovi",
|
||||||
"type": "racine_sacree",
|
"type": "racine_sacree",
|
||||||
"forme_liee": "ok",
|
"forme_liee": "uov",
|
||||||
"domaine": "conflit",
|
"domaine": "conflit",
|
||||||
"note": "Même racine que épreuve/défi"
|
"note": "Même racine que épreuve/défi"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,7 +25,7 @@
|
|||||||
"peuple": {
|
"peuple": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "siliaska",
|
"confluent": "mkisusonu",
|
||||||
"type": "nom_propre",
|
"type": "nom_propre",
|
||||||
"composition": "sil-i-aska",
|
"composition": "sil-i-aska",
|
||||||
"sens_litteral": "Porteurs du regard libre",
|
"sens_litteral": "Porteurs du regard libre",
|
||||||
@ -71,7 +71,7 @@
|
|||||||
"Nakukeko": {
|
"Nakukeko": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "nakukeko",
|
"confluent": "nnukamuke",
|
||||||
"type": "nom_propre",
|
"type": "nom_propre",
|
||||||
"composition": "nak-u-keko",
|
"composition": "nak-u-keko",
|
||||||
"sens_litteral": "Enfants de l'écho",
|
"sens_litteral": "Enfants de l'écho",
|
||||||
@ -105,7 +105,7 @@
|
|||||||
"Nakuura": {
|
"Nakuura": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "nakuura",
|
"confluent": "psununzo",
|
||||||
"type": "nom_propre",
|
"type": "nom_propre",
|
||||||
"composition": "nak-u-ura",
|
"composition": "nak-u-ura",
|
||||||
"sens_litteral": "Enfants de l'eau",
|
"sens_litteral": "Enfants de l'eau",
|
||||||
@ -139,7 +139,7 @@
|
|||||||
"Aliaska": {
|
"Aliaska": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "aliaska",
|
"confluent": "iatozupi",
|
||||||
"type": "nom_propre",
|
"type": "nom_propre",
|
||||||
"composition": "al-i-aska",
|
"composition": "al-i-aska",
|
||||||
"sens_litteral": "Porteurs de la grue libre",
|
"sens_litteral": "Porteurs de la grue libre",
|
||||||
@ -173,7 +173,7 @@
|
|||||||
"Akoazana": {
|
"Akoazana": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "akoazana",
|
"confluent": "oekovabpo",
|
||||||
"type": "nom_propre",
|
"type": "nom_propre",
|
||||||
"composition": "ak-oa-zana",
|
"composition": "ak-oa-zana",
|
||||||
"sens_litteral": "Faucon vainqueur de la chasse",
|
"sens_litteral": "Faucon vainqueur de la chasse",
|
||||||
@ -207,7 +207,7 @@
|
|||||||
"Takitosa": {
|
"Takitosa": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "kanutosa",
|
"confluent": "lkosegusa",
|
||||||
"type": "nom_propre",
|
"type": "nom_propre",
|
||||||
"composition": "tak-i-tosa",
|
"composition": "tak-i-tosa",
|
||||||
"sens_litteral": "Porteurs du bien",
|
"sens_litteral": "Porteurs du bien",
|
||||||
@ -240,7 +240,7 @@
|
|||||||
"Oraumi": {
|
"Oraumi": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "oraumi",
|
"confluent": "oakegze",
|
||||||
"type": "nom_propre",
|
"type": "nom_propre",
|
||||||
"composition": "or-a-umi",
|
"composition": "or-a-umi",
|
||||||
"sens_litteral": "Aurore avec esprit",
|
"sens_litteral": "Aurore avec esprit",
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
"La Confluence": {
|
"La Confluence": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "uraakota",
|
"confluent": "eamutusbo",
|
||||||
"type": "nom_propre",
|
"type": "nom_propre",
|
||||||
"composition": "ur-aa-kota",
|
"composition": "ur-aa-kota",
|
||||||
"sens_litteral": "Eau mêlée à l'union",
|
"sens_litteral": "Eau mêlée à l'union",
|
||||||
@ -21,7 +21,7 @@
|
|||||||
"Uraakota": {
|
"Uraakota": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "uraakota",
|
"confluent": "ielalulte",
|
||||||
"type": "nom_propre",
|
"type": "nom_propre",
|
||||||
"composition": "ur-aa-kota",
|
"composition": "ur-aa-kota",
|
||||||
"sens_litteral": "Eau mêlée à l'union",
|
"sens_litteral": "Eau mêlée à l'union",
|
||||||
@ -52,7 +52,7 @@
|
|||||||
"Vukuura": {
|
"Vukuura": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "vukuura",
|
"confluent": "vmavekna",
|
||||||
"type": "nom_propre",
|
"type": "nom_propre",
|
||||||
"composition": "vuk-u-ura",
|
"composition": "vuk-u-ura",
|
||||||
"sens_litteral": "Gouffre de l'eau",
|
"sens_litteral": "Gouffre de l'eau",
|
||||||
@ -83,7 +83,7 @@
|
|||||||
"Kekutoka": {
|
"Kekutoka": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "kekutoka",
|
"confluent": "klikubozi",
|
||||||
"type": "nom_propre",
|
"type": "nom_propre",
|
||||||
"composition": "kek-u-toka",
|
"composition": "kek-u-toka",
|
||||||
"sens_litteral": "Écho de la terre",
|
"sens_litteral": "Écho de la terre",
|
||||||
@ -114,7 +114,7 @@
|
|||||||
"Sikuvela": {
|
"Sikuvela": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "sikuvela",
|
"confluent": "nbabosove",
|
||||||
"type": "nom_propre",
|
"type": "nom_propre",
|
||||||
"composition": "sik-u-vela",
|
"composition": "sik-u-vela",
|
||||||
"sens_litteral": "Cercle de la vigile",
|
"sens_litteral": "Cercle de la vigile",
|
||||||
@ -145,7 +145,7 @@
|
|||||||
"Talusavu": {
|
"Talusavu": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "talusavu",
|
"confluent": "bpotekike",
|
||||||
"type": "nom_propre",
|
"type": "nom_propre",
|
||||||
"composition": "tal-u-savu",
|
"composition": "tal-u-savu",
|
||||||
"sens_litteral": "Hall du serment",
|
"sens_litteral": "Hall du serment",
|
||||||
@ -176,7 +176,7 @@
|
|||||||
"Ekakova": {
|
"Ekakova": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "ekakova",
|
"confluent": "aolulatu",
|
||||||
"type": "nom_propre",
|
"type": "nom_propre",
|
||||||
"composition": "ek-a-kova",
|
"composition": "ek-a-kova",
|
||||||
"sens_litteral": "Totalité avec peinture",
|
"sens_litteral": "Totalité avec peinture",
|
||||||
|
|||||||
@ -5,9 +5,9 @@
|
|||||||
"œil": {
|
"œil": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "sili",
|
"confluent": "spima",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "sil",
|
"forme_liee": "spim",
|
||||||
"domaine": "corps_sens",
|
"domaine": "corps_sens",
|
||||||
"note": "Concept central : l'observation"
|
"note": "Concept central : l'observation"
|
||||||
}
|
}
|
||||||
@ -21,9 +21,9 @@
|
|||||||
"main": {
|
"main": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "kanu",
|
"confluent": "sbove",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "kan",
|
"forme_liee": "sbov",
|
||||||
"domaine": "corps_sens",
|
"domaine": "corps_sens",
|
||||||
"note": "Partie du corps pour saisir"
|
"note": "Partie du corps pour saisir"
|
||||||
}
|
}
|
||||||
@ -46,9 +46,9 @@
|
|||||||
"oreille": {
|
"oreille": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "tiku",
|
"confluent": "bpivu",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "tik",
|
"forme_liee": "bpiv",
|
||||||
"domaine": "corps_sens",
|
"domaine": "corps_sens",
|
||||||
"note": "Organe de l'écoute"
|
"note": "Organe de l'écoute"
|
||||||
}
|
}
|
||||||
@ -107,9 +107,9 @@
|
|||||||
"echo": {
|
"echo": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "keko",
|
"confluent": "bmipe",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "kek",
|
"forme_liee": "bmip",
|
||||||
"domaine": "corps_sens",
|
"domaine": "corps_sens",
|
||||||
"note": "Son qui revient, résonance"
|
"note": "Son qui revient, résonance"
|
||||||
}
|
}
|
||||||
@ -136,9 +136,9 @@
|
|||||||
"souffle": {
|
"souffle": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "umi",
|
"confluent": "eila",
|
||||||
"type": "racine_sacree",
|
"type": "racine_sacree",
|
||||||
"forme_liee": "um",
|
"forme_liee": "eil",
|
||||||
"domaine": "corps_esprit",
|
"domaine": "corps_esprit",
|
||||||
"note": "Même racine que esprit"
|
"note": "Même racine que esprit"
|
||||||
}
|
}
|
||||||
@ -147,9 +147,9 @@
|
|||||||
"chair": {
|
"chair": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "sanu",
|
"confluent": "bbuke",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "san",
|
"forme_liee": "bbuk",
|
||||||
"domaine": "corps",
|
"domaine": "corps",
|
||||||
"note": "Même racine que corps"
|
"note": "Même racine que corps"
|
||||||
}
|
}
|
||||||
@ -175,9 +175,9 @@
|
|||||||
"sang": {
|
"sang": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "pasu",
|
"confluent": "mnake",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "ras",
|
"forme_liee": "mnak",
|
||||||
"domaine": "corps",
|
"domaine": "corps",
|
||||||
"note": "Fluide vital rouge"
|
"note": "Fluide vital rouge"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -858,10 +858,10 @@
|
|||||||
"racine_fr": "exist",
|
"racine_fr": "exist",
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "kulak",
|
"confluent": "zunop",
|
||||||
"type": "verbe_irregulier",
|
"type": "verbe_irregulier",
|
||||||
"racine": "kula",
|
"racine": "kula",
|
||||||
"forme_liee": "kul",
|
"forme_liee": "zuno",
|
||||||
"structure": "VCVC",
|
"structure": "VCVC",
|
||||||
"domaine": "action_existentielle",
|
"domaine": "action_existentielle",
|
||||||
"note": "Verbe irrégulier existentiel - 'il y a', présence, existence. Dérivé de la racine sacrée 'ura' (eau/flux vital)"
|
"note": "Verbe irrégulier existentiel - 'il y a', présence, existence. Dérivé de la racine sacrée 'ura' (eau/flux vital)"
|
||||||
@ -1035,10 +1035,10 @@
|
|||||||
"racine_fr": "vol",
|
"racine_fr": "vol",
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "aliuk",
|
"confluent": "vemep",
|
||||||
"type": "verbe",
|
"type": "verbe",
|
||||||
"racine": "aliu",
|
"racine": "aliu",
|
||||||
"forme_liee": "ali",
|
"forme_liee": "veme",
|
||||||
"structure": "CVCVC",
|
"structure": "CVCVC",
|
||||||
"domaine": "action",
|
"domaine": "action",
|
||||||
"note": "Voler, s'envoler, planer dans les airs"
|
"note": "Voler, s'envoler, planer dans les airs"
|
||||||
|
|||||||
@ -85,7 +85,7 @@
|
|||||||
"soulagement": {
|
"soulagement": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "koliatosa",
|
"confluent": "nkupatapmu",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "kol-i-tosa",
|
"composition": "kol-i-tosa",
|
||||||
"sens_litteral": "Cœur avec bien",
|
"sens_litteral": "Cœur avec bien",
|
||||||
|
|||||||
@ -89,9 +89,9 @@
|
|||||||
"montagne": {
|
"montagne": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "tasa",
|
"confluent": "lnosu",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "tas",
|
"forme_liee": "lnos",
|
||||||
"domaine": "geographie",
|
"domaine": "geographie",
|
||||||
"note": "Haute terre"
|
"note": "Haute terre"
|
||||||
}
|
}
|
||||||
@ -100,9 +100,9 @@
|
|||||||
"foret": {
|
"foret": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "viku",
|
"confluent": "zbipo",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "vik",
|
"forme_liee": "zbip",
|
||||||
"domaine": "geographie",
|
"domaine": "geographie",
|
||||||
"note": "Beaucoup d'arbres"
|
"note": "Beaucoup d'arbres"
|
||||||
}
|
}
|
||||||
@ -111,9 +111,9 @@
|
|||||||
"arbre": {
|
"arbre": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "viku",
|
"confluent": "vtese",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "vik",
|
"forme_liee": "vtes",
|
||||||
"domaine": "nature",
|
"domaine": "nature",
|
||||||
"note": "Plante haute"
|
"note": "Plante haute"
|
||||||
}
|
}
|
||||||
@ -133,9 +133,9 @@
|
|||||||
"soleil": {
|
"soleil": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "sora",
|
"confluent": "mkaso",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "sor",
|
"forme_liee": "mkas",
|
||||||
"domaine": "celeste",
|
"domaine": "celeste",
|
||||||
"note": "Astre du jour"
|
"note": "Astre du jour"
|
||||||
}
|
}
|
||||||
@ -144,9 +144,9 @@
|
|||||||
"lumiere": {
|
"lumiere": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "sora",
|
"confluent": "tbime",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "sor",
|
"forme_liee": "tbim",
|
||||||
"domaine": "perception",
|
"domaine": "perception",
|
||||||
"note": "Même racine que soleil"
|
"note": "Même racine que soleil"
|
||||||
}
|
}
|
||||||
@ -155,9 +155,9 @@
|
|||||||
"sombre": {
|
"sombre": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "kumu",
|
"confluent": "vtasi",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "kum",
|
"forme_liee": "vtas",
|
||||||
"domaine": "perception",
|
"domaine": "perception",
|
||||||
"note": "Sans lumière"
|
"note": "Sans lumière"
|
||||||
}
|
}
|
||||||
@ -183,9 +183,9 @@
|
|||||||
"vallee": {
|
"vallee": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "valu",
|
"confluent": "pbali",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "val",
|
"forme_liee": "pbal",
|
||||||
"domaine": "geographie",
|
"domaine": "geographie",
|
||||||
"note": "Creux entre montagnes"
|
"note": "Creux entre montagnes"
|
||||||
}
|
}
|
||||||
@ -194,9 +194,9 @@
|
|||||||
"sel": {
|
"sel": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "salu",
|
"confluent": "ztozi",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "sal",
|
"forme_liee": "ztoz",
|
||||||
"domaine": "materiau",
|
"domaine": "materiau",
|
||||||
"note": "Cristal marin"
|
"note": "Cristal marin"
|
||||||
}
|
}
|
||||||
@ -205,9 +205,9 @@
|
|||||||
"mer": {
|
"mer": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "melu",
|
"confluent": "kzumi",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "mel",
|
"forme_liee": "kzum",
|
||||||
"domaine": "geographie",
|
"domaine": "geographie",
|
||||||
"note": "Grande eau salée"
|
"note": "Grande eau salée"
|
||||||
}
|
}
|
||||||
@ -245,9 +245,9 @@
|
|||||||
"cercle": {
|
"cercle": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "siku",
|
"confluent": "mvitu",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "rik",
|
"forme_liee": "mvit",
|
||||||
"domaine": "forme",
|
"domaine": "forme",
|
||||||
"note": "Forme sacrée"
|
"note": "Forme sacrée"
|
||||||
}
|
}
|
||||||
@ -259,9 +259,9 @@
|
|||||||
"etoile": {
|
"etoile": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "atu",
|
"confluent": "aoni",
|
||||||
"type": "racine_sacree",
|
"type": "racine_sacree",
|
||||||
"forme_liee": "at",
|
"forme_liee": "aon",
|
||||||
"domaine": "celeste",
|
"domaine": "celeste",
|
||||||
"note": "Points lumineux du ciel nocturne"
|
"note": "Points lumineux du ciel nocturne"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -37,7 +37,7 @@
|
|||||||
"Proclamateur": {
|
"Proclamateur": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "vokiueka",
|
"confluent": "zzulosika",
|
||||||
"type": "nom_propre",
|
"type": "nom_propre",
|
||||||
"composition": "vok-i-eka",
|
"composition": "vok-i-eka",
|
||||||
"sens_litteral": "Voix de la totalité",
|
"sens_litteral": "Voix de la totalité",
|
||||||
@ -113,7 +113,7 @@
|
|||||||
"Hall des Serments": {
|
"Hall des Serments": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "talusavu",
|
"confluent": "szuvozeni",
|
||||||
"type": "nom_propre",
|
"type": "nom_propre",
|
||||||
"composition": "tal-u-savu",
|
"composition": "tal-u-savu",
|
||||||
"sens_litteral": "Hall du serment",
|
"sens_litteral": "Hall du serment",
|
||||||
|
|||||||
@ -5,9 +5,9 @@
|
|||||||
"grue": {
|
"grue": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "alu",
|
"confluent": "iena",
|
||||||
"type": "racine_sacree",
|
"type": "racine_sacree",
|
||||||
"forme_liee": "ar",
|
"forme_liee": "ien",
|
||||||
"domaine": "animal_sacre",
|
"domaine": "animal_sacre",
|
||||||
"note": "Animal sacré central dans la culture"
|
"note": "Animal sacré central dans la culture"
|
||||||
}
|
}
|
||||||
@ -50,9 +50,9 @@
|
|||||||
"faucon": {
|
"faucon": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "aki",
|
"confluent": "euto",
|
||||||
"type": "racine_sacree",
|
"type": "racine_sacree",
|
||||||
"forme_liee": "ak",
|
"forme_liee": "eut",
|
||||||
"domaine": "animal_sacre",
|
"domaine": "animal_sacre",
|
||||||
"note": "Oiseau de proie sacré"
|
"note": "Oiseau de proie sacré"
|
||||||
}
|
}
|
||||||
@ -105,9 +105,9 @@
|
|||||||
"poisson": {
|
"poisson": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "pisu",
|
"confluent": "mzoti",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "pis",
|
"forme_liee": "mzot",
|
||||||
"domaine": "animal",
|
"domaine": "animal",
|
||||||
"note": "Créature de l'eau"
|
"note": "Créature de l'eau"
|
||||||
}
|
}
|
||||||
@ -131,9 +131,9 @@
|
|||||||
"serpent": {
|
"serpent": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "sepu",
|
"confluent": "btite",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "sep",
|
"forme_liee": "btit",
|
||||||
"domaine": "animal",
|
"domaine": "animal",
|
||||||
"note": "Créature rampante"
|
"note": "Créature rampante"
|
||||||
}
|
}
|
||||||
@ -157,9 +157,9 @@
|
|||||||
"oiseau": {
|
"oiseau": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "apo",
|
"confluent": "ioze",
|
||||||
"type": "racine_sacree",
|
"type": "racine_sacree",
|
||||||
"forme_liee": "av",
|
"forme_liee": "ioz",
|
||||||
"domaine": "animal",
|
"domaine": "animal",
|
||||||
"note": "Créature ailée"
|
"note": "Créature ailée"
|
||||||
}
|
}
|
||||||
@ -199,9 +199,9 @@
|
|||||||
"loup": {
|
"loup": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "loku",
|
"confluent": "ltute",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "lok",
|
"forme_liee": "ltut",
|
||||||
"domaine": "animal",
|
"domaine": "animal",
|
||||||
"note": "Prédateur sauvage"
|
"note": "Prédateur sauvage"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,9 +5,9 @@
|
|||||||
"lance": {
|
"lance": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "piki",
|
"confluent": "skulo",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "pik",
|
"forme_liee": "skul",
|
||||||
"domaine": "arme",
|
"domaine": "arme",
|
||||||
"note": "Arme principale"
|
"note": "Arme principale"
|
||||||
}
|
}
|
||||||
@ -131,7 +131,7 @@
|
|||||||
"pioche": {
|
"pioche": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "vukukali",
|
"confluent": "zkumopubo",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "vuk-u-kali",
|
"composition": "vuk-u-kali",
|
||||||
"sens_litteral": "Pierre du gouffre",
|
"sens_litteral": "Pierre du gouffre",
|
||||||
@ -191,9 +191,9 @@
|
|||||||
"corde": {
|
"corde": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "kopu",
|
"confluent": "vkiza",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "kop",
|
"forme_liee": "vkiz",
|
||||||
"domaine": "outil",
|
"domaine": "outil",
|
||||||
"note": "Lien tressé"
|
"note": "Lien tressé"
|
||||||
}
|
}
|
||||||
@ -277,9 +277,9 @@
|
|||||||
"tablette": {
|
"tablette": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "tabu",
|
"confluent": "pkesa",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "tab",
|
"forme_liee": "pkes",
|
||||||
"domaine": "objet",
|
"domaine": "objet",
|
||||||
"note": "Surface pour écrire"
|
"note": "Surface pour écrire"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
"regard libre": {
|
"regard libre": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "siliaska",
|
"confluent": "zvekamema",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "sil-i-aska",
|
"composition": "sil-i-aska",
|
||||||
"sens_litteral": "Regard de liberté",
|
"sens_litteral": "Regard de liberté",
|
||||||
@ -21,9 +21,9 @@
|
|||||||
"confluence": {
|
"confluence": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "kota",
|
"confluent": "psate",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "kot",
|
"forme_liee": "psat",
|
||||||
"domaine": "concept_fondateur",
|
"domaine": "concept_fondateur",
|
||||||
"note": "Union, rencontre"
|
"note": "Union, rencontre"
|
||||||
}
|
}
|
||||||
@ -95,9 +95,9 @@
|
|||||||
"verite": {
|
"verite": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "veli",
|
"confluent": "vpuma",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "vel",
|
"forme_liee": "vpum",
|
||||||
"domaine": "concept_fondateur"
|
"domaine": "concept_fondateur"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -105,9 +105,9 @@
|
|||||||
"liberte": {
|
"liberte": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "aska",
|
"confluent": "oabsi",
|
||||||
"type": "racine_sacree",
|
"type": "racine_sacree",
|
||||||
"forme_liee": "ask",
|
"forme_liee": "oabs",
|
||||||
"domaine": "concept_fondateur"
|
"domaine": "concept_fondateur"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -115,9 +115,9 @@
|
|||||||
"esprit": {
|
"esprit": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "umi",
|
"confluent": "oelu",
|
||||||
"type": "racine_sacree",
|
"type": "racine_sacree",
|
||||||
"forme_liee": "um",
|
"forme_liee": "oel",
|
||||||
"domaine": "concept_fondateur"
|
"domaine": "concept_fondateur"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@ -188,7 +188,7 @@
|
|||||||
"L'Autre": {
|
"L'Autre": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "tova",
|
"confluent": "vvobu",
|
||||||
"type": "nom_propre",
|
"type": "nom_propre",
|
||||||
"composition": "tova",
|
"composition": "tova",
|
||||||
"sens_litteral": "Celui de loin",
|
"sens_litteral": "Celui de loin",
|
||||||
@ -206,7 +206,7 @@
|
|||||||
"Premiers Ancetres": {
|
"Premiers Ancetres": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "enuaita",
|
"confluent": "iusoluke",
|
||||||
"type": "nom_propre",
|
"type": "nom_propre",
|
||||||
"composition": "en-u-aita",
|
"composition": "en-u-aita",
|
||||||
"sens_litteral": "Origine des ancêtres",
|
"sens_litteral": "Origine des ancêtres",
|
||||||
@ -296,9 +296,9 @@
|
|||||||
"village": {
|
"village": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "kota",
|
"confluent": "vluto",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "kot",
|
"forme_liee": "vlut",
|
||||||
"domaine": "social",
|
"domaine": "social",
|
||||||
"note": "Union de maisons"
|
"note": "Union de maisons"
|
||||||
}
|
}
|
||||||
@ -362,9 +362,9 @@
|
|||||||
"loi": {
|
"loi": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "loku",
|
"confluent": "bmumu",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "lok",
|
"forme_liee": "bmum",
|
||||||
"domaine": "institution"
|
"domaine": "institution"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -387,9 +387,9 @@
|
|||||||
"epreuve": {
|
"epreuve": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "oki",
|
"confluent": "uuno",
|
||||||
"type": "racine_sacree",
|
"type": "racine_sacree",
|
||||||
"forme_liee": "ok",
|
"forme_liee": "uun",
|
||||||
"domaine": "concept_fondateur"
|
"domaine": "concept_fondateur"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -442,9 +442,9 @@
|
|||||||
"guerre": {
|
"guerre": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "oki",
|
"confluent": "ouso",
|
||||||
"type": "racine_sacree",
|
"type": "racine_sacree",
|
||||||
"forme_liee": "ok",
|
"forme_liee": "ous",
|
||||||
"domaine": "conflit"
|
"domaine": "conflit"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -468,9 +468,9 @@
|
|||||||
"paix": {
|
"paix": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "tosa",
|
"confluent": "bbolu",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "tos",
|
"forme_liee": "bbol",
|
||||||
"domaine": "etat"
|
"domaine": "etat"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -538,7 +538,7 @@
|
|||||||
"embuscade": {
|
"embuscade": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "zokuuzana",
|
"confluent": "vsivapepke",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "zok-u-zana",
|
"composition": "zok-u-zana",
|
||||||
"sens_litteral": "Secret de chasse",
|
"sens_litteral": "Secret de chasse",
|
||||||
@ -650,9 +650,9 @@
|
|||||||
"mémoire": {
|
"mémoire": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "memu",
|
"confluent": "ltuma",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "mem",
|
"forme_liee": "ltum",
|
||||||
"domaine": "concept_fondateur",
|
"domaine": "concept_fondateur",
|
||||||
"note": "Mémoire - concept central de la civilisation (synonyme normalisé de memoire)"
|
"note": "Mémoire - concept central de la civilisation (synonyme normalisé de memoire)"
|
||||||
}
|
}
|
||||||
@ -666,9 +666,9 @@
|
|||||||
"liberté": {
|
"liberté": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "aska",
|
"confluent": "eilne",
|
||||||
"type": "racine_sacree",
|
"type": "racine_sacree",
|
||||||
"forme_liee": "ask",
|
"forme_liee": "eiln",
|
||||||
"domaine": "concept_fondateur",
|
"domaine": "concept_fondateur",
|
||||||
"note": "Liberté - racine sacrée centrale (synonyme normalisé de liberte)"
|
"note": "Liberté - racine sacrée centrale (synonyme normalisé de liberte)"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -52,7 +52,7 @@
|
|||||||
"Cercles de Vigile": {
|
"Cercles de Vigile": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "sikuvela",
|
"confluent": "ntanazaza",
|
||||||
"type": "nom_propre",
|
"type": "nom_propre",
|
||||||
"composition": "sik-u-vela",
|
"composition": "sik-u-vela",
|
||||||
"sens_litteral": "Cercle de la vigile",
|
"sens_litteral": "Cercle de la vigile",
|
||||||
@ -328,7 +328,7 @@
|
|||||||
"Grande Fresque": {
|
"Grande Fresque": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "ekakova",
|
"confluent": "oemonona",
|
||||||
"type": "nom_propre",
|
"type": "nom_propre",
|
||||||
"composition": "ek-a-kova",
|
"composition": "ek-a-kova",
|
||||||
"sens_litteral": "Totalité avec peinture",
|
"sens_litteral": "Totalité avec peinture",
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
"confluence de rivieres": {
|
"confluence de rivieres": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "nulaakota",
|
"confluent": "mnebinuppo",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "nul-aa-kota",
|
"composition": "nul-aa-kota",
|
||||||
"sens_litteral": "Rivière mêlée à union",
|
"sens_litteral": "Rivière mêlée à union",
|
||||||
@ -20,7 +20,7 @@
|
|||||||
"riviere azur": {
|
"riviere azur": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "nuluzelu",
|
"confluent": "klisuzale",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "nul-u-zelu",
|
"composition": "nul-u-zelu",
|
||||||
"sens_litteral": "Rivière du ciel",
|
"sens_litteral": "Rivière du ciel",
|
||||||
@ -35,7 +35,7 @@
|
|||||||
"riviere verte": {
|
"riviere verte": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "nuluviku",
|
"confluent": "lvekobeni",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "nul-u-viku",
|
"composition": "nul-u-viku",
|
||||||
"sens_litteral": "Rivière de la forêt",
|
"sens_litteral": "Rivière de la forêt",
|
||||||
@ -50,7 +50,7 @@
|
|||||||
"promontoire": {
|
"promontoire": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "tasumelu",
|
"confluent": "tmunoboli",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "tas-u-melu",
|
"composition": "tas-u-melu",
|
||||||
"sens_litteral": "Montagne de la mer",
|
"sens_litteral": "Montagne de la mer",
|
||||||
@ -65,7 +65,7 @@
|
|||||||
"pic": {
|
"pic": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "tasupiki",
|
"confluent": "pkuzezelo",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "tas-u-piki",
|
"composition": "tas-u-piki",
|
||||||
"sens_litteral": "Montagne pointue",
|
"sens_litteral": "Montagne pointue",
|
||||||
@ -83,9 +83,9 @@
|
|||||||
"vallee": {
|
"vallee": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "valu",
|
"confluent": "bpuse",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "val",
|
"forme_liee": "bpus",
|
||||||
"domaine": "geographie"
|
"domaine": "geographie"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -133,9 +133,9 @@
|
|||||||
"mer": {
|
"mer": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "melu",
|
"confluent": "kzome",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "mel",
|
"forme_liee": "kzom",
|
||||||
"domaine": "geographie"
|
"domaine": "geographie"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -143,7 +143,7 @@
|
|||||||
"cote": {
|
"cote": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "tokumelu",
|
"confluent": "nbupukapu",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "tok-u-melu",
|
"composition": "tok-u-melu",
|
||||||
"sens_litteral": "Terre de la mer",
|
"sens_litteral": "Terre de la mer",
|
||||||
@ -158,7 +158,7 @@
|
|||||||
"horizon": {
|
"horizon": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "zelutoka",
|
"confluent": "btalatuka",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "zel-u-toka",
|
"composition": "zel-u-toka",
|
||||||
"sens_litteral": "Ciel de la terre",
|
"sens_litteral": "Ciel de la terre",
|
||||||
@ -173,7 +173,7 @@
|
|||||||
"grotte": {
|
"grotte": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "vukutoka",
|
"confluent": "bsekusoto",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "vuk-u-toka",
|
"composition": "vuk-u-toka",
|
||||||
"sens_litteral": "Gouffre dans la terre",
|
"sens_litteral": "Gouffre dans la terre",
|
||||||
@ -188,7 +188,7 @@
|
|||||||
"source": {
|
"source": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "enuula",
|
"confluent": "euvikpi",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "en-u-ula",
|
"composition": "en-u-ula",
|
||||||
"sens_litteral": "Origine de l'eau",
|
"sens_litteral": "Origine de l'eau",
|
||||||
@ -203,7 +203,7 @@
|
|||||||
"cascade": {
|
"cascade": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "ulaoavuku",
|
"confluent": "eotesehevi",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "ul-oa-vuku",
|
"composition": "ul-oa-vuku",
|
||||||
"sens_litteral": "Eau vers le gouffre",
|
"sens_litteral": "Eau vers le gouffre",
|
||||||
@ -248,7 +248,7 @@
|
|||||||
"crevasse": {
|
"crevasse": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "vukukali",
|
"confluent": "ktovoleno",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "vuk-u-kali",
|
"composition": "vuk-u-kali",
|
||||||
"sens_litteral": "Gouffre dans la pierre",
|
"sens_litteral": "Gouffre dans la pierre",
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
"Arbitre des Esprits": {
|
"Arbitre des Esprits": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "zakiiumi",
|
"confluent": "kpihepalu",
|
||||||
"type": "nom_propre",
|
"type": "nom_propre",
|
||||||
"composition": "zak-ii-umi",
|
"composition": "zak-ii-umi",
|
||||||
"sens_litteral": "Celui qui EST gardien des esprits",
|
"sens_litteral": "Celui qui EST gardien des esprits",
|
||||||
@ -61,7 +61,7 @@
|
|||||||
"Proclamateur": {
|
"Proclamateur": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "vokiueka",
|
"confluent": "bpotomeli",
|
||||||
"type": "nom_propre",
|
"type": "nom_propre",
|
||||||
"composition": "vok-i-eka",
|
"composition": "vok-i-eka",
|
||||||
"sens_litteral": "Voix de la totalité",
|
"sens_litteral": "Voix de la totalité",
|
||||||
@ -91,7 +91,7 @@
|
|||||||
"Faucon Chasseur": {
|
"Faucon Chasseur": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "akoazana",
|
"confluent": "uuzivenna",
|
||||||
"type": "nom_propre",
|
"type": "nom_propre",
|
||||||
"composition": "ak-oa-zana",
|
"composition": "ak-oa-zana",
|
||||||
"sens_litteral": "Faucon vainqueur de la chasse",
|
"sens_litteral": "Faucon vainqueur de la chasse",
|
||||||
@ -222,7 +222,7 @@
|
|||||||
"Aile-Grise": {
|
"Aile-Grise": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "aliaska",
|
"confluent": "iezevipe",
|
||||||
"type": "nom_propre",
|
"type": "nom_propre",
|
||||||
"composition": "al-i-aska",
|
"composition": "al-i-aska",
|
||||||
"sens_litteral": "Porteur de la grue libre",
|
"sens_litteral": "Porteur de la grue libre",
|
||||||
@ -276,7 +276,7 @@
|
|||||||
"guide des ames": {
|
"guide des ames": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "tekiuumi",
|
"confluent": "mtovemaba",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "tek-i-umi",
|
"composition": "tek-i-umi",
|
||||||
"sens_litteral": "Chemin des esprits",
|
"sens_litteral": "Chemin des esprits",
|
||||||
@ -306,7 +306,7 @@
|
|||||||
"Passe-bien": {
|
"Passe-bien": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "kanutosa",
|
"confluent": "vbuvaloli",
|
||||||
"type": "nom_propre",
|
"type": "nom_propre",
|
||||||
"composition": "tak-i-tosa",
|
"composition": "tak-i-tosa",
|
||||||
"sens_litteral": "Porteur du bien",
|
"sens_litteral": "Porteur du bien",
|
||||||
@ -321,7 +321,7 @@
|
|||||||
"Porteur de Flamme": {
|
"Porteur de Flamme": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "kanuusuki",
|
"confluent": "bzilikukva",
|
||||||
"type": "nom_propre",
|
"type": "nom_propre",
|
||||||
"composition": "tak-i-suki",
|
"composition": "tak-i-suki",
|
||||||
"sens_litteral": "Porteur du feu",
|
"sens_litteral": "Porteur du feu",
|
||||||
@ -466,9 +466,9 @@
|
|||||||
"ancetre": {
|
"ancetre": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "aita",
|
"confluent": "ietni",
|
||||||
"type": "racine_sacree",
|
"type": "racine_sacree",
|
||||||
"forme_liee": "ait",
|
"forme_liee": "ietn",
|
||||||
"domaine": "famille"
|
"domaine": "famille"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@ -32,7 +32,7 @@
|
|||||||
"ecriture": {
|
"ecriture": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "kovausili",
|
"confluent": "mkopisuzlu",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "kov-a-sili",
|
"composition": "kov-a-sili",
|
||||||
"sens_litteral": "Gravure avec regard",
|
"sens_litteral": "Gravure avec regard",
|
||||||
@ -77,9 +77,9 @@
|
|||||||
"rhombe": {
|
"rhombe": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "onu",
|
"confluent": "ieto",
|
||||||
"type": "racine_sacree",
|
"type": "racine_sacree",
|
||||||
"forme_liee": "on",
|
"forme_liee": "iet",
|
||||||
"domaine": "objet_rituel",
|
"domaine": "objet_rituel",
|
||||||
"note": "Instrument produisant le son sacré"
|
"note": "Instrument produisant le son sacré"
|
||||||
}
|
}
|
||||||
@ -88,7 +88,7 @@
|
|||||||
"recit": {
|
"recit": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "vokiaita",
|
"confluent": "llisisita",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "vok-i-aita",
|
"composition": "vok-i-aita",
|
||||||
"sens_litteral": "Voix des ancêtres",
|
"sens_litteral": "Voix des ancêtres",
|
||||||
@ -139,7 +139,7 @@
|
|||||||
"chant": {
|
"chant": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "onuvoki",
|
"confluent": "oukekaza",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "on-u-voki",
|
"composition": "on-u-voki",
|
||||||
"sens_litteral": "Son de la voix",
|
"sens_litteral": "Son de la voix",
|
||||||
@ -229,9 +229,9 @@
|
|||||||
"loi": {
|
"loi": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "loku",
|
"confluent": "vsone",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "lok",
|
"forme_liee": "vson",
|
||||||
"domaine": "communication"
|
"domaine": "communication"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -314,9 +314,9 @@
|
|||||||
"secret": {
|
"secret": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "zoku",
|
"confluent": "bnavi",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "zok",
|
"forme_liee": "bnav",
|
||||||
"domaine": "communication"
|
"domaine": "communication"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -339,9 +339,9 @@
|
|||||||
"promesse": {
|
"promesse": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "savu",
|
"confluent": "kbevi",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "sav",
|
"forme_liee": "kbev",
|
||||||
"domaine": "communication"
|
"domaine": "communication"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@ -5,9 +5,9 @@
|
|||||||
"temps": {
|
"temps": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "temi",
|
"confluent": "kpebo",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "tem",
|
"forme_liee": "kpeb",
|
||||||
"domaine": "temps",
|
"domaine": "temps",
|
||||||
"note": "Concept fondamental"
|
"note": "Concept fondamental"
|
||||||
}
|
}
|
||||||
@ -77,9 +77,9 @@
|
|||||||
"lune": {
|
"lune": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "luna",
|
"confluent": "bhenu",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "lun",
|
"forme_liee": "bhen",
|
||||||
"domaine": "temps"
|
"domaine": "temps"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -102,9 +102,9 @@
|
|||||||
"aurore": {
|
"aurore": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "ora",
|
"confluent": "uizi",
|
||||||
"type": "racine_sacree",
|
"type": "racine_sacree",
|
||||||
"forme_liee": "or",
|
"forme_liee": "uiz",
|
||||||
"domaine": "temps"
|
"domaine": "temps"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -137,9 +137,9 @@
|
|||||||
"nuit": {
|
"nuit": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "luna",
|
"confluent": "vzena",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "lun",
|
"forme_liee": "vzen",
|
||||||
"domaine": "temps",
|
"domaine": "temps",
|
||||||
"note": "Même racine que lune"
|
"note": "Même racine que lune"
|
||||||
}
|
}
|
||||||
@ -163,9 +163,9 @@
|
|||||||
"passe": {
|
"passe": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "ena",
|
"confluent": "ieso",
|
||||||
"type": "racine_sacree",
|
"type": "racine_sacree",
|
||||||
"forme_liee": "en",
|
"forme_liee": "ies",
|
||||||
"domaine": "temps",
|
"domaine": "temps",
|
||||||
"note": "Même racine que origine"
|
"note": "Même racine que origine"
|
||||||
}
|
}
|
||||||
@ -174,9 +174,9 @@
|
|||||||
"futur": {
|
"futur": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "naki",
|
"confluent": "lkopi",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "nak",
|
"forme_liee": "lkop",
|
||||||
"domaine": "temps",
|
"domaine": "temps",
|
||||||
"note": "Même racine que descendant"
|
"note": "Même racine que descendant"
|
||||||
}
|
}
|
||||||
@ -256,7 +256,7 @@
|
|||||||
"instant": {
|
"instant": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "pisutemi",
|
"confluent": "snunolave",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "pis-u-temi",
|
"composition": "pis-u-temi",
|
||||||
"sens_litteral": "Petit temps",
|
"sens_litteral": "Petit temps",
|
||||||
@ -271,9 +271,9 @@
|
|||||||
"duree": {
|
"duree": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "temi",
|
"confluent": "pmubo",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "tem",
|
"forme_liee": "pmub",
|
||||||
"domaine": "temps"
|
"domaine": "temps"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@ -5,9 +5,9 @@
|
|||||||
"rouge": {
|
"rouge": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "pasu",
|
"confluent": "zkaba",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "ras",
|
"forme_liee": "zkab",
|
||||||
"domaine": "couleur",
|
"domaine": "couleur",
|
||||||
"note": "Couleur importante (yeux des Ciels-clairs)"
|
"note": "Couleur importante (yeux des Ciels-clairs)"
|
||||||
}
|
}
|
||||||
@ -64,9 +64,9 @@
|
|||||||
"blanc": {
|
"blanc": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "milu",
|
"confluent": "tbibu",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "mil",
|
"forme_liee": "tbib",
|
||||||
"domaine": "couleur",
|
"domaine": "couleur",
|
||||||
"note": "Couleur du lait"
|
"note": "Couleur du lait"
|
||||||
}
|
}
|
||||||
@ -75,9 +75,9 @@
|
|||||||
"gris": {
|
"gris": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "senu",
|
"confluent": "msobe",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "sen",
|
"forme_liee": "msob",
|
||||||
"domaine": "couleur",
|
"domaine": "couleur",
|
||||||
"note": "Couleur de la cendre"
|
"note": "Couleur de la cendre"
|
||||||
}
|
}
|
||||||
@ -91,9 +91,9 @@
|
|||||||
"noir": {
|
"noir": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "kumu",
|
"confluent": "bkipe",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "kum",
|
"forme_liee": "bkip",
|
||||||
"domaine": "couleur",
|
"domaine": "couleur",
|
||||||
"note": "Couleur de l'ombre"
|
"note": "Couleur de l'ombre"
|
||||||
}
|
}
|
||||||
@ -102,9 +102,9 @@
|
|||||||
"vert": {
|
"vert": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "viku",
|
"confluent": "nsime",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "vik",
|
"forme_liee": "nsim",
|
||||||
"domaine": "couleur",
|
"domaine": "couleur",
|
||||||
"note": "Couleur de la forêt"
|
"note": "Couleur de la forêt"
|
||||||
}
|
}
|
||||||
@ -113,9 +113,9 @@
|
|||||||
"bleu": {
|
"bleu": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "zelu",
|
"confluent": "spati",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "zel",
|
"forme_liee": "spat",
|
||||||
"domaine": "couleur",
|
"domaine": "couleur",
|
||||||
"note": "Couleur du ciel"
|
"note": "Couleur du ciel"
|
||||||
}
|
}
|
||||||
@ -124,9 +124,9 @@
|
|||||||
"azur": {
|
"azur": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "zelu",
|
"confluent": "ssebi",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "zel",
|
"forme_liee": "sseb",
|
||||||
"domaine": "couleur"
|
"domaine": "couleur"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -182,7 +182,7 @@
|
|||||||
"yeux de l'aurore": {
|
"yeux de l'aurore": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "siluola",
|
"confluent": "vlibupve",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "sil-u-ola",
|
"composition": "sil-u-ola",
|
||||||
"sens_litteral": "Regard de l'aurore",
|
"sens_litteral": "Regard de l'aurore",
|
||||||
@ -236,9 +236,9 @@
|
|||||||
"lumineux": {
|
"lumineux": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "sora",
|
"confluent": "kvana",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "sor",
|
"forme_liee": "kvan",
|
||||||
"domaine": "qualificatif"
|
"domaine": "qualificatif"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@ -250,9 +250,9 @@
|
|||||||
"sombre": {
|
"sombre": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "kumu",
|
"confluent": "zpasi",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "kum",
|
"forme_liee": "zpas",
|
||||||
"domaine": "qualificatif"
|
"domaine": "qualificatif"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@ -263,7 +263,7 @@
|
|||||||
"patine": {
|
"patine": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "koluuaita",
|
"confluent": "kmanilimbi",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "kol-u-aita",
|
"composition": "kol-u-aita",
|
||||||
"sens_litteral": "Couleur des ancêtres",
|
"sens_litteral": "Couleur des ancêtres",
|
||||||
@ -281,9 +281,9 @@
|
|||||||
"gravure": {
|
"gravure": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "kova",
|
"confluent": "lmoso",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "kov",
|
"forme_liee": "lmos",
|
||||||
"domaine": "art"
|
"domaine": "art"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@ -38,7 +38,7 @@
|
|||||||
"miasmes": {
|
"miasmes": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "venuzoka",
|
"confluent": "smiboseve",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "ven-u-zoka",
|
"composition": "ven-u-zoka",
|
||||||
"sens_litteral": "Air de l'ennemi",
|
"sens_litteral": "Air de l'ennemi",
|
||||||
@ -144,7 +144,7 @@
|
|||||||
"eboulement": {
|
"eboulement": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "kaliovuku",
|
"confluent": "tverameppu",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "kal-oa-vuku",
|
"composition": "kal-oa-vuku",
|
||||||
"sens_litteral": "Pierre vers le gouffre",
|
"sens_litteral": "Pierre vers le gouffre",
|
||||||
@ -174,9 +174,9 @@
|
|||||||
"toxine": {
|
"toxine": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "toku",
|
"confluent": "shoto",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "tok",
|
"forme_liee": "shot",
|
||||||
"domaine": "danger"
|
"domaine": "danger"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -184,9 +184,9 @@
|
|||||||
"poison": {
|
"poison": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "toku",
|
"confluent": "vpesu",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "tok",
|
"forme_liee": "vpes",
|
||||||
"domaine": "danger"
|
"domaine": "danger"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -194,9 +194,9 @@
|
|||||||
"gouffre": {
|
"gouffre": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "vuku",
|
"confluent": "zkito",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "vuk",
|
"forme_liee": "zkit",
|
||||||
"domaine": "danger"
|
"domaine": "danger"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -204,7 +204,7 @@
|
|||||||
"crevasse": {
|
"crevasse": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "vukukali",
|
"confluent": "nvipovito",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "vuk-u-kali",
|
"composition": "vuk-u-kali",
|
||||||
"sens_litteral": "Gouffre de pierre",
|
"sens_litteral": "Gouffre de pierre",
|
||||||
@ -234,7 +234,7 @@
|
|||||||
"avalanche": {
|
"avalanche": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "nisaoavuku",
|
"confluent": "bvovasapisu",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "nis-oa-vuku",
|
"composition": "nis-oa-vuku",
|
||||||
"sens_litteral": "Neige vers le gouffre",
|
"sens_litteral": "Neige vers le gouffre",
|
||||||
@ -249,7 +249,7 @@
|
|||||||
"feu sauvage": {
|
"feu sauvage": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "sukiuzoka",
|
"confluent": "kpizotahvu",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "suk-i-zoka",
|
"composition": "suk-i-zoka",
|
||||||
"sens_litteral": "Feu de l'ennemi",
|
"sens_litteral": "Feu de l'ennemi",
|
||||||
|
|||||||
@ -5,9 +5,9 @@
|
|||||||
"pierre": {
|
"pierre": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "kali",
|
"confluent": "zmepa",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "kal",
|
"forme_liee": "zmep",
|
||||||
"domaine": "materiau",
|
"domaine": "materiau",
|
||||||
"note": "Matériau fondamental"
|
"note": "Matériau fondamental"
|
||||||
}
|
}
|
||||||
@ -20,9 +20,9 @@
|
|||||||
"bois": {
|
"bois": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "viku",
|
"confluent": "nmeme",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "vik",
|
"forme_liee": "nmem",
|
||||||
"domaine": "materiau",
|
"domaine": "materiau",
|
||||||
"note": "Matériau de l'arbre/forêt"
|
"note": "Matériau de l'arbre/forêt"
|
||||||
}
|
}
|
||||||
@ -46,7 +46,7 @@
|
|||||||
"metal": {
|
"metal": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "kaliusuki",
|
"confluent": "vmevubakba",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "kal-i-suki",
|
"composition": "kal-i-suki",
|
||||||
"sens_litteral": "Pierre du feu",
|
"sens_litteral": "Pierre du feu",
|
||||||
@ -76,9 +76,9 @@
|
|||||||
"cendre": {
|
"cendre": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "senu",
|
"confluent": "kvile",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "sen",
|
"forme_liee": "kvil",
|
||||||
"domaine": "materiau"
|
"domaine": "materiau"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -86,9 +86,9 @@
|
|||||||
"sang": {
|
"sang": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "pasu",
|
"confluent": "mzune",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "ras",
|
"forme_liee": "mzun",
|
||||||
"domaine": "materiau"
|
"domaine": "materiau"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -96,9 +96,9 @@
|
|||||||
"lait": {
|
"lait": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "milu",
|
"confluent": "stuki",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "mil",
|
"forme_liee": "stuk",
|
||||||
"domaine": "materiau"
|
"domaine": "materiau"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -106,9 +106,9 @@
|
|||||||
"ligne": {
|
"ligne": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "linu",
|
"confluent": "speto",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "lin",
|
"forme_liee": "spet",
|
||||||
"domaine": "forme"
|
"domaine": "forme"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -116,9 +116,9 @@
|
|||||||
"corde": {
|
"corde": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "kopu",
|
"confluent": "kkese",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "kop",
|
"forme_liee": "kkes",
|
||||||
"domaine": "outil"
|
"domaine": "outil"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -126,9 +126,9 @@
|
|||||||
"sac": {
|
"sac": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "saku",
|
"confluent": "pnomu",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "sak",
|
"forme_liee": "pnom",
|
||||||
"domaine": "objet"
|
"domaine": "objet"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@ -139,9 +139,9 @@
|
|||||||
"tablette": {
|
"tablette": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "tabu",
|
"confluent": "zkami",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "tab",
|
"forme_liee": "zkam",
|
||||||
"domaine": "objet"
|
"domaine": "objet"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@ -203,7 +203,7 @@
|
|||||||
"coffret": {
|
"coffret": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "sakuzaki",
|
"confluent": "svalezelu",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "sak-u-zaki",
|
"composition": "sak-u-zaki",
|
||||||
"sens_litteral": "Contenant protégé",
|
"sens_litteral": "Contenant protégé",
|
||||||
@ -218,7 +218,7 @@
|
|||||||
"foyer": {
|
"foyer": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "sukiuloku",
|
"confluent": "bvuvibolvu",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "suk-i-loku",
|
"composition": "suk-i-loku",
|
||||||
"sens_litteral": "Feu du lieu",
|
"sens_litteral": "Feu du lieu",
|
||||||
@ -233,7 +233,7 @@
|
|||||||
"grenier": {
|
"grenier": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "lokuzaki",
|
"confluent": "bkisesiku",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "lok-u-zaki",
|
"composition": "lok-u-zaki",
|
||||||
"sens_litteral": "Lieu gardé",
|
"sens_litteral": "Lieu gardé",
|
||||||
@ -284,9 +284,9 @@
|
|||||||
"zone": {
|
"zone": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "loku",
|
"confluent": "pvevi",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "lok",
|
"forme_liee": "pvev",
|
||||||
"domaine": "espace"
|
"domaine": "espace"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@ -297,9 +297,9 @@
|
|||||||
"navire": {
|
"navire": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "vanu",
|
"confluent": "bnuve",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "nav",
|
"forme_liee": "bnuv",
|
||||||
"domaine": "objet"
|
"domaine": "objet"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@ -445,7 +445,7 @@
|
|||||||
"relique": {
|
"relique": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "asauaita",
|
"confluent": "iovenalsa",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "as-a-aita",
|
"composition": "as-a-aita",
|
||||||
"sens_litteral": "Sacré avec ancêtre",
|
"sens_litteral": "Sacré avec ancêtre",
|
||||||
|
|||||||
@ -55,9 +55,9 @@
|
|||||||
"famille": {
|
"famille": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "mitu",
|
"confluent": "mzoba",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "mit",
|
"forme_liee": "mzob",
|
||||||
"domaine": "famille",
|
"domaine": "famille",
|
||||||
"note": "Unité familiale"
|
"note": "Unité familiale"
|
||||||
}
|
}
|
||||||
@ -108,9 +108,9 @@
|
|||||||
"garcon": {
|
"garcon": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "toku",
|
"confluent": "zliva",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "tok",
|
"forme_liee": "zliv",
|
||||||
"domaine": "personne",
|
"domaine": "personne",
|
||||||
"note": "Garçon, enfant masculin"
|
"note": "Garçon, enfant masculin"
|
||||||
}
|
}
|
||||||
@ -139,4 +139,4 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,9 +6,9 @@
|
|||||||
"racine_fr": "poiss",
|
"racine_fr": "poiss",
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "pisu",
|
"confluent": "zsita",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "pis",
|
"forme_liee": "zsit",
|
||||||
"structure": "CVCV",
|
"structure": "CVCV",
|
||||||
"domaine": "nourriture",
|
"domaine": "nourriture",
|
||||||
"note": "Poisson - source vitale de protéines (même racine que pêcher)"
|
"note": "Poisson - source vitale de protéines (même racine que pêcher)"
|
||||||
@ -412,10 +412,10 @@
|
|||||||
"racine_fr": "boir",
|
"racine_fr": "boir",
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "lapis",
|
"confluent": "minet",
|
||||||
"type": "verbe",
|
"type": "verbe",
|
||||||
"racine": "lapi",
|
"racine": "lapi",
|
||||||
"forme_liee": "lap",
|
"forme_liee": "mine",
|
||||||
"structure": "CVCVC",
|
"structure": "CVCVC",
|
||||||
"domaine": "nourriture",
|
"domaine": "nourriture",
|
||||||
"note": "Boire - utilise racine sacrée ura (eau)"
|
"note": "Boire - utilise racine sacrée ura (eau)"
|
||||||
|
|||||||
@ -97,7 +97,7 @@
|
|||||||
"racine_fr": "escalier",
|
"racine_fr": "escalier",
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "vukukali",
|
"confluent": "kpopezosu",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "vuku-kali",
|
"composition": "vuku-kali",
|
||||||
"sens_litteral": "Gouffre-de-pierre",
|
"sens_litteral": "Gouffre-de-pierre",
|
||||||
|
|||||||
@ -333,7 +333,7 @@
|
|||||||
"rame": {
|
"rame": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "kanuvi",
|
"confluent": "pzekana",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "kanu-vi",
|
"composition": "kanu-vi",
|
||||||
"sens_litteral": "Bois de main pour l'eau",
|
"sens_litteral": "Bois de main pour l'eau",
|
||||||
@ -600,7 +600,7 @@
|
|||||||
"profondeur": {
|
"profondeur": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "vukumako",
|
"confluent": "nsalapinu",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "vuku-mako",
|
"composition": "vuku-mako",
|
||||||
"sens_litteral": "Grand gouffre",
|
"sens_litteral": "Grand gouffre",
|
||||||
@ -620,7 +620,7 @@
|
|||||||
"houle": {
|
"houle": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "meluloli",
|
"confluent": "vtukaviti",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "melu-loli",
|
"composition": "melu-loli",
|
||||||
"sens_litteral": "Ondulation lente de la mer",
|
"sens_litteral": "Ondulation lente de la mer",
|
||||||
|
|||||||
@ -255,7 +255,7 @@
|
|||||||
"voûte": {
|
"voûte": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "vukutoka",
|
"confluent": "mbalateki",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "vuku-toka",
|
"composition": "vuku-toka",
|
||||||
"sens_litteral": "Lieu du gouffre courbé",
|
"sens_litteral": "Lieu du gouffre courbé",
|
||||||
@ -442,7 +442,7 @@
|
|||||||
"sol": {
|
"sol": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "tokuvuku",
|
"confluent": "zzekonabo",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "toka-vuku",
|
"composition": "toka-vuku",
|
||||||
"sens_litteral": "Bas du lieu",
|
"sens_litteral": "Bas du lieu",
|
||||||
@ -501,9 +501,9 @@
|
|||||||
"pont": {
|
"pont": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "vasi",
|
"confluent": "tvoli",
|
||||||
"type": "racine",
|
"type": "racine",
|
||||||
"forme_liee": "vas",
|
"forme_liee": "tvol",
|
||||||
"domaine": "architecture",
|
"domaine": "architecture",
|
||||||
"note": "Déjà existant - lien, passage entre deux"
|
"note": "Déjà existant - lien, passage entre deux"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -82,7 +82,7 @@
|
|||||||
"cheveux de sang": {
|
"cheveux de sang": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "pupasula",
|
"confluent": "mkatuvizi",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "pupu-a-pasu-la",
|
"composition": "pupu-a-pasu-la",
|
||||||
"sens_litteral": "Poils rouges comme le sang",
|
"sens_litteral": "Poils rouges comme le sang",
|
||||||
@ -357,7 +357,7 @@
|
|||||||
"commun": {
|
"commun": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "kotavi",
|
"confluent": "bzekazu",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "kota-vi",
|
"composition": "kota-vi",
|
||||||
"sens_litteral": "De la confluence, partagé",
|
"sens_litteral": "De la confluence, partagé",
|
||||||
@ -478,7 +478,7 @@
|
|||||||
"pacifique": {
|
"pacifique": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "tosavi",
|
"confluent": "tlosovi",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "tosa-vi",
|
"composition": "tosa-vi",
|
||||||
"sens_litteral": "De nature bonne/paisible",
|
"sens_litteral": "De nature bonne/paisible",
|
||||||
|
|||||||
@ -185,7 +185,7 @@
|
|||||||
"se faire passer pour": {
|
"se faire passer pour": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "mukavi",
|
"confluent": "ksusetu",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "muka-vi",
|
"composition": "muka-vi",
|
||||||
"sens_litteral": "Prendre le visage de",
|
"sens_litteral": "Prendre le visage de",
|
||||||
@ -224,7 +224,7 @@
|
|||||||
"observation": {
|
"observation": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "silikonu",
|
"confluent": "zvabavoze",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "sili-konu",
|
"composition": "sili-konu",
|
||||||
"sens_litteral": "Regard gardé/vigilant",
|
"sens_litteral": "Regard gardé/vigilant",
|
||||||
@ -343,7 +343,7 @@
|
|||||||
"audace": {
|
"audace": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "kolaska",
|
"confluent": "bzapagvo",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "kol-aska",
|
"composition": "kol-aska",
|
||||||
"sens_litteral": "Cœur libre",
|
"sens_litteral": "Cœur libre",
|
||||||
|
|||||||
@ -174,7 +174,7 @@
|
|||||||
"correspondre": {
|
"correspondre": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "kotavi",
|
"confluent": "snulibe",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "kota-vi",
|
"composition": "kota-vi",
|
||||||
"sens_litteral": "Être en confluence/accord",
|
"sens_litteral": "Être en confluence/accord",
|
||||||
@ -351,7 +351,7 @@
|
|||||||
"peinture corporelle": {
|
"peinture corporelle": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "sanukova",
|
"confluent": "btabimepa",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "sanu-kova",
|
"composition": "sanu-kova",
|
||||||
"sens_litteral": "Gravure/motif sur le corps",
|
"sens_litteral": "Gravure/motif sur le corps",
|
||||||
@ -447,7 +447,7 @@
|
|||||||
"sale": {
|
"sale": {
|
||||||
"traductions": [
|
"traductions": [
|
||||||
{
|
{
|
||||||
"confluent": "vekupaka",
|
"confluent": "nvukosisa",
|
||||||
"type": "composition",
|
"type": "composition",
|
||||||
"composition": "vek-u-paka",
|
"composition": "vek-u-paka",
|
||||||
"sens_litteral": "Mauvaise surface",
|
"sens_litteral": "Mauvaise surface",
|
||||||
|
|||||||
@ -335,6 +335,51 @@ function auditerFichier(file, toutesLesRacines) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Détecte les doublons de mots Confluent
|
||||||
|
*/
|
||||||
|
function detecterDoublons() {
|
||||||
|
const motsCF = new Map(); // mot -> [{file, motFr, type}]
|
||||||
|
|
||||||
|
const files = fs.readdirSync(LEXIQUE_DIR).filter(f => f.endsWith('.json'));
|
||||||
|
|
||||||
|
files.forEach(file => {
|
||||||
|
const filePath = path.join(LEXIQUE_DIR, file);
|
||||||
|
const content = JSON.parse(fs.readFileSync(filePath, 'utf8'));
|
||||||
|
|
||||||
|
if (!content.dictionnaire) return;
|
||||||
|
|
||||||
|
Object.entries(content.dictionnaire).forEach(([motFr, data]) => {
|
||||||
|
if (!data.traductions) return;
|
||||||
|
|
||||||
|
data.traductions.forEach(trad => {
|
||||||
|
const motCF = trad.confluent;
|
||||||
|
if (!motCF) return;
|
||||||
|
|
||||||
|
if (!motsCF.has(motCF)) {
|
||||||
|
motsCF.set(motCF, []);
|
||||||
|
}
|
||||||
|
|
||||||
|
motsCF.get(motCF).push({
|
||||||
|
file: file,
|
||||||
|
motFr: motFr,
|
||||||
|
type: trad.type || 'unknown'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Trouver les doublons
|
||||||
|
const doublons = [];
|
||||||
|
motsCF.forEach((occurrences, motCF) => {
|
||||||
|
if (occurrences.length > 1) {
|
||||||
|
doublons.push({ motCF, occurrences });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return doublons;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fonction principale
|
* Fonction principale
|
||||||
*/
|
*/
|
||||||
@ -355,6 +400,21 @@ function main() {
|
|||||||
auditerFichier(file, toutesLesRacines);
|
auditerFichier(file, toutesLesRacines);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Détecter les doublons
|
||||||
|
console.log('🔍 Détection des doublons...\n');
|
||||||
|
const doublons = detecterDoublons();
|
||||||
|
|
||||||
|
if (doublons.length > 0) {
|
||||||
|
console.log(`⚠️ DOUBLONS DÉTECTÉS: ${doublons.length} mots Confluent apparaissent plusieurs fois\n`);
|
||||||
|
|
||||||
|
doublons.forEach(({motCF, occurrences}) => {
|
||||||
|
errors.push(`DOUBLON: "${motCF}" apparaît ${occurrences.length} fois:`);
|
||||||
|
occurrences.forEach(occ => {
|
||||||
|
errors.push(` → [${occ.file}] "${occ.motFr}" (${occ.type})`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Vérifier le ratio de consonnes rares
|
// Vérifier le ratio de consonnes rares
|
||||||
const ratioConsonnesRares = (stats.consonnes_rares_utilisees / stats.total_mots) * 100;
|
const ratioConsonnesRares = (stats.consonnes_rares_utilisees / stats.total_mots) * 100;
|
||||||
if (ratioConsonnesRares > 10) {
|
if (ratioConsonnesRares > 10) {
|
||||||
|
|||||||
331
scripts/fix-doublons.js
Normal file
331
scripts/fix-doublons.js
Normal file
@ -0,0 +1,331 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Script de correction automatique des doublons du lexique Confluent
|
||||||
|
*
|
||||||
|
* Stratégie:
|
||||||
|
* 1. Identifier tous les doublons
|
||||||
|
* 2. Prioriser les entrées à garder (racines sacrées > racines standards > grammaire > compositions)
|
||||||
|
* 3. Générer de nouveaux mots Confluent pour les doublons à remplacer
|
||||||
|
* 4. Mettre à jour les fichiers JSON
|
||||||
|
*/
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
const LEXIQUE_DIR = path.join(__dirname, '../ancien-confluent/lexique');
|
||||||
|
|
||||||
|
// Phonologie
|
||||||
|
const CONSONNES = ['b', 'k', 'l', 'm', 'n', 'p', 's', 't', 'v', 'z'];
|
||||||
|
const CONSONNES_RARES = ['r', 'd', 'h', 'g']; // À éviter mais tolérées
|
||||||
|
const VOYELLES = ['a', 'e', 'i', 'o', 'u'];
|
||||||
|
|
||||||
|
// Mots déjà utilisés dans le lexique
|
||||||
|
const MOTS_EXISTANTS = new Set();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Génère un mot Confluent aléatoire (racine finissant par CV)
|
||||||
|
*/
|
||||||
|
function genererMotCV(longueur = 4, sacre = false) {
|
||||||
|
let mot = '';
|
||||||
|
const maxAttempts = 1000;
|
||||||
|
let attempts = 0;
|
||||||
|
|
||||||
|
while (attempts < maxAttempts) {
|
||||||
|
mot = '';
|
||||||
|
|
||||||
|
// Racine sacrée commence par voyelle, standard par consonne
|
||||||
|
if (sacre) {
|
||||||
|
mot += VOYELLES[Math.floor(Math.random() * VOYELLES.length)];
|
||||||
|
} else {
|
||||||
|
mot += CONSONNES[Math.floor(Math.random() * CONSONNES.length)];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Alterner consonne-voyelle jusqu'à longueur-2
|
||||||
|
for (let i = 1; i < longueur - 1; i++) {
|
||||||
|
if (i % 2 === (sacre ? 0 : 1)) {
|
||||||
|
// Consonne (éviter les consonnes rares sauf 10% du temps)
|
||||||
|
const useRare = Math.random() < 0.1;
|
||||||
|
const consonneSet = useRare ? [...CONSONNES, ...CONSONNES_RARES] : CONSONNES;
|
||||||
|
mot += consonneSet[Math.floor(Math.random() * consonneSet.length)];
|
||||||
|
} else {
|
||||||
|
// Voyelle
|
||||||
|
mot += VOYELLES[Math.floor(Math.random() * VOYELLES.length)];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Terminer par CV (consonne + voyelle)
|
||||||
|
mot += CONSONNES[Math.floor(Math.random() * CONSONNES.length)];
|
||||||
|
mot += VOYELLES[Math.floor(Math.random() * VOYELLES.length)];
|
||||||
|
|
||||||
|
// Vérifier que le mot n'existe pas déjà
|
||||||
|
if (!MOTS_EXISTANTS.has(mot)) {
|
||||||
|
MOTS_EXISTANTS.add(mot);
|
||||||
|
return mot;
|
||||||
|
}
|
||||||
|
|
||||||
|
attempts++;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Error(`Impossible de générer un mot unique après ${maxAttempts} tentatives`);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Génère un verbe Confluent (CVCVC - finit par consonne)
|
||||||
|
*/
|
||||||
|
function genererVerbe() {
|
||||||
|
let mot = '';
|
||||||
|
const maxAttempts = 1000;
|
||||||
|
let attempts = 0;
|
||||||
|
|
||||||
|
while (attempts < maxAttempts) {
|
||||||
|
mot = '';
|
||||||
|
|
||||||
|
// CVCVC: commence par consonne
|
||||||
|
mot += CONSONNES[Math.floor(Math.random() * CONSONNES.length)];
|
||||||
|
mot += VOYELLES[Math.floor(Math.random() * VOYELLES.length)];
|
||||||
|
mot += CONSONNES[Math.floor(Math.random() * CONSONNES.length)];
|
||||||
|
mot += VOYELLES[Math.floor(Math.random() * VOYELLES.length)];
|
||||||
|
mot += CONSONNES[Math.floor(Math.random() * CONSONNES.length)];
|
||||||
|
|
||||||
|
if (!MOTS_EXISTANTS.has(mot)) {
|
||||||
|
MOTS_EXISTANTS.add(mot);
|
||||||
|
return mot;
|
||||||
|
}
|
||||||
|
|
||||||
|
attempts++;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Error(`Impossible de générer un verbe unique après ${maxAttempts} tentatives`);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Charge tous les mots du lexique
|
||||||
|
*/
|
||||||
|
function chargerTousLesMots() {
|
||||||
|
const mots = new Map(); // motCF -> [{file, motFr, type, data}]
|
||||||
|
const files = fs.readdirSync(LEXIQUE_DIR).filter(f => f.endsWith('.json') && !f.startsWith('_'));
|
||||||
|
|
||||||
|
files.forEach(file => {
|
||||||
|
const filePath = path.join(LEXIQUE_DIR, file);
|
||||||
|
const content = JSON.parse(fs.readFileSync(filePath, 'utf8'));
|
||||||
|
|
||||||
|
if (!content.dictionnaire) return;
|
||||||
|
|
||||||
|
Object.entries(content.dictionnaire).forEach(([motFr, data]) => {
|
||||||
|
if (!data.traductions) return;
|
||||||
|
|
||||||
|
data.traductions.forEach((trad, index) => {
|
||||||
|
const motCF = trad.confluent;
|
||||||
|
if (!motCF) return;
|
||||||
|
|
||||||
|
MOTS_EXISTANTS.add(motCF);
|
||||||
|
|
||||||
|
if (!mots.has(motCF)) {
|
||||||
|
mots.set(motCF, []);
|
||||||
|
}
|
||||||
|
|
||||||
|
mots.get(motCF).push({
|
||||||
|
file,
|
||||||
|
motFr,
|
||||||
|
type: trad.type || 'unknown',
|
||||||
|
tradIndex: index,
|
||||||
|
data: trad
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return mots;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Détermine la priorité d'une entrée (plus haut = garder)
|
||||||
|
*/
|
||||||
|
function getPriorite(entry) {
|
||||||
|
// Priorité par type
|
||||||
|
const priorities = {
|
||||||
|
'racine_sacree': 1000,
|
||||||
|
'racine': 900,
|
||||||
|
'particule': 800,
|
||||||
|
'marqueur_temps': 800,
|
||||||
|
'negation': 800,
|
||||||
|
'interrogation': 800,
|
||||||
|
'demonstratif': 800,
|
||||||
|
'auxiliaire': 800,
|
||||||
|
'verbe': 700,
|
||||||
|
'verbe_irregulier': 700,
|
||||||
|
'composition': 500,
|
||||||
|
'nom_propre': 400,
|
||||||
|
'quantificateur': 300,
|
||||||
|
'relatif': 300,
|
||||||
|
'possessif': 300
|
||||||
|
};
|
||||||
|
|
||||||
|
let priority = priorities[entry.type] || 100;
|
||||||
|
|
||||||
|
// Bonus pour fichiers de référence
|
||||||
|
if (entry.file === '01-racines-sacrees.json') priority += 500;
|
||||||
|
if (entry.file === '02-racines-standards.json') priority += 400;
|
||||||
|
if (entry.file === '00-grammaire.json') priority += 300;
|
||||||
|
if (entry.file === '03-castes.json') priority += 200;
|
||||||
|
if (entry.file === '04-lieux.json') priority += 200;
|
||||||
|
|
||||||
|
return priority;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Identifie les doublons et détermine quoi garder/remplacer
|
||||||
|
*/
|
||||||
|
function identifierDoublons(tousLesMots) {
|
||||||
|
const doublons = [];
|
||||||
|
|
||||||
|
tousLesMots.forEach((occurrences, motCF) => {
|
||||||
|
if (occurrences.length > 1) {
|
||||||
|
// Trier par priorité (décroissant)
|
||||||
|
occurrences.sort((a, b) => getPriorite(b) - getPriorite(a));
|
||||||
|
|
||||||
|
// Garder le premier, remplacer les autres
|
||||||
|
const aGarder = occurrences[0];
|
||||||
|
const aRemplacer = occurrences.slice(1);
|
||||||
|
|
||||||
|
doublons.push({
|
||||||
|
motCF,
|
||||||
|
garder: aGarder,
|
||||||
|
remplacer: aRemplacer
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return doublons;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Génère un nouveau mot selon le type
|
||||||
|
*/
|
||||||
|
function genererNouveauMot(entry) {
|
||||||
|
if (entry.type === 'verbe' || entry.type === 'verbe_irregulier') {
|
||||||
|
return genererVerbe();
|
||||||
|
}
|
||||||
|
|
||||||
|
const estSacre = entry.type === 'racine_sacree' || entry.data.confluent?.match(/^[aeiou]/);
|
||||||
|
const longueur = entry.data.confluent?.length || 4;
|
||||||
|
|
||||||
|
return genererMotCV(longueur, estSacre);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Met à jour un fichier JSON pour remplacer un mot
|
||||||
|
*/
|
||||||
|
function remplacerMotDansFichier(file, motFr, tradIndex, ancienMot, nouveauMot) {
|
||||||
|
const filePath = path.join(LEXIQUE_DIR, file);
|
||||||
|
const content = JSON.parse(fs.readFileSync(filePath, 'utf8'));
|
||||||
|
|
||||||
|
if (!content.dictionnaire || !content.dictionnaire[motFr]) {
|
||||||
|
console.error(`⚠️ Erreur: mot français "${motFr}" introuvable dans ${file}`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const traductions = content.dictionnaire[motFr].traductions;
|
||||||
|
if (!traductions || !traductions[tradIndex]) {
|
||||||
|
console.error(`⚠️ Erreur: traduction #${tradIndex} introuvable pour "${motFr}" dans ${file}`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const trad = traductions[tradIndex];
|
||||||
|
if (trad.confluent !== ancienMot) {
|
||||||
|
console.error(`⚠️ Erreur: mot attendu "${ancienMot}" mais trouvé "${trad.confluent}" pour "${motFr}" dans ${file}`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mettre à jour le mot
|
||||||
|
trad.confluent = nouveauMot;
|
||||||
|
|
||||||
|
// Mettre à jour forme_liee si elle existe
|
||||||
|
if (trad.forme_liee) {
|
||||||
|
if (trad.type === 'verbe' || trad.type === 'verbe_irregulier') {
|
||||||
|
// Pour les verbes, forme_liee = racine (enlever dernière consonne)
|
||||||
|
trad.forme_liee = nouveauMot.slice(0, -1);
|
||||||
|
} else {
|
||||||
|
// Pour les racines, forme_liee = enlever dernière voyelle
|
||||||
|
trad.forme_liee = nouveauMot.slice(0, -1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sauvegarder
|
||||||
|
fs.writeFileSync(filePath, JSON.stringify(content, null, 2) + '\n', 'utf8');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction principale
|
||||||
|
*/
|
||||||
|
function main() {
|
||||||
|
console.log('🔧 Correction automatique des doublons du lexique Confluent\n');
|
||||||
|
|
||||||
|
// Charger tous les mots
|
||||||
|
console.log('📖 Chargement du lexique...');
|
||||||
|
const tousLesMots = chargerTousLesMots();
|
||||||
|
console.log(` ${MOTS_EXISTANTS.size} mots uniques chargés\n`);
|
||||||
|
|
||||||
|
// Identifier les doublons
|
||||||
|
console.log('🔍 Identification des doublons...');
|
||||||
|
const doublons = identifierDoublons(tousLesMots);
|
||||||
|
console.log(` ${doublons.length} doublons détectés\n`);
|
||||||
|
|
||||||
|
if (doublons.length === 0) {
|
||||||
|
console.log('✅ Aucun doublon à corriger !\n');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Préparer les remplacements
|
||||||
|
const remplacements = [];
|
||||||
|
|
||||||
|
console.log('📝 Génération des nouveaux mots...\n');
|
||||||
|
doublons.forEach(doublon => {
|
||||||
|
doublon.remplacer.forEach(entry => {
|
||||||
|
const nouveauMot = genererNouveauMot(entry);
|
||||||
|
remplacements.push({
|
||||||
|
file: entry.file,
|
||||||
|
motFr: entry.motFr,
|
||||||
|
tradIndex: entry.tradIndex,
|
||||||
|
ancienMot: doublon.motCF,
|
||||||
|
nouveauMot,
|
||||||
|
type: entry.type
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(`💾 Application de ${remplacements.length} remplacements...\n`);
|
||||||
|
|
||||||
|
// Appliquer les remplacements
|
||||||
|
let succes = 0;
|
||||||
|
let echecs = 0;
|
||||||
|
|
||||||
|
remplacements.forEach(repl => {
|
||||||
|
const ok = remplacerMotDansFichier(
|
||||||
|
repl.file,
|
||||||
|
repl.motFr,
|
||||||
|
repl.tradIndex,
|
||||||
|
repl.ancienMot,
|
||||||
|
repl.nouveauMot
|
||||||
|
);
|
||||||
|
|
||||||
|
if (ok) {
|
||||||
|
console.log(`✓ [${repl.file}] "${repl.motFr}": ${repl.ancienMot} → ${repl.nouveauMot}`);
|
||||||
|
succes++;
|
||||||
|
} else {
|
||||||
|
console.log(`✗ [${repl.file}] "${repl.motFr}": échec du remplacement`);
|
||||||
|
echecs++;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(`\n📊 RÉSULTATS:\n`);
|
||||||
|
console.log(` ✅ ${succes} remplacements réussis`);
|
||||||
|
console.log(` ❌ ${echecs} échecs`);
|
||||||
|
console.log(`\n🔍 Relancez l'audit pour vérifier: node scripts/audit-lexique.js\n`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (require.main === module) {
|
||||||
|
main();
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user