From 812806830bc1d549be6c8e3fbd81086da1e713c2 Mon Sep 17 00:00:00 2001 From: CapitainFlam <31761317+CapitainFlam@users.noreply.github.com> Date: Tue, 6 Sep 2022 22:54:09 +0200 Subject: [PATCH 01/12] adding FR rules in languages and index.js --- server/lib/validation/index.js | 2 ++ server/lib/validation/languages/fr.js | 32 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 server/lib/validation/languages/fr.js diff --git a/server/lib/validation/index.js b/server/lib/validation/index.js index cbead814..c9bdd65b 100644 --- a/server/lib/validation/index.js +++ b/server/lib/validation/index.js @@ -4,6 +4,7 @@ const ca = require('./languages/ca'); const ckb = require('./languages/ckb'); const en = require('./languages/en'); const eo = require('./languages/eo'); +const fr = require('./languages/fr'); const ig = require('./languages/ig'); const it = require('./languages/it'); const kab = require( './languages/kab'); @@ -23,6 +24,7 @@ const VALIDATORS = { ckb, en, eo, + fr, ig, it, kab, diff --git a/server/lib/validation/languages/fr.js b/server/lib/validation/languages/fr.js new file mode 100644 index 00000000..3ae1e018 --- /dev/null +++ b/server/lib/validation/languages/fr.js @@ -0,0 +1,32 @@ +const tokenizeWords = require('talisman/tokenizers/words'); + +// Minimum of words that qualify as a sentence. +const MIN_WORDS = 1; + +// Maximum of words allowed per sentence to keep recordings in a manageable duration. +const MAX_WORDS = 14; + +const INVALIDATIONS = [{ + fn: (sentence) => { + const words = tokenizeWords(sentence); + return words.length < MIN_WORDS || words.length > MAX_WORDS; + }, + error: `Number of words must be between ${MIN_WORDS} and ${MAX_WORDS} (inclusive) - Le nombre de mot doit être entre ${MIN_WORDS} et ${MAX_WORDS} (inclus)`, +}, { + regex: /[0-9]+/, + error: 'Sentence should not contain numbers - les phrases ne doivent pas contenir de nombres', +}, { + regex: /[<>+*#@%^[\]()/]/, + error: 'Sentence should not contain symbols - les phrases de doivent pas contenir de symboles \(\*, \#, \(, etc\)', +}, { + // Any words consisting of uppercase letters or uppercase letters with a period + // inbetween are considered abbreviations or acronyms. + // This currently also matches fooBAR but we most probably don't want that either + // as users wouldn't know how to pronounce the uppercase letters. + regex: /[A-Z]{2,}|[A-Z]+\.*[A-Z]+/, + error: 'Sentence should not contain abbreviations - Les phrases ne doivent pas contenir des abréviations ou sigles', +}]; + +module.exports = { + INVALIDATIONS, +}; From db15ee1b107acf4ce7dc1b91acfb78609786afd2 Mon Sep 17 00:00:00 2001 From: CapitainFlam <31761317+CapitainFlam@users.noreply.github.com> Date: Thu, 8 Sep 2022 00:05:03 +0200 Subject: [PATCH 02/12] adding many FR rules, transcoding acronyms, and removing numbers ...some of my first commits, and my first steps in JS. reviews are welcome. (...please neither shoot or shout at me ;-D ) Co-Authored-By: Nicolas Panel <2500584+nicolaspanel@users.noreply.github.com> --- server/lib/cleanup/languages/fr.js | 89 +++++++++++++++++++++++++++--- 1 file changed, 82 insertions(+), 7 deletions(-) diff --git a/server/lib/cleanup/languages/fr.js b/server/lib/cleanup/languages/fr.js index 427123a7..63c206a6 100644 --- a/server/lib/cleanup/languages/fr.js +++ b/server/lib/cleanup/languages/fr.js @@ -10,7 +10,11 @@ function sortSentences(sentences) { function clean(sentences) { return sentences.map((sentence) => { return sentence - // no space after opening '(' or '[' + // + //caracters and space cleanup + // + + // no space after opening '(' or '[' .replace(/\(\s+/g, '(') .replace(/\[\s+/g, '[') @@ -31,15 +35,15 @@ function clean(sentences) { // Normalize three consecutive dots into unicode elipsis .replace(/\.{3}/g, '…') - // In fr-FR, those should have a no space before - .replace(/\s+,/g, ',') + // In fr-FR, those should have a no space before and a normal space after + .replace(/\s+,/g, ',') // before ... .replace(/\s+\./g, '.') .replace(/\s+…/g, '…') - .replace(/,(?!\s+)/g, ', ') + .replace(/,(?!\s+)/g, ', ') // after ... .replace(/\.(?!\s+)/g, '. ') .replace(/…(?!\s+)/g, '… ') - // In fr-FR, those should have a non-breakable space before and after + // In fr-FR, those should have a non-breakable space before and a normal space after .replace(/([^ ]|^):/g, '$1 :') // before ... .replace(/([^ ]|^);/g, '$1 ;') .replace(/([^ ]|^)\?/g, '$1 ?') @@ -49,9 +53,80 @@ function clean(sentences) { .replace(/\?(?!\s+)/g, '? ') .replace(/!(?!\s+)/g, '! ') - // Final normalization of spaces - .replace(/\s+/g, ' ') + // + //special names and places cleanup + //based on the work done by https://github.com/nicolaspanel (kudos to him!) in https://github.com/common-voice/CorporaCreator/pull/87/files + // + + //Jean-Paul II + .replace(/Jean-Paul II|Jean Paul II/g, 'Jean-Paul deux') + + // + //abrevation fr-FR cleanup + //based on the work done by https://github.com/nicolaspanel (kudos to him!) in https://github.com/common-voice/CorporaCreator/pull/87/files and modified. + // + + .replace(/(^|\s|\w)\/an(\s|\.|,|\?|!|$)/g, '$1 par an ') + .replace(/(^|\s)km(\s|\.|,|\?|!|$)/g, ' kilomètres ') + .replace(/%, ' pourcent ') + .replace(/(^|\s|\w)\+(\s|\.|,|\?|!|$)/g, ' plus ') + .replace(/(^|\s|[0-9]+)m(?:2|²)(\s|\.|,|\?|!|$)/g, '$1 mètres carrés ') + .replace(/(^|\s|[0-9]+)(\/|\/\s)m(?:2|²)(\s|\.|,|\?|!|$)/g, '$1 par mètres carrés ') + .replace(/\s?€/g, ' euros ') + .replace(/\s?£/g, ' livres ') + .replace(/\s?$/g, ' dollars ') + .replace(/(^| )(n|N)(?:°|º|°)(\s)?/g, ' $2uméro ') //numéro or Numéro + + // + //acronym fr-FR cleanup + //based on the work done by https://github.com/nicolaspanel (kudos to him!) in https://github.com/common-voice/CorporaCreator/pull/87/files and modified. + // + + //.replace(/(^|\s)ACRONYM(\s|\.|,|\?|!|$)/g, ' The Full Detailled Name ') + .replace(/(^|\s)ANPE(\s|\.|,|\?|!|$)/g, ' Agence Nationale Pour l\'Emploi ') + .replace(/(^|\s)APL(\s|\.|,|\?|!|$)/g, ' Aide personnalisée au logement ') + .replace(/(^|\s)CDI(\s|\.|,|\?|!|$)/g, ' Contrat à Durée Indéterminée ') + .replace(/(^|\s)CICE(\s|\.|,|\?|!|$)/g, ' Crédit d\'impôt pour la compétitivité et l\'emploi ') + .replace(/(^|\s)DRH(\s|\.|,|\?|!|$)/g, ' Direction des Ressources Humaines ') + .replace(/(^|\s)EDF(\s|\.|,|\?|!|$)/g, ' Electricité de France ') + .replace(/(^|\s)FN(\s|\.|,|\?|!|$)/g, ' F N ') + .replace(/(^|\s)HLM(\s|\.|,|\?|!|$)/g, ' Habitation à Loyer Modéré ') + .replace(/(^|\s)IGN(\s|\.|,|\?|!|$)/g, ' Institut Géographique National ') + .replace(/(^|\s)INPI(\s|\.|,|\?|!|$)/g, ' Institut National de la Propriété Intellectuelle ') + .replace(/(^|\s)ISF(\s|\.|,|\?|!|$)/g, ' Impôt sur la fortune ') + .replace(/(^|\s)IUT(\s|\.|,|\?|!|$)/g, ' Institut Universitaire de Technologie ') + .replace(/(^|\s)LREM(\s|\.|,|\?|!|$)/g, ' L R E M ') + .replace(/(^|\s)NUPES(\s|\.|,|\?|!|$)/g, ' Nupes ') + .replace(/(^|\s)PHP(\s|\.|,|\?|!|$)/g, ' P H P ') + .replace(/(^|\s)PMA(\s|\.|,|\?|!|$)/g, ' Procréation médicalement assistée ') + .replace(/(^|\s)PME(\s|\.|,|\?|!|$)/g, ' Petite et Moyenne Entreprise ') + .replace(/(^|\s)RN(\s|\.|,|\?|!|$)/g, ' R N ') + .replace(/(^|\s)RSA(\s|\.|,|\?|!|$)/g, ' Revenu de Solidarité Active ') + .replace(/(^|\s)RSA(\s|\.|,|\?|!|$)/g, ' Revenu de Solidarité Active ') + .replace(/(^|\s)RSI(\s|\.|,|\?|!|$)/g, ' Régime Social des Indépendants ') + .replace(/(^|\s)RTE(\s|\.|,|\?|!|$)/g, ' Réseau de Transport d\'Électricité ') + .replace(/(^|\s)SNCF(\s|\.|,|\?|!|$)/g, ' Société Nationale des Chemins de Fer ') + .replace(/(^|\s)TGV(\s|\.|,|\?|!|$)/g, ' Train à Grande Vitesse ') + .replace(/(^|\s)TVA(\s|\.|,|\?|!|$)/g, ' Taxe sur la Valeur Ajoutée ') + .replace(/(^|\s)UDI(\s|\.|,|\?|!|$)/g, ' U D I ') + .replace(/(^|\s)UMP(\s|\.|,|\?|!|$)/g, ' U M P ') + .replace(/(^|\s)USA(\s|\.|,|\?|!|$)/g, ' U S A ') + + // + //dates, digits and numbers fr-FR cleanup + // + .replace((^|\s)\d{1,2}\/\d{1,2}\/(\d{2}[^\d]|\d{4})(\s|$), ' ') //date format dd/mm/yy ou dd/mm/yyyy + .replace((^|\s)\d{1,2}\/(\d{2}[^\d]|\d{4})(\s|$), ' ') //date format mm/yy ou mm/yyyy + .replace(\d, '') //any digit ou number left + + // + // Final normalization of spaces + // + .replace(/\s+/g, ' ') .replace(/\s+$/g, '') + ; }); } + +//footnote : it can be hard to understand REGEX (REGular EXpressions). Do not hesitate to cath up with https://regex101.com/ to understand and test it. \ No newline at end of file From 9e0d82f387cc9b36367c5440efb1baa214955719 Mon Sep 17 00:00:00 2001 From: CapitainFlam <31761317+CapitainFlam@users.noreply.github.com> Date: Tue, 13 Sep 2022 13:59:19 +0200 Subject: [PATCH 03/12] Update fr.js --- server/lib/cleanup/languages/fr.js | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/server/lib/cleanup/languages/fr.js b/server/lib/cleanup/languages/fr.js index 63c206a6..4eb75c9a 100644 --- a/server/lib/cleanup/languages/fr.js +++ b/server/lib/cleanup/languages/fr.js @@ -10,9 +10,7 @@ function sortSentences(sentences) { function clean(sentences) { return sentences.map((sentence) => { return sentence - // //caracters and space cleanup - // // no space after opening '(' or '[' .replace(/\(\s+/g, '(') @@ -53,19 +51,14 @@ function clean(sentences) { .replace(/\?(?!\s+)/g, '? ') .replace(/!(?!\s+)/g, '! ') - // //special names and places cleanup - //based on the work done by https://github.com/nicolaspanel (kudos to him!) in https://github.com/common-voice/CorporaCreator/pull/87/files - // + //based on common-voice/CorporaCreator#87 //Jean-Paul II .replace(/Jean-Paul II|Jean Paul II/g, 'Jean-Paul deux') - // //abrevation fr-FR cleanup - //based on the work done by https://github.com/nicolaspanel (kudos to him!) in https://github.com/common-voice/CorporaCreator/pull/87/files and modified. - // - + //based on common-voice/CorporaCreator#87 .replace(/(^|\s|\w)\/an(\s|\.|,|\?|!|$)/g, '$1 par an ') .replace(/(^|\s)km(\s|\.|,|\?|!|$)/g, ' kilomètres ') .replace(/%, ' pourcent ') @@ -77,12 +70,8 @@ function clean(sentences) { .replace(/\s?$/g, ' dollars ') .replace(/(^| )(n|N)(?:°|º|°)(\s)?/g, ' $2uméro ') //numéro or Numéro - // //acronym fr-FR cleanup - //based on the work done by https://github.com/nicolaspanel (kudos to him!) in https://github.com/common-voice/CorporaCreator/pull/87/files and modified. - // - - //.replace(/(^|\s)ACRONYM(\s|\.|,|\?|!|$)/g, ' The Full Detailled Name ') + //based on common-voice/CorporaCreator#87 .replace(/(^|\s)ANPE(\s|\.|,|\?|!|$)/g, ' Agence Nationale Pour l\'Emploi ') .replace(/(^|\s)APL(\s|\.|,|\?|!|$)/g, ' Aide personnalisée au logement ') .replace(/(^|\s)CDI(\s|\.|,|\?|!|$)/g, ' Contrat à Durée Indéterminée ') @@ -112,21 +101,15 @@ function clean(sentences) { .replace(/(^|\s)UMP(\s|\.|,|\?|!|$)/g, ' U M P ') .replace(/(^|\s)USA(\s|\.|,|\?|!|$)/g, ' U S A ') - // //dates, digits and numbers fr-FR cleanup - // .replace((^|\s)\d{1,2}\/\d{1,2}\/(\d{2}[^\d]|\d{4})(\s|$), ' ') //date format dd/mm/yy ou dd/mm/yyyy .replace((^|\s)\d{1,2}\/(\d{2}[^\d]|\d{4})(\s|$), ' ') //date format mm/yy ou mm/yyyy .replace(\d, '') //any digit ou number left - // // Final normalization of spaces - // .replace(/\s+/g, ' ') .replace(/\s+$/g, '') ; }); } - -//footnote : it can be hard to understand REGEX (REGular EXpressions). Do not hesitate to cath up with https://regex101.com/ to understand and test it. \ No newline at end of file From 58430bb55344be7e1d07224253981218dd6e5a5a Mon Sep 17 00:00:00 2001 From: CapitainFlam <31761317+CapitainFlam@users.noreply.github.com> Date: Tue, 13 Sep 2022 14:55:00 +0200 Subject: [PATCH 04/12] Update fr.js roman + century numerals, roman numerals, full convertion of all ACRONYMES --- server/lib/cleanup/languages/fr.js | 53 ++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 7 deletions(-) diff --git a/server/lib/cleanup/languages/fr.js b/server/lib/cleanup/languages/fr.js index 4eb75c9a..6140e467 100644 --- a/server/lib/cleanup/languages/fr.js +++ b/server/lib/cleanup/languages/fr.js @@ -70,6 +70,44 @@ function clean(sentences) { .replace(/\s?$/g, ' dollars ') .replace(/(^| )(n|N)(?:°|º|°)(\s)?/g, ' $2uméro ') //numéro or Numéro + + //roman numerals + century + .replace(/(^|\s)Ie(r)? s.(\s|\.|,|\?|!|$)/g, ' premier siècle ') + .replace(/(^|\s)II(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' deuxième siècle ') + .replace(/(^|\s)III(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' troisième siècle ') + .replace(/(^|\s)IV(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' quatrième siècle ') + .replace(/(^|\s)V(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' cinquième siècle ') + .replace(/(^|\s)VI(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' sixième siècle ') + .replace(/(^|\s)VII(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' septième siècle ') + .replace(/(^|\s)VIII(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' huitième siècle ') + .replace(/(^|\s)(VIIII|IX)(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' neuvième siècle ') + .replace(/(^|\s)X(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' dixième siècle ') + .replace(/(^|\s)XI(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' onzième siècle ') + .replace(/(^|\s)XII(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' douxième siècle ') + .replace(/(^|\s)XIII(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' treizième siècle ') + .replace(/(^|\s)(XIIII|XIV)(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' quatorzième siècle ') + .replace(/(^|\s)XV(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' quinzième siècle ') + .replace(/(^|\s)XVI(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' seixième siècle ') + .replace(/(^|\s)XVII(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' dix-septième siècle ') + .replace(/(^|\s)XVIII(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' dix-huitième siècle ') + .replace(/(^|\s)(XIX|XVIIII)(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' dix_neuvième siècle ') + .replace(/(^|\s)XX(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' vingtième siècle ') + .replace(/(^|\s)XXI(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' vingt-et-unième siècle ') + .replace(/(^|\s)XXII(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' vingt-deuxième siècle ') + + //roman numerals + .replace(/(^|\s)I(\s|\.|,|\?|!|$)/g, ' premier ') + .replace(/(^|\s)II(\s|\.|,|\?|!|$)/g, ' deux ') + .replace(/(^|\s)III(\s|\.|,|\?|!|$)/g, ' trois ') + .replace(/(^|\s)IV(\s|\.|,|\?|!|$)/g, ' quatre ') + .replace(/(^|\s)V(\s|\.|,|\?|!|$)/g, ' cinq ') + .replace(/(^|\s)VI(\s|\.|,|\?|!|$)/g, ' six ') + .replace(/(^|\s)VII(\s|\.|,|\?|!|$)/g, ' sept ') + .replace(/(^|\s)VIII(\s|\.|,|\?|!|$)/g, ' huit ') + .replace(/(^|\s)(VIIII|IX)(\s|\.|,|\?|!|$)/g, ' neuf ') + .replace(/(^|\s)X(\s|\.|,|\?|!|$)/g, ' dix ') + + //acronym fr-FR cleanup //based on common-voice/CorporaCreator#87 .replace(/(^|\s)ANPE(\s|\.|,|\?|!|$)/g, ' Agence Nationale Pour l\'Emploi ') @@ -78,18 +116,18 @@ function clean(sentences) { .replace(/(^|\s)CICE(\s|\.|,|\?|!|$)/g, ' Crédit d\'impôt pour la compétitivité et l\'emploi ') .replace(/(^|\s)DRH(\s|\.|,|\?|!|$)/g, ' Direction des Ressources Humaines ') .replace(/(^|\s)EDF(\s|\.|,|\?|!|$)/g, ' Electricité de France ') - .replace(/(^|\s)FN(\s|\.|,|\?|!|$)/g, ' F N ') + .replace(/(^|\s)FN(\s|\.|,|\?|!|$)/g, ' Front National ') .replace(/(^|\s)HLM(\s|\.|,|\?|!|$)/g, ' Habitation à Loyer Modéré ') .replace(/(^|\s)IGN(\s|\.|,|\?|!|$)/g, ' Institut Géographique National ') .replace(/(^|\s)INPI(\s|\.|,|\?|!|$)/g, ' Institut National de la Propriété Intellectuelle ') .replace(/(^|\s)ISF(\s|\.|,|\?|!|$)/g, ' Impôt sur la fortune ') .replace(/(^|\s)IUT(\s|\.|,|\?|!|$)/g, ' Institut Universitaire de Technologie ') - .replace(/(^|\s)LREM(\s|\.|,|\?|!|$)/g, ' L R E M ') + .replace(/(^|\s)LREM(\s|\.|,|\?|!|$)/g, ' La Réplublique En Marche ') .replace(/(^|\s)NUPES(\s|\.|,|\?|!|$)/g, ' Nupes ') - .replace(/(^|\s)PHP(\s|\.|,|\?|!|$)/g, ' P H P ') + .replace(/(^|\s)PHP(\s|\.|,|\?|!|$)/g, ' Protocole Hypertexte Protocolaire ') .replace(/(^|\s)PMA(\s|\.|,|\?|!|$)/g, ' Procréation médicalement assistée ') .replace(/(^|\s)PME(\s|\.|,|\?|!|$)/g, ' Petite et Moyenne Entreprise ') - .replace(/(^|\s)RN(\s|\.|,|\?|!|$)/g, ' R N ') + .replace(/(^|\s)RN(\s|\.|,|\?|!|$)/g, ' Rassemblement National ') .replace(/(^|\s)RSA(\s|\.|,|\?|!|$)/g, ' Revenu de Solidarité Active ') .replace(/(^|\s)RSA(\s|\.|,|\?|!|$)/g, ' Revenu de Solidarité Active ') .replace(/(^|\s)RSI(\s|\.|,|\?|!|$)/g, ' Régime Social des Indépendants ') @@ -97,11 +135,12 @@ function clean(sentences) { .replace(/(^|\s)SNCF(\s|\.|,|\?|!|$)/g, ' Société Nationale des Chemins de Fer ') .replace(/(^|\s)TGV(\s|\.|,|\?|!|$)/g, ' Train à Grande Vitesse ') .replace(/(^|\s)TVA(\s|\.|,|\?|!|$)/g, ' Taxe sur la Valeur Ajoutée ') - .replace(/(^|\s)UDI(\s|\.|,|\?|!|$)/g, ' U D I ') - .replace(/(^|\s)UMP(\s|\.|,|\?|!|$)/g, ' U M P ') - .replace(/(^|\s)USA(\s|\.|,|\?|!|$)/g, ' U S A ') + .replace(/(^|\s)UDI(\s|\.|,|\?|!|$)/g, ' Union des Démocrates Indépendants ') + .replace(/(^|\s)UMP(\s|\.|,|\?|!|$)/g, ' Union pour un Mouvement Populaire ') + .replace(/(^|\s)USA(\s|\.|,|\?|!|$)/g, ' Etats Unis d'Amérique ') //dates, digits and numbers fr-FR cleanup + //todo : CONVERT TO TEXT instead of removing it .replace((^|\s)\d{1,2}\/\d{1,2}\/(\d{2}[^\d]|\d{4})(\s|$), ' ') //date format dd/mm/yy ou dd/mm/yyyy .replace((^|\s)\d{1,2}\/(\d{2}[^\d]|\d{4})(\s|$), ' ') //date format mm/yy ou mm/yyyy .replace(\d, '') //any digit ou number left From 13cbb5586143f4c0a3382e57fa57f4575cc00c0f Mon Sep 17 00:00:00 2001 From: CapitainFlam <31761317+CapitainFlam@users.noreply.github.com> Date: Tue, 13 Sep 2022 15:30:02 +0200 Subject: [PATCH 05/12] Update fr.js eleventh, ... first, second,... 1/2 => 1 sur 2 --- server/lib/cleanup/languages/fr.js | 40 ++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/server/lib/cleanup/languages/fr.js b/server/lib/cleanup/languages/fr.js index 6140e467..e9c6890f 100644 --- a/server/lib/cleanup/languages/fr.js +++ b/server/lib/cleanup/languages/fr.js @@ -68,7 +68,7 @@ function clean(sentences) { .replace(/\s?€/g, ' euros ') .replace(/\s?£/g, ' livres ') .replace(/\s?$/g, ' dollars ') - .replace(/(^| )(n|N)(?:°|º|°)(\s)?/g, ' $2uméro ') //numéro or Numéro + .replace(/(^| )(n|N)(?:°|º|°)(\s)?/g, ' $2uméro ') //n° or N° => 'numéro' or 'Numéro' //roman numerals + century @@ -95,8 +95,8 @@ function clean(sentences) { .replace(/(^|\s)XXI(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' vingt-et-unième siècle ') .replace(/(^|\s)XXII(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' vingt-deuxième siècle ') - //roman numerals - .replace(/(^|\s)I(\s|\.|,|\?|!|$)/g, ' premier ') + //roman numerals. + .replace(/(^|\s)I(\s|\.|,|\?|!|$)/g, ' premier ') //translated as 'first'. We considere that it's encountered after chapter (Chapitre I => 'chapitre premier'). Work also with names (Charles I => 'Charles premier') .replace(/(^|\s)II(\s|\.|,|\?|!|$)/g, ' deux ') .replace(/(^|\s)III(\s|\.|,|\?|!|$)/g, ' trois ') .replace(/(^|\s)IV(\s|\.|,|\?|!|$)/g, ' quatre ') @@ -106,7 +106,34 @@ function clean(sentences) { .replace(/(^|\s)VIII(\s|\.|,|\?|!|$)/g, ' huit ') .replace(/(^|\s)(VIIII|IX)(\s|\.|,|\?|!|$)/g, ' neuf ') .replace(/(^|\s)X(\s|\.|,|\?|!|$)/g, ' dix ') + .replace(/(^|\s)XI(\s|\.|,|\?|!|$)/g, ' onze ') + .replace(/(^|\s)XII(\s|\.|,|\?|!|$)/g, ' douze ') + .replace(/(^|\s)XIII(\s|\.|,|\?|!|$)/g, ' treize ') + .replace(/(^|\s)(XIIII|XIV)(\s|\.|,|\?|!|$)/g, ' quatorze ') + .replace(/(^|\s)XV(\s|\.|,|\?|!|$)/g, ' quinze ') + .replace(/(^|\s)XVI(\s|\.|,|\?|!|$)/g, ' seize ') + .replace(/(^|\s)XVII(\s|\.|,|\?|!|$)/g, ' dix-sept ') + .replace(/(^|\s)XVIII(\s|\.|,|\?|!|$)/g, ' dix-huit ') + .replace(/(^|\s)(XIX|XVIIII)(\s|\.|,|\?|!|$)/g, ' dix-neuf ') + .replace(/(^|\s)XX(\s|\.|,|\?|!|$)/g, ' vingt ') + .replace(/(^|\s)XXI(\s|\.|,|\?|!|$)/g, ' vingt-et-un ') + .replace(/(^|\s)XXII(\s|\.|,|\?|!|$)/g, ' vingt-deux ') + //first, second, etc. + .replace(/(^|\s)1er?s?(\s|\.|,|\?|!|$)/g, ' premier ') + .replace(/(^|\s)1(e|è)res?(\s|\.|,|\?|!|$)/g, ' premier ') + .replace(/(^|\s)2(e|è)?me?s?(\s|\.|,|\?|!|$)/g, ' deuxième ') + .replace(/(^|\s)2n?ds?(\s|\.|,|\?|!|$)/g, ' second ') + .replace(/(^|\s)2n?des?(\s|\.|,|\?|!|$)/g, ' seconde ') + .replace(/(^|\s)3i?(e|è)me?s?(\s|\.|,|\?|!|$)/g, ' troisième ') + .replace(/(^|\s)4i?(e|è)me?s?(\s|\.|,|\?|!|$)/g, ' quatrième ') + .replace(/(^|\s)5i?(e|è)me?s?(\s|\.|,|\?|!|$)/g, ' cinquième ') + .replace(/(^|\s)6i?(e|è)me?s?(\s|\.|,|\?|!|$)/g, ' sixième ') + .replace(/(^|\s)7i?(e|è)me?s?(\s|\.|,|\?|!|$)/g, ' septième ') + .replace(/(^|\s)8i?(e|è)me?s?(\s|\.|,|\?|!|$)/g, ' huitième ') + .replace(/(^|\s)9i?(e|è)me?s?(\s|\.|,|\?|!|$)/g, ' neuvième ') + .replace(/(^|\s)10i?(e|è)me?s?(\s|\.|,|\?|!|$)/g, ' dixième ') + //acronym fr-FR cleanup //based on common-voice/CorporaCreator#87 @@ -123,7 +150,7 @@ function clean(sentences) { .replace(/(^|\s)ISF(\s|\.|,|\?|!|$)/g, ' Impôt sur la fortune ') .replace(/(^|\s)IUT(\s|\.|,|\?|!|$)/g, ' Institut Universitaire de Technologie ') .replace(/(^|\s)LREM(\s|\.|,|\?|!|$)/g, ' La Réplublique En Marche ') - .replace(/(^|\s)NUPES(\s|\.|,|\?|!|$)/g, ' Nupes ') + .replace(/(^|\s)NUPES(\s|\.|,|\?|!|$)/g, ' Nupès ') .replace(/(^|\s)PHP(\s|\.|,|\?|!|$)/g, ' Protocole Hypertexte Protocolaire ') .replace(/(^|\s)PMA(\s|\.|,|\?|!|$)/g, ' Procréation médicalement assistée ') .replace(/(^|\s)PME(\s|\.|,|\?|!|$)/g, ' Petite et Moyenne Entreprise ') @@ -137,7 +164,10 @@ function clean(sentences) { .replace(/(^|\s)TVA(\s|\.|,|\?|!|$)/g, ' Taxe sur la Valeur Ajoutée ') .replace(/(^|\s)UDI(\s|\.|,|\?|!|$)/g, ' Union des Démocrates Indépendants ') .replace(/(^|\s)UMP(\s|\.|,|\?|!|$)/g, ' Union pour un Mouvement Populaire ') - .replace(/(^|\s)USA(\s|\.|,|\?|!|$)/g, ' Etats Unis d'Amérique ') + .replace(/(^|\s)USA(\s|\.|,|\?|!|$)/g, ' Etats Unis d\'Amérique ') + + //replace fraction 1/2 => '1 sur 2' + ¨.replace(/(^| )(\d+)(\s)?(\/)(\s)?(\d+)(\s|\.|,|\?|!|$)/g, '$2 sur $6') //dates, digits and numbers fr-FR cleanup //todo : CONVERT TO TEXT instead of removing it From 2abf67cc9be3ad8d6482bdf09012a493d1f46df5 Mon Sep 17 00:00:00 2001 From: CapitainFlam <31761317+CapitainFlam@users.noreply.github.com> Date: Wed, 14 Sep 2022 09:57:53 +0200 Subject: [PATCH 06/12] Update server/lib/cleanup/languages/fr.js of course :) Co-authored-by: Michael Kohler --- server/lib/cleanup/languages/fr.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/lib/cleanup/languages/fr.js b/server/lib/cleanup/languages/fr.js index e9c6890f..7dce6510 100644 --- a/server/lib/cleanup/languages/fr.js +++ b/server/lib/cleanup/languages/fr.js @@ -61,7 +61,7 @@ function clean(sentences) { //based on common-voice/CorporaCreator#87 .replace(/(^|\s|\w)\/an(\s|\.|,|\?|!|$)/g, '$1 par an ') .replace(/(^|\s)km(\s|\.|,|\?|!|$)/g, ' kilomètres ') - .replace(/%, ' pourcent ') + .replace(/%/, ' pourcent ') .replace(/(^|\s|\w)\+(\s|\.|,|\?|!|$)/g, ' plus ') .replace(/(^|\s|[0-9]+)m(?:2|²)(\s|\.|,|\?|!|$)/g, '$1 mètres carrés ') .replace(/(^|\s|[0-9]+)(\/|\/\s)m(?:2|²)(\s|\.|,|\?|!|$)/g, '$1 par mètres carrés ') From 12fcb1e2839a8ac2612dbead39cc463308d77138 Mon Sep 17 00:00:00 2001 From: CapitainFlam <31761317+CapitainFlam@users.noreply.github.com> Date: Thu, 15 Sep 2022 12:34:06 +0200 Subject: [PATCH 07/12] Update fr.js Notepad++ > Edit > transform TABS in SPACE. Yeahhhhhh --- server/lib/cleanup/languages/fr.js | 176 ++++++++++++++--------------- 1 file changed, 85 insertions(+), 91 deletions(-) diff --git a/server/lib/cleanup/languages/fr.js b/server/lib/cleanup/languages/fr.js index 7dce6510..6c54abe5 100644 --- a/server/lib/cleanup/languages/fr.js +++ b/server/lib/cleanup/languages/fr.js @@ -10,9 +10,9 @@ function sortSentences(sentences) { function clean(sentences) { return sentences.map((sentence) => { return sentence - //caracters and space cleanup - - // no space after opening '(' or '[' + //caracters and space cleanup + + // no space after opening '(' or '[' .replace(/\(\s+/g, '(') .replace(/\[\s+/g, '[') @@ -51,93 +51,87 @@ function clean(sentences) { .replace(/\?(?!\s+)/g, '? ') .replace(/!(?!\s+)/g, '! ') - //special names and places cleanup - //based on common-voice/CorporaCreator#87 - - //Jean-Paul II - .replace(/Jean-Paul II|Jean Paul II/g, 'Jean-Paul deux') - - //abrevation fr-FR cleanup - //based on common-voice/CorporaCreator#87 - .replace(/(^|\s|\w)\/an(\s|\.|,|\?|!|$)/g, '$1 par an ') - .replace(/(^|\s)km(\s|\.|,|\?|!|$)/g, ' kilomètres ') - .replace(/%/, ' pourcent ') - .replace(/(^|\s|\w)\+(\s|\.|,|\?|!|$)/g, ' plus ') - .replace(/(^|\s|[0-9]+)m(?:2|²)(\s|\.|,|\?|!|$)/g, '$1 mètres carrés ') - .replace(/(^|\s|[0-9]+)(\/|\/\s)m(?:2|²)(\s|\.|,|\?|!|$)/g, '$1 par mètres carrés ') - .replace(/\s?€/g, ' euros ') - .replace(/\s?£/g, ' livres ') - .replace(/\s?$/g, ' dollars ') - .replace(/(^| )(n|N)(?:°|º|°)(\s)?/g, ' $2uméro ') //n° or N° => 'numéro' or 'Numéro' - + //abrevation fr-FR cleanup + //based on common-voice/CorporaCreator#87 + .replace(/(^|\s|\w)\/an(\s|\.|,|\?|!|$)/g, '$1 par an ') + .replace(/(^|\s)km(\s|\.|,|\?|!|$)/g, ' kilomètres ') + .replace(/%/, ' pourcent ') + .replace(/(^|\s|\w)\+(\s|\.|,|\?|!|$)/g, ' plus ') + .replace(/(^|\s|[0-9]+)m(?:2|²)(\s|\.|,|\?|!|$)/g, '$1 mètres carrés ') + .replace(/(^|\s|[0-9]+)(\/|\/\s)m(?:2|²)(\s|\.|,|\?|!|$)/g, '$1 par mètres carrés ') + .replace(/\s?€/g, ' euros ') + .replace(/\s?£/g, ' livres ') + .replace(/\s?$/g, ' dollars ') + .replace(/(^| )(n|N)(?:°|º|°)(\s)?/g, ' $2uméro ') //n° or N° => 'numéro' or 'Numéro' + //roman numerals + century - .replace(/(^|\s)Ie(r)? s.(\s|\.|,|\?|!|$)/g, ' premier siècle ') - .replace(/(^|\s)II(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' deuxième siècle ') - .replace(/(^|\s)III(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' troisième siècle ') - .replace(/(^|\s)IV(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' quatrième siècle ') - .replace(/(^|\s)V(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' cinquième siècle ') - .replace(/(^|\s)VI(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' sixième siècle ') - .replace(/(^|\s)VII(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' septième siècle ') - .replace(/(^|\s)VIII(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' huitième siècle ') - .replace(/(^|\s)(VIIII|IX)(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' neuvième siècle ') - .replace(/(^|\s)X(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' dixième siècle ') - .replace(/(^|\s)XI(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' onzième siècle ') - .replace(/(^|\s)XII(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' douxième siècle ') - .replace(/(^|\s)XIII(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' treizième siècle ') - .replace(/(^|\s)(XIIII|XIV)(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' quatorzième siècle ') - .replace(/(^|\s)XV(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' quinzième siècle ') - .replace(/(^|\s)XVI(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' seixième siècle ') - .replace(/(^|\s)XVII(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' dix-septième siècle ') - .replace(/(^|\s)XVIII(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' dix-huitième siècle ') - .replace(/(^|\s)(XIX|XVIIII)(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' dix_neuvième siècle ') - .replace(/(^|\s)XX(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' vingtième siècle ') - .replace(/(^|\s)XXI(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' vingt-et-unième siècle ') - .replace(/(^|\s)XXII(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' vingt-deuxième siècle ') + .replace(/(^|\s)Ie(r)? s.(\s|\.|,|\?|!|$)/g, ' premier siècle ') + .replace(/(^|\s)II(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' deuxième siècle ') + .replace(/(^|\s)III(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' troisième siècle ') + .replace(/(^|\s)IV(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' quatrième siècle ') + .replace(/(^|\s)V(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' cinquième siècle ') + .replace(/(^|\s)VI(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' sixième siècle ') + .replace(/(^|\s)VII(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' septième siècle ') + .replace(/(^|\s)VIII(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' huitième siècle ') + .replace(/(^|\s)(VIIII|IX)(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' neuvième siècle ') + .replace(/(^|\s)X(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' dixième siècle ') + .replace(/(^|\s)XI(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' onzième siècle ') + .replace(/(^|\s)XII(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' douxième siècle ') + .replace(/(^|\s)XIII(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' treizième siècle ') + .replace(/(^|\s)(XIIII|XIV)(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' quatorzième siècle ') + .replace(/(^|\s)XV(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' quinzième siècle ') + .replace(/(^|\s)XVI(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' seixième siècle ') + .replace(/(^|\s)XVII(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' dix-septième siècle ') + .replace(/(^|\s)XVIII(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' dix-huitième siècle ') + .replace(/(^|\s)(XIX|XVIIII)(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' dix_neuvième siècle ') + .replace(/(^|\s)XX(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' vingtième siècle ') + .replace(/(^|\s)XXI(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' vingt-et-unième siècle ') + .replace(/(^|\s)XXII(e|è)(me)? s.(\s|\.|,|\?|!|$)/g, ' vingt-deuxième siècle ') //roman numerals. - .replace(/(^|\s)I(\s|\.|,|\?|!|$)/g, ' premier ') //translated as 'first'. We considere that it's encountered after chapter (Chapitre I => 'chapitre premier'). Work also with names (Charles I => 'Charles premier') - .replace(/(^|\s)II(\s|\.|,|\?|!|$)/g, ' deux ') - .replace(/(^|\s)III(\s|\.|,|\?|!|$)/g, ' trois ') - .replace(/(^|\s)IV(\s|\.|,|\?|!|$)/g, ' quatre ') - .replace(/(^|\s)V(\s|\.|,|\?|!|$)/g, ' cinq ') - .replace(/(^|\s)VI(\s|\.|,|\?|!|$)/g, ' six ') - .replace(/(^|\s)VII(\s|\.|,|\?|!|$)/g, ' sept ') - .replace(/(^|\s)VIII(\s|\.|,|\?|!|$)/g, ' huit ') - .replace(/(^|\s)(VIIII|IX)(\s|\.|,|\?|!|$)/g, ' neuf ') - .replace(/(^|\s)X(\s|\.|,|\?|!|$)/g, ' dix ') - .replace(/(^|\s)XI(\s|\.|,|\?|!|$)/g, ' onze ') - .replace(/(^|\s)XII(\s|\.|,|\?|!|$)/g, ' douze ') - .replace(/(^|\s)XIII(\s|\.|,|\?|!|$)/g, ' treize ') - .replace(/(^|\s)(XIIII|XIV)(\s|\.|,|\?|!|$)/g, ' quatorze ') - .replace(/(^|\s)XV(\s|\.|,|\?|!|$)/g, ' quinze ') - .replace(/(^|\s)XVI(\s|\.|,|\?|!|$)/g, ' seize ') - .replace(/(^|\s)XVII(\s|\.|,|\?|!|$)/g, ' dix-sept ') - .replace(/(^|\s)XVIII(\s|\.|,|\?|!|$)/g, ' dix-huit ') - .replace(/(^|\s)(XIX|XVIIII)(\s|\.|,|\?|!|$)/g, ' dix-neuf ') - .replace(/(^|\s)XX(\s|\.|,|\?|!|$)/g, ' vingt ') - .replace(/(^|\s)XXI(\s|\.|,|\?|!|$)/g, ' vingt-et-un ') - .replace(/(^|\s)XXII(\s|\.|,|\?|!|$)/g, ' vingt-deux ') + .replace(/(^|\s)I(\s|\.|,|\?|!|$)/g, ' premier ') //translated as 'first'. We considere that it's encountered after chapter (Chapitre I => 'chapitre premier'). Work also with names (Charles I => 'Charles premier') + .replace(/(^|\s)II(\s|\.|,|\?|!|$)/g, ' deux ') + .replace(/(^|\s)III(\s|\.|,|\?|!|$)/g, ' trois ') + .replace(/(^|\s)IV(\s|\.|,|\?|!|$)/g, ' quatre ') + .replace(/(^|\s)V(\s|\.|,|\?|!|$)/g, ' cinq ') + .replace(/(^|\s)VI(\s|\.|,|\?|!|$)/g, ' six ') + .replace(/(^|\s)VII(\s|\.|,|\?|!|$)/g, ' sept ') + .replace(/(^|\s)VIII(\s|\.|,|\?|!|$)/g, ' huit ') + .replace(/(^|\s)(VIIII|IX)(\s|\.|,|\?|!|$)/g, ' neuf ') + .replace(/(^|\s)X(\s|\.|,|\?|!|$)/g, ' dix ') + .replace(/(^|\s)XI(\s|\.|,|\?|!|$)/g, ' onze ') + .replace(/(^|\s)XII(\s|\.|,|\?|!|$)/g, ' douze ') + .replace(/(^|\s)XIII(\s|\.|,|\?|!|$)/g, ' treize ') + .replace(/(^|\s)(XIIII|XIV)(\s|\.|,|\?|!|$)/g, ' quatorze ') + .replace(/(^|\s)XV(\s|\.|,|\?|!|$)/g, ' quinze ') + .replace(/(^|\s)XVI(\s|\.|,|\?|!|$)/g, ' seize ') + .replace(/(^|\s)XVII(\s|\.|,|\?|!|$)/g, ' dix-sept ') + .replace(/(^|\s)XVIII(\s|\.|,|\?|!|$)/g, ' dix-huit ') + .replace(/(^|\s)(XIX|XVIIII)(\s|\.|,|\?|!|$)/g, ' dix-neuf ') + .replace(/(^|\s)XX(\s|\.|,|\?|!|$)/g, ' vingt ') + .replace(/(^|\s)XXI(\s|\.|,|\?|!|$)/g, ' vingt-et-un ') + .replace(/(^|\s)XXII(\s|\.|,|\?|!|$)/g, ' vingt-deux ') //first, second, etc. - .replace(/(^|\s)1er?s?(\s|\.|,|\?|!|$)/g, ' premier ') - .replace(/(^|\s)1(e|è)res?(\s|\.|,|\?|!|$)/g, ' premier ') - .replace(/(^|\s)2(e|è)?me?s?(\s|\.|,|\?|!|$)/g, ' deuxième ') - .replace(/(^|\s)2n?ds?(\s|\.|,|\?|!|$)/g, ' second ') - .replace(/(^|\s)2n?des?(\s|\.|,|\?|!|$)/g, ' seconde ') - .replace(/(^|\s)3i?(e|è)me?s?(\s|\.|,|\?|!|$)/g, ' troisième ') - .replace(/(^|\s)4i?(e|è)me?s?(\s|\.|,|\?|!|$)/g, ' quatrième ') - .replace(/(^|\s)5i?(e|è)me?s?(\s|\.|,|\?|!|$)/g, ' cinquième ') - .replace(/(^|\s)6i?(e|è)me?s?(\s|\.|,|\?|!|$)/g, ' sixième ') - .replace(/(^|\s)7i?(e|è)me?s?(\s|\.|,|\?|!|$)/g, ' septième ') - .replace(/(^|\s)8i?(e|è)me?s?(\s|\.|,|\?|!|$)/g, ' huitième ') - .replace(/(^|\s)9i?(e|è)me?s?(\s|\.|,|\?|!|$)/g, ' neuvième ') - .replace(/(^|\s)10i?(e|è)me?s?(\s|\.|,|\?|!|$)/g, ' dixième ') - - - //acronym fr-FR cleanup - //based on common-voice/CorporaCreator#87 - .replace(/(^|\s)ANPE(\s|\.|,|\?|!|$)/g, ' Agence Nationale Pour l\'Emploi ') + .replace(/(^|\s)1er?s?(\s|\.|,|\?|!|$)/g, ' premier ') + .replace(/(^|\s)1(e|è)res?(\s|\.|,|\?|!|$)/g, ' premier ') + .replace(/(^|\s)2(e|è)?me?s?(\s|\.|,|\?|!|$)/g, ' deuxième ') + .replace(/(^|\s)2n?ds?(\s|\.|,|\?|!|$)/g, ' second ') + .replace(/(^|\s)2n?des?(\s|\.|,|\?|!|$)/g, ' seconde ') + .replace(/(^|\s)3i?(e|è)me?s?(\s|\.|,|\?|!|$)/g, ' troisième ') + .replace(/(^|\s)4i?(e|è)me?s?(\s|\.|,|\?|!|$)/g, ' quatrième ') + .replace(/(^|\s)5i?(e|è)me?s?(\s|\.|,|\?|!|$)/g, ' cinquième ') + .replace(/(^|\s)6i?(e|è)me?s?(\s|\.|,|\?|!|$)/g, ' sixième ') + .replace(/(^|\s)7i?(e|è)me?s?(\s|\.|,|\?|!|$)/g, ' septième ') + .replace(/(^|\s)8i?(e|è)me?s?(\s|\.|,|\?|!|$)/g, ' huitième ') + .replace(/(^|\s)9i?(e|è)me?s?(\s|\.|,|\?|!|$)/g, ' neuvième ') + .replace(/(^|\s)10i?(e|è)me?s?(\s|\.|,|\?|!|$)/g, ' dixième ') + + + //acronym fr-FR cleanup + //based on common-voice/CorporaCreator#87 + .replace(/(^|\s)ANPE(\s|\.|,|\?|!|$)/g, ' Agence Nationale Pour l\'Emploi ') .replace(/(^|\s)APL(\s|\.|,|\?|!|$)/g, ' Aide personnalisée au logement ') .replace(/(^|\s)CDI(\s|\.|,|\?|!|$)/g, ' Contrat à Durée Indéterminée ') .replace(/(^|\s)CICE(\s|\.|,|\?|!|$)/g, ' Crédit d\'impôt pour la compétitivité et l\'emploi ') @@ -169,14 +163,14 @@ function clean(sentences) { //replace fraction 1/2 => '1 sur 2' ¨.replace(/(^| )(\d+)(\s)?(\/)(\s)?(\d+)(\s|\.|,|\?|!|$)/g, '$2 sur $6') - //dates, digits and numbers fr-FR cleanup - //todo : CONVERT TO TEXT instead of removing it - .replace((^|\s)\d{1,2}\/\d{1,2}\/(\d{2}[^\d]|\d{4})(\s|$), ' ') //date format dd/mm/yy ou dd/mm/yyyy - .replace((^|\s)\d{1,2}\/(\d{2}[^\d]|\d{4})(\s|$), ' ') //date format mm/yy ou mm/yyyy - .replace(\d, '') //any digit ou number left + //dates, digits and numbers fr-FR cleanup + //todo : CONVERT TO TEXT instead of removing it + .replace((^|\s)\d{1,2}\/\d{1,2}\/(\d{2}[^\d]|\d{4})(\s|$), ' ') //date format dd/mm/yy ou dd/mm/yyyy + .replace((^|\s)\d{1,2}\/(\d{2}[^\d]|\d{4})(\s|$), ' ') //date format mm/yy ou mm/yyyy + .replace(\d, '') //any digit ou number left - // Final normalization of spaces - .replace(/\s+/g, ' ') + // Final normalization of spaces + .replace(/\s+/g, ' ') .replace(/\s+$/g, '') ; From 4a2ea4e96b2acc12c379c205225b50eee3252016 Mon Sep 17 00:00:00 2001 From: CapitainFlam <31761317+CapitainFlam@users.noreply.github.com> Date: Thu, 15 Sep 2022 12:43:40 +0200 Subject: [PATCH 08/12] Update fr.js as requested, only keeping FR and removing EN error description... But adding EN comment, for ^FR readers sake. --- server/lib/validation/languages/fr.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/server/lib/validation/languages/fr.js b/server/lib/validation/languages/fr.js index 3ae1e018..09ecf087 100644 --- a/server/lib/validation/languages/fr.js +++ b/server/lib/validation/languages/fr.js @@ -1,3 +1,5 @@ +//see : https://github.com/common-voice/sentence-collector/blob/main/server/lib/validation/VALIDATION.md for more information + const tokenizeWords = require('talisman/tokenizers/words'); // Minimum of words that qualify as a sentence. @@ -7,24 +9,27 @@ const MIN_WORDS = 1; const MAX_WORDS = 14; const INVALIDATIONS = [{ + //[min..max] words fn: (sentence) => { const words = tokenizeWords(sentence); return words.length < MIN_WORDS || words.length > MAX_WORDS; }, - error: `Number of words must be between ${MIN_WORDS} and ${MAX_WORDS} (inclusive) - Le nombre de mot doit être entre ${MIN_WORDS} et ${MAX_WORDS} (inclus)`, + error: `Le nombre de mots doit être entre ${MIN_WORDS} et ${MAX_WORDS} (inclus)`, }, { + //no numbers regex: /[0-9]+/, - error: 'Sentence should not contain numbers - les phrases ne doivent pas contenir de nombres', + error: 'Les phrases ne doivent pas contenir de nombres', }, { + //no symbols regex: /[<>+*#@%^[\]()/]/, - error: 'Sentence should not contain symbols - les phrases de doivent pas contenir de symboles \(\*, \#, \(, etc\)', + error: 'Les phrases de doivent pas contenir de symboles (*, #, (, etc.)', }, { // Any words consisting of uppercase letters or uppercase letters with a period // inbetween are considered abbreviations or acronyms. // This currently also matches fooBAR but we most probably don't want that either // as users wouldn't know how to pronounce the uppercase letters. regex: /[A-Z]{2,}|[A-Z]+\.*[A-Z]+/, - error: 'Sentence should not contain abbreviations - Les phrases ne doivent pas contenir des abréviations ou sigles', + error: 'Les phrases ne doivent pas contenir des abréviations ou sigles', }]; module.exports = { From aef428430ae01712fb491e09dae157b9b4b62c3b Mon Sep 17 00:00:00 2001 From: CapitainFlam <31761317+CapitainFlam@users.noreply.github.com> Date: Thu, 15 Sep 2022 13:47:46 +0200 Subject: [PATCH 09/12] Update fr.js We do not remove PUNCTUATION (?!, etc.) after finding them, we just put them back as we found them. --- server/lib/cleanup/languages/fr.js | 56 +++++++++++++++--------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/server/lib/cleanup/languages/fr.js b/server/lib/cleanup/languages/fr.js index 6c54abe5..d911d88d 100644 --- a/server/lib/cleanup/languages/fr.js +++ b/server/lib/cleanup/languages/fr.js @@ -131,34 +131,34 @@ function clean(sentences) { //acronym fr-FR cleanup //based on common-voice/CorporaCreator#87 - .replace(/(^|\s)ANPE(\s|\.|,|\?|!|$)/g, ' Agence Nationale Pour l\'Emploi ') - .replace(/(^|\s)APL(\s|\.|,|\?|!|$)/g, ' Aide personnalisée au logement ') - .replace(/(^|\s)CDI(\s|\.|,|\?|!|$)/g, ' Contrat à Durée Indéterminée ') - .replace(/(^|\s)CICE(\s|\.|,|\?|!|$)/g, ' Crédit d\'impôt pour la compétitivité et l\'emploi ') - .replace(/(^|\s)DRH(\s|\.|,|\?|!|$)/g, ' Direction des Ressources Humaines ') - .replace(/(^|\s)EDF(\s|\.|,|\?|!|$)/g, ' Electricité de France ') - .replace(/(^|\s)FN(\s|\.|,|\?|!|$)/g, ' Front National ') - .replace(/(^|\s)HLM(\s|\.|,|\?|!|$)/g, ' Habitation à Loyer Modéré ') - .replace(/(^|\s)IGN(\s|\.|,|\?|!|$)/g, ' Institut Géographique National ') - .replace(/(^|\s)INPI(\s|\.|,|\?|!|$)/g, ' Institut National de la Propriété Intellectuelle ') - .replace(/(^|\s)ISF(\s|\.|,|\?|!|$)/g, ' Impôt sur la fortune ') - .replace(/(^|\s)IUT(\s|\.|,|\?|!|$)/g, ' Institut Universitaire de Technologie ') - .replace(/(^|\s)LREM(\s|\.|,|\?|!|$)/g, ' La Réplublique En Marche ') - .replace(/(^|\s)NUPES(\s|\.|,|\?|!|$)/g, ' Nupès ') - .replace(/(^|\s)PHP(\s|\.|,|\?|!|$)/g, ' Protocole Hypertexte Protocolaire ') - .replace(/(^|\s)PMA(\s|\.|,|\?|!|$)/g, ' Procréation médicalement assistée ') - .replace(/(^|\s)PME(\s|\.|,|\?|!|$)/g, ' Petite et Moyenne Entreprise ') - .replace(/(^|\s)RN(\s|\.|,|\?|!|$)/g, ' Rassemblement National ') - .replace(/(^|\s)RSA(\s|\.|,|\?|!|$)/g, ' Revenu de Solidarité Active ') - .replace(/(^|\s)RSA(\s|\.|,|\?|!|$)/g, ' Revenu de Solidarité Active ') - .replace(/(^|\s)RSI(\s|\.|,|\?|!|$)/g, ' Régime Social des Indépendants ') - .replace(/(^|\s)RTE(\s|\.|,|\?|!|$)/g, ' Réseau de Transport d\'Électricité ') - .replace(/(^|\s)SNCF(\s|\.|,|\?|!|$)/g, ' Société Nationale des Chemins de Fer ') - .replace(/(^|\s)TGV(\s|\.|,|\?|!|$)/g, ' Train à Grande Vitesse ') - .replace(/(^|\s)TVA(\s|\.|,|\?|!|$)/g, ' Taxe sur la Valeur Ajoutée ') - .replace(/(^|\s)UDI(\s|\.|,|\?|!|$)/g, ' Union des Démocrates Indépendants ') - .replace(/(^|\s)UMP(\s|\.|,|\?|!|$)/g, ' Union pour un Mouvement Populaire ') - .replace(/(^|\s)USA(\s|\.|,|\?|!|$)/g, ' Etats Unis d\'Amérique ') + .replace(/(^|\s)ANPE(\s|\.|,|\?|!|$)/g, ' Agence Nationale Pour l\'Emploi $3 ') + .replace(/(^|\s)APL(\s|\.|,|\?|!|$)/g, ' Aide personnalisée au logement $3 ') + .replace(/(^|\s)CDI(\s|\.|,|\?|!|$)/g, ' Contrat à Durée Indéterminée $3 ') + .replace(/(^|\s)CICE(\s|\.|,|\?|!|$)/g, ' Crédit d\'impôt pour la compétitivité et l\'emploi $3 ') + .replace(/(^|\s)DRH(\s|\.|,|\?|!|$)/g, ' Direction des Ressources Humaines $3 ') + .replace(/(^|\s)EDF(\s|\.|,|\?|!|$)/g, ' Electricité de France $3 ') + .replace(/(^|\s)FN(\s|\.|,|\?|!|$)/g, ' Front National $3 ') + .replace(/(^|\s)HLM(\s|\.|,|\?|!|$)/g, ' Habitation à Loyer Modéré $3 ') + .replace(/(^|\s)IGN(\s|\.|,|\?|!|$)/g, ' Institut Géographique National $3 ') + .replace(/(^|\s)INPI(\s|\.|,|\?|!|$)/g, ' Institut National de la Propriété Intellectuelle $3 ') + .replace(/(^|\s)ISF(\s|\.|,|\?|!|$)/g, ' Impôt sur la fortune $3 ') + .replace(/(^|\s)IUT(\s|\.|,|\?|!|$)/g, ' Institut Universitaire de Technologie $3 ') + .replace(/(^|\s)LREM(\s|\.|,|\?|!|$)/g, ' La Réplublique En Marche $3 ') + .replace(/(^|\s)NUPES(\s|\.|,|\?|!|$)/g, ' Nupès $3 ') + .replace(/(^|\s)PHP(\s|\.|,|\?|!|$)/g, ' Protocole Hypertexte Protocolaire $3 ') + .replace(/(^|\s)PMA(\s|\.|,|\?|!|$)/g, ' Procréation médicalement assistée $3 ') + .replace(/(^|\s)PME(\s|\.|,|\?|!|$)/g, ' Petite et Moyenne Entreprise $3 ') + .replace(/(^|\s)RN(\s|\.|,|\?|!|$)/g, ' Rassemblement National $3 ') + .replace(/(^|\s)RSA(\s|\.|,|\?|!|$)/g, ' Revenu de Solidarité Active $3 ') + .replace(/(^|\s)RSA(\s|\.|,|\?|!|$)/g, ' Revenu de Solidarité Active $3 ') + .replace(/(^|\s)RSI(\s|\.|,|\?|!|$)/g, ' Régime Social des Indépendants $3 ') + .replace(/(^|\s)RTE(\s|\.|,|\?|!|$)/g, ' Réseau de Transport d\'Électricité $3 ') + .replace(/(^|\s)SNCF(\s|\.|,|\?|!|$)/g, ' Société Nationale des Chemins de Fer $3 ') + .replace(/(^|\s)TGV(\s|\.|,|\?|!|$)/g, ' Train à Grande Vitesse $3 ') + .replace(/(^|\s)TVA(\s|\.|,|\?|!|$)/g, ' Taxe sur la Valeur Ajoutée $3 ') + .replace(/(^|\s)UDI(\s|\.|,|\?|!|$)/g, ' Union des Démocrates Indépendants $3 ') + .replace(/(^|\s)UMP(\s|\.|,|\?|!|$)/g, ' Union pour un Mouvement Populaire $3 ') + .replace(/(^|\s)USA(\s|\.|,|\?|!|$)/g, ' Etats Unis d\'Amérique $3 ') //replace fraction 1/2 => '1 sur 2' ¨.replace(/(^| )(\d+)(\s)?(\/)(\s)?(\d+)(\s|\.|,|\?|!|$)/g, '$2 sur $6') From 18fdf37f6554dc015b19c82cac1b5627a82e766d Mon Sep 17 00:00:00 2001 From: CapitainFlam <31761317+CapitainFlam@users.noreply.github.com> Date: Thu, 15 Sep 2022 13:53:19 +0200 Subject: [PATCH 10/12] Update fr.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit remplacing – (long hyphen) by - (short hyphen) --- server/lib/cleanup/languages/fr.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/server/lib/cleanup/languages/fr.js b/server/lib/cleanup/languages/fr.js index d911d88d..c609a828 100644 --- a/server/lib/cleanup/languages/fr.js +++ b/server/lib/cleanup/languages/fr.js @@ -20,6 +20,9 @@ function clean(sentences) { .replace(/\s+\)/g, ')') .replace(/\s+\]/g, ']') + // remplacing – (long hyphen) by - (short hyphen) + .replace(/–/g, '-') + // no space before or after hyphen .replace(/\s+-\s+/g, '-') From 1a0cff5772ac2015ed8e2e90660069913fd75fac Mon Sep 17 00:00:00 2001 From: CapitainFlam <31761317+CapitainFlam@users.noreply.github.com> Date: Thu, 15 Sep 2022 13:56:51 +0200 Subject: [PATCH 11/12] Update fr.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Normalize ´ (french apostroph) into ' (usual apostroph) --- server/lib/cleanup/languages/fr.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/server/lib/cleanup/languages/fr.js b/server/lib/cleanup/languages/fr.js index c609a828..6b174d55 100644 --- a/server/lib/cleanup/languages/fr.js +++ b/server/lib/cleanup/languages/fr.js @@ -20,9 +20,8 @@ function clean(sentences) { .replace(/\s+\)/g, ')') .replace(/\s+\]/g, ']') - // remplacing – (long hyphen) by - (short hyphen) + // normalize – (long hyphen) into - (short hyphen) .replace(/–/g, '-') - // no space before or after hyphen .replace(/\s+-\s+/g, '-') @@ -36,6 +35,9 @@ function clean(sentences) { // Normalize three consecutive dots into unicode elipsis .replace(/\.{3}/g, '…') + // Normalize ´ (french apostroph) into ' (usual apostroph) + .replace(/\´/g, '\'') + // In fr-FR, those should have a no space before and a normal space after .replace(/\s+,/g, ',') // before ... .replace(/\s+\./g, '.') From 8d7d97340fb5e98c47228a8fd709d46d1968b7f1 Mon Sep 17 00:00:00 2001 From: CapitainFlam <31761317+CapitainFlam@users.noreply.github.com> Date: Thu, 15 Sep 2022 14:32:09 +0200 Subject: [PATCH 12/12] Update fr.js adding an other apostroph found in original source document as https://github.com/common-voice/commonvoice-fr/blob/master/CommonVoice-Data/data/debats-assemblee-nationale/20130718093000000.txt --- server/lib/cleanup/languages/fr.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/lib/cleanup/languages/fr.js b/server/lib/cleanup/languages/fr.js index 6b174d55..2f0ede81 100644 --- a/server/lib/cleanup/languages/fr.js +++ b/server/lib/cleanup/languages/fr.js @@ -35,8 +35,8 @@ function clean(sentences) { // Normalize three consecutive dots into unicode elipsis .replace(/\.{3}/g, '…') - // Normalize ´ (french apostroph) into ' (usual apostroph) - .replace(/\´/g, '\'') + // Normalize ´ or ’ (french apostroph) into ' (usual apostroph) + .replace(/\´|’/g, '\'') // In fr-FR, those should have a no space before and a normal space after .replace(/\s+,/g, ',') // before ...