Compter le nombre d’occurrences de chaque mot d'un texte.
Salut,
Compter le nombre d’occurrences de chaque mot d'un texte...
J'ai fait ça :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| texte = "Salut tout le monde, c'est un texte pour tester le code... Salut tout le monde, c'est un texte pour tester le code..."
div = texte.split(/[^a-zA-Z]/)
console.log(div);
dico = {}
for (let mot of div) {
if (mot != "") {
if (dico[mot] != undefined) {
dico[mot] += 1;
} else {
dico[mot] = 1
}
}
}
console.log(dico); |
Peut-on améliorer le code ?
Et moi qui croyais que l'on parlait d'amélioration !!
Visiblement on n’a pas tous la même vision de « Peut-on améliorer le code ? »
Pour moi, améliorer le code c’est, entre autre, améliorer la lisibilité et donc la maintenance de celui-ci, la concision parfois incompatible avec la lisibilité, permettre les tests, séparer les tâches à effectuer afin de simplifier la complexité de celles-ci ... et pourquoi pas optimiser.
Indépendamment des bonnes manières à respecter, déclaration des variables …, et ce quelque soit le langage, une des améliorations passerait par la création d’une fonction réutilisable par tâche à accomplir.
On définie la fonction avec
- Ce qu’elle attend en entrée
- Le traitement a effectué
- ce qu’elle l’on retourne pour exploitation dans le reste du code.
On pourrait donc imaginer la définition de la fonction, son prototype, comme suit
Code:
1 2 3 4 5 6 7 8 9 10 11
| /**
* @param {String} texte Texte à traiter
* @param {Number} minlength Longueur minimale des mots à prendre en compte
* @returns {Array of Array} result - Tableau des données sous forme [[mot1, nbr1], [mot1, nbr2], [
]
*/
function getOccurrenceTexte(text, minlength) {
// déclaration des variables
// préparation des données
// traitement des données
return result;
} |
@psychadelic :
•••
Il manque à minima un test sur la donnée de départ, que se passe t-il si le texte est null ?
•••
Citation:
Tout d’abord, ce code utilise « intensivement » la technique de chainage présente dans JS
Pour moi dans bien des cas le chaînage entraîne une perte de lisibilité et est accessoirement plus délicat à déboguer.
•••
Citation:
.filter(s=>(s!==undefined && s.length > 3) )
Pourquoi ne pas le faire dans reduce, on réduit ainsi le nombre d’itérations nécessaires pour obtenir le même résultat !?!
•••
Citation:
.reduce((a,c,i,t)=> // crée un tableau d'objet
L’amélioration du code passe aussi par le choix judicieux du nom des variables.
Pourquoi utiliser reduce, => réduire, alors que ce n’est pas vraiment, parmi toutes les méthodes disponibles, la mieux adaptée et ce au moins sémantiquement parlant ne serait ce que par rapport à forEach.
Il est à noter que, si l’on parle d’optimisation/performance, les méthodes forEach et reduce seront moins performante qu’une bonne boucle for du fait de l'appel à une fonction callback, mais ceci ne doit pas forcément être un critère !
•••
Citation:
let occurences = new Set()
Là totale incompréhension de ma part, déjà ici on aborde une autre partie, la sortie affichage, et cela devrait donc se trouver dans une fonction indépendante en utilisant les données reçues.
De plus je ne vois pas l’intérêt de passer par un new Set quand les données sont disponibles, pour l'affichage suivant. Tu as déjà « en sortie »
Code:
1 2 3 4 5 6 7 8 9
| decoup = [
{
"m": "abri",
"n": 1
},
{
"m": "affaler",
"n": 1
}, |
Il en est de même pour l’affichage sous forme de <table> et l’utilisation de
Code:
1 2 3 4
| decoup
.filter(d => d.n === o)
.map(e => e.m)
.join(', ') |
Mais là pour le coup, dans ton code, je pense que cela limite pas mal la gestion des lignes.
•••
Donc oui tes explications sont très MDNesque mais à mon avis tu t’es plus fait plaisir qu’amélioré le code de départ.
En gros comme le dit Beginner.
Citation:
Et oui celui de psychadelic nécessite un peu plus de temps pour être compris et le débogueur aide bien lol...
Donc pas franchement une amélioration mais une autre façon de faire.
Un dernier point, omettre le ; (point virgule) en fin d’instruction peut rendre le code inutilisable en cas de minification et même parfois dans le code non minifié.
@Beginner. :
Citation:
Tu aurais utiliser une autre boucle ?
peut importe mais surement une sur base forEach, pour la sémantique ou for pour l'optimisation éventuelle.
Cela pourrait donner, en tenant compte de certaines remarques
Code:
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
| /**----------------------------------------------------------------------
* Fonction de récupération du nombre doccurrence des mots dans un texte
*-----------------------------------------------------------------------
* @param {String} texte Texte à traiter
* @param {Number} minlength Longueur minimale des mots à prendre en compte
* @returns {Array of Array} result - Tableau des données sous forme [[mot1, nbr1], [mot1, nbr2], [
]
*/
function getOccurrenceTexte(text = "", minlength = 3) {
const objResult = {};
const CosmoKnackiReg = /[a-zàèìòùáéíóúýâêîôûãñõäëïöüÿçߨøåæ]+/g;
// préparation et récupération des données
const tabMots = text.toLowerCase().match(CosmoKnackiReg);
if (tabMots) {
// récupération de toutes les occurrences
tabMots.forEach( (el) => {
if( el.length >= minlength){
if (!objResult[el]) objResult[el] = 0;
objResult[el] += 1
}
});
}
// convert en array d'array
const tabResult = Object.entries(objResult);
// on peut trier dans l'ordre alpha par défaut
tabResult.sort((a, b) => a[0].localeCompare(b[0]));
return tabResult;
} |
L'appel à celle-ci se faisant simplement par exemple
Code:
1 2 3
| const texte = document.querySelector('#mon-texte').textContent;
const result = getOccurrenceTexte(texte);
// les données sont ici disponible pour en faire l'affichage par exemple. |
Le contenu de la boucle pouvant varier, ce ne sont pas les choix qui manquent
Code:
1 2 3 4 5
| tabMots.forEach( (el) => {
if( el.length >= minlength){
objResult[el] ? objResult[el] += 1: objResult[el] = 1;
}
}); |
ou encore
Code:
1 2 3 4 5 6 7 8 9 10
| tabMots.forEach( (el) => {
if( el.length >= minlength){
if (objResult[el]) {
objResult[el] += 1;
}
else {
objResult[el] = 1;
}
}
}); |
et il y en a d'autres.
[EDIT] Il s'est permis, j'ai corrigé, je manque d'air sur ce coup !