Каков наилучший способ подсчета ключевых слов в JavaScript?

StackOverflow https://stackoverflow.com/questions/141280

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

Например:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top