您的位置:首页 > 移动开发 > 微信开发

统计文章中出现的单词频率java小程序

2014-10-20 21:07 519 查看

更改:1.原博文过滤效果未展示,新增加过滤展示(要过滤的单词在文件particle.txt中,可以很方便的在其中按过滤条件添加或删除单词,要统计的文档在文件ENGl.txt中,统计了第一部《哈利波特》)

            2.利用jvisualvm.exe 改进了性能分析结果

一.简介:本程序采用java语言编程,实现了统计一篇英文文章中出现频率最高的并且有意义(去掉虚词,语气助词等不影响文意的单词)十个单词的功能。并用分别《哈利波特》一书的不同章数测试,得出该书作者最爱用的10个单词。

二.设计思路:为了实现统计一篇英文文章中出现频率最高的十个单词的功能,我将程序功能分解为三部分,第一部分是将文章读入内存并将每个单词分开,第二部分是将每个单词出现的次数统计出来,第三部分是将出现次数最多的十个单词选出。bu

三.具体实现:1.读入文件并利用java方法将其转化为字符串类型

                  2.利用正则表达式判断将字符串转换为字符串数组,每一个单词就是数组中的一个元素

                  3.建立Obeject类型的二维数组(因为Object类型为所有类的超类方便后续数组存储相应信息)。数组为N行2列,第一列用于存储不同的单词,第二列用于存储相应单词的个数。对单词数组进行遍历,当前单词与已存储单词比较,如果相同则相应单词数加1,如果与以存储单词都不同则在以存储单词数组后加行用于记录此单词。一次遍历后可得到不同单词的个数。

                 4.对单词信息数组遍历,如果当前单词为虚词,语气助词等无意义的词语,则将其次数置为0,以达到统计出的单词有意义的目的。

                 5.采用类似于选择排序算法从存储单词信息的数组中选择出现次数最多的10个单词依次输出(每一次选择出现次数最多的一个单词,输出后将其次数置为0,执行10次即可)。

四.简略分析:算法的时间复杂度为O(n²),问题规模为n,由于全程采用数组存储空间复杂度为O(1)。

五.程序代码:

package main;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
public class txt2{
public static void main(String[] args) throws Exception
{
File file = new File("D:\\Android\\软件工程作业\\src\\ENGl.txt");//导入txt文档
FileReader reader = new FileReader(file);
int fileLen = (int)file.length();
char[] chars = new char[fileLen];
reader.read(chars);
String txt = String.valueOf(chars);
String[] a=txt.split("[^a-zA-Z]+"); //利用正则表达式将字符串划分为单词字符串数组
int n=a.length;//获取文章中单词个数
int nind=0,wind=0; //nind表示文章中的不同单词个数,初始值为0,wind代表文章中总的单词数
Object[][] b=new Object
[2];
for(;wind<n;wind++){
int k=0; //用k标记单词是否已经出现,单词已经出现,在已存数组中匹配,若匹配则相应单词数目加1
for(int i=0;i<nind;i++){
if(((String) b[i][0]).equalsIgnoreCase(a[wind])){
b[i][1]=(int)b[i][1]+1;
k=1;
break;
}
}
//单词未出现则在记录数组末尾记录此单词
if(k==0){
b[nind][0]=a[wind];
b[nind][1]=1;
nind++;
}
}
BufferedReader br1=new BufferedReader(new FileReader("D:\\Android\\软件工程作业\\src\\particle.txt"));//字符输入流 从文件读
String str=br1.readLine();
String[] arg=str.split("[^a-zA-Z]+"); //利用正则表达式将字符串划分为单词字符串数组
int m=arg.length;
//判断文章中词语是否为虚词,如果为虚词则在比较频率时不计较在内
for(int i=0;i<nind;i++){
for(int j=0;j<m;j++ ){
if(((String) b[i][0]).equalsIgnoreCase(arg[j])){
b[i][1]=0;
}
}
}
for(int i=0;i<10;i++){
int max=0;
for(int j=0;j<nind;j++){
if((int)b[j][1]>(int)b[max][1]){
max=j;
}
}
System.out.println(b[max][0]+"出现次数为:"+b[max][1]);
b[max][1]=0;
}
}
}

六.结果截图



七.程序分析

1).线程分析



2).cpu及内存消耗情况



3).统计结果分析

     从统计的结果看,整部小说采用第三人称视角,时态为过去时,男主角为哈利,Dudley 出现次数较多,说明故事的发生地为英国。去掉这些词后统计发现故事风格为魔幻类(因为magic一词出现频率较高)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 软件工程 编程
相关文章推荐