2

JavaScript でキーワードを数える最良かつ最も効率的な方法は何ですか? 基本的には、主に提案タグを使用するために、文字列を取得して、文字列で発生する上位 N 個の単語またはフレーズを取得したいと考えています。実際のコードよりも、概念的なヒントや実際の例へのリンクを探していますが、コードも共有したい場合は気にしません。役立つ特定の機能があれば、それもありがたいです。

現在、split() 関数を使用して文字列をスペースで区切り、正規表現で句読点を削除していると思います。また、大文字と小文字を区別しないようにしたいと思います。

4

5 に答える 5

4

切り取り、貼り付け、デモの実行:

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

再利用可能な機能:

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;
}
于 2008-09-26T19:15:35.227 に答える
4

その単語の配列をクリーンアップしたら、それを呼び出すとしましょう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");
}

これにより、作業のこの部分を行うための基本が得られるはずです。

于 2008-09-26T19:05:59.397 に答える
1

これは、ループを 1 つだけ持つinsinによる以前の回答に基づいています。

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

この例の結果は次のとおりです。[['repeated',3], ['are',2], ['words', 1]]

于 2008-09-26T20:55:24.783 に答える
1

文字列を単語で分割し、結果の単語を数えてから、カウントで並べ替えてみてください。

于 2008-09-26T19:04:00.963 に答える
-1

各単語を分離するために、あなたが上で述べたことを正確に行います。次に、各単語を配列のインデックスとして追加し、出現回数を値として追加します。

例えば:

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

これで、固有の単語の数 (a.length) と、各単語の出現回数 (a[word]) がわかりました。

于 2008-09-26T19:21:55.273 に答える