kNombreMots() retourne le nombre de mots et, dans l'ordre alphabétique, le nombre de chaque mot.
par
, 15/09/2016 à 01h42 (1730 Affichages)
Pour construire cette fonction, j'ai utilisé :
- l'algorithme MapReduce, la version ES2015 d'Autran : Tutoriel pour implémenter un algorithme de MapReduce en JavaScript classique et ES6
- la fonction sortTable, mise au point dans le billet Exemples d'utilisation de ECMAScript Internationalization API, et déjà utilisée dans le billet Tri alphanumérique et fréquence des caractères d'un texte
J'ai dû faire des choix pour la césure et l'élimination. J'élimine les espaces vident, mais aussi les chiffres et les mots de moins de trois caractères. Donc on ne trouvera pas de date, de "l" de l'été, de "à" ou de "la" dans le résultat. J'ai testé des contenus divers sans voir de gros problèmes, mais cela ne veut pas dire qu'il n'y en a pas.
Vous pouvez modifier mes choix en changeant :
- le contenu du RegExp de la méthode split( /[0-9=&<'>\-\_\—\/\{’\}"«,»\[;\](.)\s\n\r\v\t]/ ) ;
- la règle d'élimination : str.length < 3.
Le code de la fonction kNombreMots
Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 const kNombreMots = inputString => { const sortTable = function( table, ordre, bcp47String ){ let bcpStr = bcp47String || "fr-BE", ctor = new Intl.Collator( bcpStr, { "numeric" : true } ), n = ( ordre === "desc" ) ? ( -1 ) : ( 1 ); table.sort( function( a, b ){ return n * ctor.compare( a, b ); }); return table; }, /* * La fonction convertir élimine les espaces vident et * les mots de deux caractères. * Elle retourne un array clé/valeur. */ convertir = str => str.toLocaleLowerCase().split( /[0-9=&<'>\-\_\\/\{\}"«,»\[;\](.)\s\n\r\v\t]/ ).map( str => ( str.length < 3 ) ? [ str, [0] ] : [ str, [1] ]).filter( elem => elem[1][0] > 0 ), // La fonction remanier regroupe les valeurs par clé remanier = arr => { let sortedArray = sortTable( arr ); sortedArray.forEach( ( elem, index, arr ) => { while ( arr[ index + 1 ] && elem[0] === arr[ index + 1 ][0] ){ arr[ index ][1].push( 1 ); arr.splice( index + 1, 1 ); } }); return sortedArray; }, // La fonction contracter renvoie un tableau clé/nombre doccurrences contracter = arr => arr.map( elem => [ elem[0], elem[1].reduce( ( a, b ) => a + b ) ] ); let outputHTML = "", nbMots = 0; for ( let item of contracter( remanier( convertir( inputString ) ) ) ){ nbMots += item[1]; outputHTML += "<p>" + item[0] + " : " + item[1] + "</p>"; } return "<p>Nombre de mots : " + nbMots + "</p>" + outputHTML };
Exemple 1 : un bout de code.
Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 let str = `convertir = str => str.toLocaleLowerCase().split( /[<'>\-\_\\{\}"«,»\[;\](.)\s\n\r\v\t]/ ).map( str => ( str.length < 2 ) ? [ str, [0] ] : [ str, [1] ]).filter( elem => elem[1][0] > 0 )`; k$( "#inputString" ).textContent = str; k$( "#outputString" ).innerHTML = kNombreMots( str );
Exemple 2 : un copier-coller du web.Texte convertir = str => str.toLocaleLowerCase().split( /[<'>-_—{’}"«,»[;](.)s ]/ ).map( str => ( str.length < 2 ) ? [ str, [0] ] : [ str, [1] ]).filter( elem => elem[1][0] > 0 ) Mots Nombre de mots : 14 convertir : 1 elem : 2 filter : 1 length : 1 map : 1 split : 1 str : 6 tolocalelowercase : 1
Dans cet exemple on voit des mots qui ne sont pas dans le dictionnaire : "pbde" et "eee". Mais l'auteur du texte a dû les taper, donc je juge que l'on peut les compter.