Используя Javascript, чтобы найти наиболее распространенные слова в строке? - PullRequest
12 голосов
/ 04 июля 2011

У меня большой блок текста, и я хотел бы узнать, какие слова используются чаще всего (за исключением нескольких, таких как "the", "a", "and" и т. Д.).

Как мне искать этот блок текста по его наиболее часто используемым словам?

Ответы [ 2 ]

24 голосов
/ 04 июля 2011

Вы должны разбить строку на слова, затем перебрать слова и увеличить счетчик для каждого из них:

var wordCounts = { };
var words = str.split(/\b/);

for(var i = 0; i < words.length; i++)
    wordCounts["_" + words[i]] = (wordCounts["_" + words[i]] || 0) + 1;

"_" + позволяет ему обрабатывать такие слова, как constructor, которые уже являются свойствами объекта.

Вы можете написать words[i].toLowerCase() для учета без учета регистра.

0 голосов
/ 26 марта 2016

Исходя из будущего, где этот вопрос задавался снова, но я слишком рано начал с решения, и оно было помечено как ответ. Во всяком случае, это дополнение к ответу SLaks.

function nthMostCommon(string, ammount) {
    var wordsArray = string.split(/\s/);
    var wordOccurrences = {}
    for (var i = 0; i < wordsArray.length; i++) {
        wordOccurrences['_'+wordsArray[i]] = ( wordOccurrences['_'+wordsArray[i]] || 0 ) + 1;
    }
    var result = Object.keys(wordOccurrences).reduce(function(acc, currentKey) {
        /* you may want to include a binary search here */
        for (var i = 0; i < ammount; i++) {
            if (!acc[i]) {
                acc[i] = { word: currentKey.slice(1, currentKey.length), occurences: wordOccurrences[currentKey] };
                break;
            } else if (acc[i].occurences < wordOccurrences[currentKey]) {
                acc.splice(i, 0, { word: currentKey.slice(1, currentKey.length), occurences: wordOccurrences[currentKey] });
                if (acc.length > ammount)
                    acc.pop();
                break;
            }
        }
        return acc;
    }, []);
    return result;
}
...