문제

JavaScript에서 키워드를 계산하는 가장 좋고 효율적인 방법은 무엇입니까? 기본적으로 문자열을 가져 와서 주로 제안 태그를 사용하기 위해 문자열에서 발생하는 맨 위 N 단어 나 문구를 얻고 싶습니다. 나는 실제 코드보다 개념적 힌트 나 실제 예제에 대한 링크를 더 찾고 있지만 코드를 공유하고 싶다면 확실히 신경 쓰지 않을 것입니다. 도움이 될 특별한 기능이 있다면 감사합니다.

지금은 스플릿 () 함수를 사용하여 문자열을 공간별로 분리 한 다음 정규 표현식으로 구두점을 청소하고 있다고 생각합니다. 나는 또한 그것이 사례에 민감하지 않기를 원합니다.

도움이 되었습니까?

해결책

자르기, 붙여 넣기 + 실행 데모 :

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

그것은 당신에게 작업 의이 부분을 수행하는 기본 사항을 제공해야합니다.

문자열을 단어로 나누고 결과 단어를 세고 카운트를 정렬하십시오.

이것은 이전 답변을 바탕으로합니다 인신 하나의 루프만으로 :

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.length)와 각 단어의 발생이 몇 개 존재하는지 알 수 있습니다 ([단어]).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top