ما هي أفضل طريقة لحساب الكلمات الرئيسية في جافا سكريبت؟

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

يجب أن يوفر لك ذلك أساسيات القيام بهذا الجزء من العمل.

حاول تقسيم سلسلة الكلمات الخاصة بك وعد الكلمات الناتجة، ثم قم بالفرز حسب الأعداد.

هذا يعتمد على إجابة سابقة بواسطة في الخطيئة من خلال وجود حلقة واحدة فقط:

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) وعدد تكرارات كل كلمة الموجودة (a[word]).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top