词频统计作业
要求:
写一个程序,分析一个文本文件中各个词出现的频率,并且把频率最高的10个词打印出来。文本文件大约是30KB~300KB大小。
解决步骤:
  1、运用ajax读取一个 txt 文本文件;
  2、运用正则表达式来获取文本中的每一个字符串;
  2、统计文件里面每个词出现的次数;
  3、进行排序,打印出频率最高的10个词。
编程语言:javascript
测试文本:test.txt         大小:9.7KB
性能测试工具:chrom浏览器
初步思路:
  1、将文件内容存放在php的服务器里面,运用ajax请求test.txt文件,获取初步的字符串;
  2、利用 js的split() 函数通过空格来分割字符串,再运用正则表达式来去除掉","、"."、"“"、":" ......,得到一个纯字符串的数组;
  3、遍历数组,通过for in循环,key=词,value=出现次数,在用一个数组保存出现的次数,另一个数组保存出现的词的数组;
  4、对次数的数组进行快速排序,运用的是javascript的sort()函数,进行排序,获得频率最高的10个词。
  5、将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>
运行结果:

性能测试:


                                                                                             
实验心得:
通过这次作业,感觉还是学到了很多的东西。因为之前一直在学习jsvascript 就尝试着用这个弱类型语言来编写,就是可能这个语言没有像c++、java这样的语言那么强大,所以在做的过程中存在很多的问题,特别是在数组的转换和比较方面,最开始的时候想的就是运用一个关联数组的形式,用键来保存词,用值来保存单词出现的频率,但是做到最后发现比较的时候和循环的时候存在很大的弊端,所以后面就迫不得已把这个关联数组拆分为2个不同的数组,再对频率的那个数组用javascript自带的快排函数sort()进行排序,后面再把2个数组进行排序,并进行输出。
                    
                
                
            
        
浙公网安备 33010602011771号