詞頻統計做業

要求:javascript

  寫一個程序,分析一個文本文件中各個詞出現的頻率,而且把頻率最高的10個詞打印出來。文本文件大約是30KB~300KB大小。php

解決步驟:

  一、運用ajax讀取一個 txt 文本文件;
  二、運用正則表達式來獲取文本中的每個字符串;
  二、統計文件裏面每一個詞出現的次數;
  三、進行排序,打印出頻率最高的10個詞。
 
編程語言:javascript
測試文本:test.txt         大小:9.7KB
性能測試工具:chrom瀏覽器

初步思路:

  一、將文件內容存放在php的服務器裏面,運用ajax請求test.txt文件,獲取初步的字符串;
  二、利用 js的split() 函數經過空格來分割字符串,再運用正則表達式來去除掉","、"."、"「"、":" ......,獲得一個純字符串的數組;
  三、遍歷數組,經過for in循環,key=詞,value=出現次數,在用一個數組保存出現的次數,另外一個數組保存出現的詞的數組;
  四、對次數的數組進行快速排序,運用的是javascript的sort()函數,進行排序,得到頻率最高的10個詞。
  五、將2個數組進行合併,並輸出最後的結果。

程序實現:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>詞頻統計</title>
<meta name="description" content="">
<meta name="keywords" content="">
<link href="" rel="stylesheet">
<script type="text/javascript">
window.onload = function()
{
var xmlhttp;
  if(window.XMLHttpRequest){
    xmlhttp=new XMLHttpRequest();
  }else{
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
    xmlhttp.onreadystatechange=function(){
    if (xmlhttp.readyState==4 && xmlhttp.status==200){
        var content = xmlhttp.responseText;
        var str = new Array();
      var strs =null;
      var result = new Array();
      var result1 = new Array();
      var res = new Array();
      var res3 = new Array();
      var res1 = new Array();
      var res2 = new Array();
      str=content.split(" ");
      var reg=/,|\.|\?|!|:|;|\r\"\"/g;
      for(var i =0;i<str.length;i++){
        strs=str[i].replace(reg,'').toLowerCase();
        result.push(strs);
      }
      result1 = result;
      for(var e in result){
        for(var i=0;i<result.length;i++){
          res[result[e]]=1;
        }
      }

      for(var i=0;i<result.length;i++){
          for(var j=0;j<result1.length;j++){
              if(result[i]==result1[j]){
                  res[result[i]]++;
              }
          }
      }
      var j=0;
      for(var c in res){
          res1[j] = res[c];
          res2[j] = c;
          j++;
        }
      res1.sort(function(a,b){return b-a;})
        for(var i=0;i<10;i++){
          for(var j=0;j<res2.length;j++){
            if(res1[i]==res[res2[j]]){
                res3.push("Top"+(i+1)+"   :  "+res2[j]+ "-->"+res1[i]);
            }
          }
          //console.log(ed[i]);
      }

      var oDiv = document.getElementById('main');
      var oUl = oDiv.getElementsByTagName('ul')[0];
      for(var i=0;i<res3.length;i++){
        var oLi = document.createElement('li');
        oLi.innerHTML = res3[i];
         oUl.appendChild(oLi);
      }
    }
  }
xmlhttp.open("GET","./test.txt",true);
xmlhttp.send();
}
</script>
<style>
li{
  list-style:none;
}
</style>
</head>
<body>
    <div id="main">
      <ul>
      </ul>
    </div>
</body>
</html>

運行結果:

性能測試:

 

 

                                                                                             

實驗心得:                                                                                                                                                                              html

  經過此次做業,感受仍是學到了不少的東西。由於以前一直在學習jsvascript 就嘗試着用這個弱類型語言來編寫,就是可能這個語言沒有像c++、java這樣的語言那麼強大,因此在作的過程當中存在不少的問題,特別是在數組的轉換和比較方面,最開始的時候想的就是運用一個關聯數組的形式,用鍵來保存詞,用值來保存單詞出現的頻率,可是作到最後發現比較的時候和循環的時候存在很大的弊端,因此後面就無可奈何把這個關聯數組拆分爲2個不一樣的數組,再對頻率的那個數組用javascript自帶的快排函數sort()進行排序,後面再把2個數組進行排序,並進行輸出。java

相關文章
相關標籤/搜索