Question

Quel est le moyen le plus efficace et le plus efficace de compter les mots clés en JavaScript? En gros, j'aimerais prendre une chaîne et obtenir les N mots ou expressions qui se trouvent dans la chaîne en tête, principalement pour l'utilisation de balises indicatrices. Je recherche davantage des conseils conceptuels ou des liens vers des exemples concrets que du code réel, mais cela ne me dérangerait certainement pas si vous souhaitez également partager du code. S'il y a des fonctions particulières qui pourraient aider, je l'apprécierais également.

Pour le moment, je pense utiliser la fonction split () pour séparer la chaîne par des espaces, puis nettoyer la ponctuation avec une expression régulière. Je voudrais aussi que ce soit insensible à la casse.

Était-ce utile?

La solution

Couper, coller + exécuter la démo:

var text = "Text to be examined to determine which n words are used the most";

// Find 'em!
var wordRegExp = /\w+(?:'\w{1,2})?/g;
var words = {};
var matches;
while ((matches = wordRegExp.exec(text)) != null)
{
    var word = matches[0].toLowerCase();
    if (typeof words[word] == "undefined")
    {
        words[word] = 1;
    }
    else
    {
        words[word]++;
    }
}

// Sort 'em!
var wordList = [];
for (var word in words)
{
    if (words.hasOwnProperty(word))
    {
        wordList.push([word, words[word]]);
    }
}
wordList.sort(function(a, b) { return b[1] - a[1]; });

// Come back any time, straaanger!
var n = 10;
var message = ["The top " + n + " words are:"];
for (var i = 0; i < n; i++)
{
    message.push(wordList[i][0] + " - " + wordList[i][1] + " occurance" +
                 (wordList[i][1] == 1 ? "" : "s"));
}
alert(message.join("\n"));

Fonction réutilisable:

function getTopNWords(text, n)
{
    var wordRegExp = /\w+(?:'\w{1,2})?/g;
    var words = {};
    var matches;
    while ((matches = wordRegExp.exec(text)) != null)
    {
        var word = matches[0].toLowerCase();
        if (typeof words[word] == "undefined")
        {
            words[word] = 1;
        }
        else
        {
            words[word]++;
        }
    }

    var wordList = [];
    for (var word in words)
    {
        if (words.hasOwnProperty(word))
        {
            wordList.push([word, words[word]]);
        }
    }
    wordList.sort(function(a, b) { return b[1] - a[1]; });

    var topWords = [];
    for (var i = 0; i < n; i++)
    {
        topWords.push(wordList[i][0]);
    }
    return topWords;
}

Autres conseils

Une fois que vous avez nettoyé ce tableau de mots, et que vous l'appeliez wordArray :

var keywordRegistry = {};

for(var i = 0; i < wordArray.length; i++) {
   if(keywordRegistry.hasOwnProperty(wordArray[i]) == false) {
      keywordRegistry[wordArray[i]] = 0;
   }
   keywordRegistry[wordArray[i]] = keywordRegistry[wordArray[i]] + 1;
}

// now keywordRegistry will have, as properties, all of the 
// words in your word array with their respective counts 

// this will alert (choose something better than alert) all words and their counts
for(var keyword in keywordRegistry) {
  alert("The keyword '" + keyword + "' occurred " + keywordRegistry[keyword] + " times");
}

Cela devrait vous donner les bases pour faire cette partie du travail.

Essayez de scinder la chaîne en mots et de compter les mots obtenus, puis de trier les mots.

Ceci s'appuie sur une réponse précédente en insin en ne disposant que d'une boucle:

function top_words(text, n) {
    // Split text on non word characters
    var words = text.toLowerCase().split(/\W+/)
    var positions = new Array()
    var word_counts = new Array()
    for (var i=0; i<words.length; i++) {
        var word = words[i]
        if (!word) {
            continue
        }

        if (typeof positions[word] == 'undefined') {
            positions[word] = word_counts.length
            word_counts.push([word, 1])
        } else {
            word_counts[positions[word]][1]++
        }
    }
    // Put most frequent words at the beginning.
    word_counts.sort(function (a, b) {return b[1] - a[1]})
    // Return the first n items
    return word_counts.slice(0, n)
}

// Let's see if it works.
var text = "Words in here are repeated. Are repeated, repeated!"
alert(top_words(text, 3))

Le résultat de l'exemple est le suivant: [['répété', 3], ['are', 2], ['mots', 1]]

Je ferais exactement ce que vous avez mentionné ci-dessus pour isoler chaque mot. J'ajouterais alors probablement chaque mot en tant qu'index d'un tableau avec le nombre d'occurrences en tant que valeur.

Par exemple:

var a = new Array;
a[word] = a[word]?a[word]+1:1;

Vous savez maintenant combien de mots uniques il y a (une longueur) et combien d'occurrences de chaque mot existaient (un [mot]).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top