词频统计做业

要求: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

相关文章
相关标签/搜索