Как лучше всего рассчитывать ключевые слова в JavaScript? - PullRequest
2 голосов
/ 26 сентября 2008

Какой самый лучший и самый эффективный способ подсчета ключевых слов в JavaScript? По сути, я хотел бы взять строку и получить первые N слов или фраз, которые встречаются в строке, в основном для использования меток. Я больше ищу концептуальные подсказки или ссылки на реальные примеры, чем на реальный код, но я, конечно, не против, если вы захотите поделиться кодом. Если бы были определенные функции, которые могли бы помочь, я также был бы признателен за это.

Сейчас я думаю, что использую функцию split () для разделения строки пробелами, а затем очищаю пунктуацию регулярным выражением. Я также хотел бы, чтобы это было без учета регистра.

Ответы [ 5 ]

4 голосов
/ 26 сентября 2008

Как только вы очистите этот массив слов, и скажем, вы называете его 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");
}

Это должно дать вам основы выполнения этой части работы.

4 голосов
/ 26 сентября 2008

Вырезать, вставить + выполнить демо:

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;
}
1 голос
/ 27 сентября 2008

Это основано на предыдущем ответе 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]]

1 голос
/ 26 сентября 2008

Попробуйте разбить строку на слова и сосчитать полученные слова, а затем отсортировать по количеству.

0 голосов
/ 26 сентября 2008

Я бы сделал именно то, что вы упомянули выше, чтобы выделить каждое слово. Затем я бы, вероятно, добавил каждое слово в качестве индекса массива с числом вхождений в качестве значения.

Например:

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

Теперь вы знаете, сколько существует уникальных слов (a.length) и сколько вхождений каждого слова существовало (a [word]).

...