Pergunta

Qual é a melhor e mais eficiente maneira de contar palavras-chave em JavaScript? Basicamente, eu gostaria de ter uma corda e obter as palavras superiores N ou frases que ocorrem na seqüência, principalmente para o uso de sugerir tags. Eu estou olhando mais para sugestões conceituais ou links para exemplos da vida real do que o código real, mas eu certamente não me importaria se você gostaria de compartilhar código também. Se existem funções específicas que poderiam ajudar, eu também aprecio isso.

Agora eu acho que estou em usar a função split () para separar a string por espaços e, em seguida, limpar a pontuação com uma expressão regular. Eu também quero que seja case-insensitive.

Foi útil?

Solução

Cortar, colar + executar demonstração:

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

função reutilizável:

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

Outras dicas

Depois de ter esse conjunto de palavras limpas, e digamos que você chamá-lo 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");
}

Isso deve lhe dar o básico de fazer esta parte do trabalho.

Tente dividir você seqüência de palavras e contar as palavras resultantes, em seguida, classificar as contagens.

Esta baseia-se uma resposta anterior por insin por ter apenas um loop:

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

O resultado do exemplo é: [['repeated',3], ['are',2], ['words', 1]]

Eu faria exatamente o que você mencionou acima para isolar cada palavra. Eu, então, provavelmente, adicionar cada palavra como o índice de um array com o número de ocorrências como o valor.

Por exemplo:

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

Agora você sabe quantas palavras único existem (a.length) e quantas ocorrências de cada palavra existia (a [palavra]).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top