2016-06-19 4 views
1

Я пытаюсь построить алгоритм для просмотра, какие слова в комментариях больше всего встречаются.Алгоритм подсчета вхождений слов в строку

Поэтому я пришел с этим (в Javascript):

var analyze = function(comments){ 
    var detectedWords = []; 
    var result = {}; 
    comments.forEach(function(comment){ 
     var words = comment.message.split(" "); 
     words.forEach(function(word){ 
      word = word.toLowerCase(); 
      if(word !== ""){ 
       if(detectedWords.indexOf(word) === -1){ 
        detectedWords.push(word); 
        result[detectedWords.indexOf(word)] = {"name":word,"count":1}; 
       }else{ 
        result[detectedWords.indexOf(word)].count++; 
       } 
      } 
     }); 
    }); 

    return _.orderBy(result, ['count'], ['desc']); 
} 

Может ли алгоритм быть оптимизировано дальше? (ToLowerCase() вне внутреннего цикла?

В следующем шаге я определил бы «черный список» или слова, которые не интересны, как «это я, утро, это ...»

+0

Вы можете попытаться сохранить только слово «слово» в качестве ключа, а значение «значение» - это значение используя меньше места для каждого результата. –

+0

Основные вопросы обзора не подходят для StackOverflow. Для этого есть http://codereview.stackexchange.com/. Кроме того, вопросы производительности по строкам «быстрее, чем B»? можно легко ответить, измерив себя. – Tomalak

+1

@Tomalak * отзыв о кодексе – Ave

ответ

1

You может использовать хэш-таблицу для справки к элементу массива для более быстрого доступа к объекту подсчета. result теперь массив, который теперь сортируется.

var analyze = function (comments) { 
 
    var result = [], 
 
     hash = {}; 
 
    comments.forEach(function (comment) { 
 
     var words = comment.message.split(" "); 
 
     words.forEach(function (word) { 
 
      word = word.toLowerCase(); 
 
      if (word !== "") { 
 
       if (!hash[word]) { 
 
        hash[word] = { name: word, count: 0 }; 
 
        result.push(hash[word]); 
 
       } 
 
       hash[word].count++; 
 
      } 
 
     }); 
 
    }); 
 

 
    return result.sort(function (a, b) { return b.count - a.count;}); 
 
    //return _.orderBy(result, ['count'], ['desc']); 
 
} 
 

 
console.log(analyze([{ message: 'a b c d a v d e f g q' }]));

Смежные вопросы