Frage

Was ist der beste und effizienteste Weg, Schlüsselwörter in JavaScript zu zählen? Grundsätzlich würde Ich mag einen String nehmen und die Top-N Worte oder Ausdrücke zu erhalten, die in der Folge auftreten, vor allem für die Verwendung von Tags darauf hindeutet. Ich suche mehr für die konzeptionellen Hinweise oder Links zu realen Beispielen als eigentlicher Code, aber ich würde sicher nichts dagegen, wenn Sie Code möchten, als auch teilen. Wenn es bestimmte Funktionen, die helfen würden, würde ich auch erkennen, dass.

Im Moment denke ich, ich bin der split () Funktion bei Verwendung der Zeichenfolge durch Leerzeichen zu trennen und dann Interpunktion aus mit einem regulären Ausdruck zu reinigen. Ich würde wollen, dass es auch Groß- und Kleinschreibung sein.

War es hilfreich?

Lösung

Ausschneiden, Einfügen + ausführen Demo:

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"));

Wiederverwendbare Funktion:

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;
}

Andere Tipps

Sobald Sie das Array von Wörtern gereinigt, und lassen Sie uns sagen, Sie nennen es 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");
}

Das sollten Sie die Grundlagen diesen Teil der Arbeit zu tun.

Versuchen Sie Zeichenfolge auf Wörter und zählen die resultierenden Worte zu spalten, dann sortieren auf den Grafen.

Diese baut auf einer früheren Antwort von insin nur mit einer Schleife:

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))

Das Ergebnis des Beispiels ist: [['repeated',3], ['are',2], ['words', 1]]

Ich würde genau das tun, was Sie oben erwähnt haben, um jedes Wort zu isolieren. Ich würde dann wahrscheinlich mit der Anzahl der Vorkommen als Wert jedes Wort als Index eines Arrays hinzuzufügen.

Zum Beispiel:

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

Jetzt wissen Sie, wie viele eindeutige Worte gibt es (a.length) und wie viele Vorkommen jedes Wort existierte (a [Wort]).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top