ما هي أفضل طريقة لحساب الكلمات الرئيسية في جافا سكريبت؟
-
02-07-2019 - |
سؤال
ما هي الطريقة الأفضل والأكثر فعالية لحساب الكلمات الرئيسية في 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]).