2016-06-19 80 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/。另外,大致表現爲「比A更快的性能問題?」很容易通過測量自己來回答。 – Tomalak

+1

@Tomalak *代碼審查 – Ave

回答

1

你可以使用一個哈希表參考陣列項,該計數對象更快的訪問。現在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' }]));