201671030116宋菲菲 《英文文本统计分析》结对项目报告


## 信息表:
项目 内容
作业所属课程 http://www.cnblogs.com/nwnu-daizh/
作业要求 https://www.cnblogs.com/nwnu-daizh/p/10569690.html/
课程学习目标 熟悉软件开发整体流程,提升自身能力
帮助实现目标 第一次体验一个完整的工程

任务1

博客地址
github地址

  • 点评内容:通过阅读你的博文,我认为你的博文的结构不是很清晰,没有充分利用Markdown编辑的特点,我建议可以将每个模块用加粗字体或副标题加以区分。博客内容很简练。通过浏览你的PSP,发现你的计划时间与实际运行时间几乎相同,我认为你的计划做得很到位,但是看了实际的代码运行结果,我发现你的很多功能都没有实现,希望下次可以继续努力,完善项目。
  • 点评心得:阅读完这位同学的博文,我认为她对时间的把控能力很好,PSP表可以看出是一个很会计划时间的人,这一点值得我去学习。但是她的部分任务没有完善,希望这次的结对项目对她有所帮助,也希望通过这次的结对项目,相互学习,共同进步。

任务2

源码地址

1.需求分析

  • (1)实验2要求的功能;
  • (2)单词频数可视化柱状图:
  • (3)统计该文本行数及字符数;
  • (4)各种统计功能均提供计时功能,显示程序统计所消耗时间(单位:ms);
  • (5)可处理任意用户导入的任意英文文本;
  • (6)人机交互界面要求GUI界面(WEB页面、APP页面都可);
  • (7)附加分功能:统计文本中除冠词、代词、介词之外的高频词;
  • (8)附加分功能:统计前10个两个单词组成的词组频率。

2.软件设计

项目主要包含三个类,一个是主函数Main,一个是统计单词的类SortResult,还有一个是绘制柱状图paint。

  • 主函数Main中实现图形用户界面,实现各个功能。输入框3个,分别是原文本文件的文件名(采用相对路径),想要查找的一个或多个单词及绘制柱状图,想要查找的N个高频词及其词频数。两个按钮,分别是“确定”和“取消”。由于两个查找在同一个面板,防止出现冲突,若两个输入框均有输入,则实现第一个输入框的功能。点击确定后,直接将字典顺序输出到result.txt文本中,并且实现相应功能。
  • SortResult中将文本中的每个单词按照字典顺序将单词及词频数输出到result.txt文本文件中。
  • paint中对柱状图美化。


3.核心功能代码展示

除去冠词、代词、介词两种方法

直接删除

    int i,j;
    for(j=0;j<List.size();j++) 
    {  
        for(i=0;i<Eword.size();i++)
        {
        	if(Eword.get(i).equals(List.get(j).getKey()))
        	{
        		List.remove(j);
        		break;            		
        	}
        }
   } 

新建一个Map存放删选后的单词映射:

Map<String, Integer> map1=new LinkedHashMap<String, Integer>();
    for(Entry<String,Integer> m: map) 
    {  
    	for(i=0;i<Eword.size();i++)
    	{
    		if(Eword.get(i).equals(m.getKey()))
    		{
    			break;
    		}
    	}
    	if(i>=Eword.size())
    	{
    		map1.put(m.getKey(), m.getValue());  
    	}
    }  
    Set<Entry<String,Integer>> Map1=map1.entrySet();  
    LinkedList<Entry<String, Integer>> List = new LinkedList<Entry<String,Integer>>(Map1);

    	//排序
    Collections.sort(List, new Comparator<Entry<String,Integer>>() {  
        @Override  
        public int compare(Entry<String, Integer> wk1,  Entry<String, Integer> wk2) {
            return wk1.getKey().compareTo(wk2.getKey());  
        }  
    }); 

原本的代码实现在paint中画图显示,但是为了传参,new main()后显示出柱状图后会跳出Main函数的主框架

public paint(){
    JFreeChart chart = ChartFactory.createBarChart3D(
   		            "词频统计", 
                        "单词", 
                        "数量",
                        new Main().dataset, 
                        PlotOrientation.VERTICAL,
                        true,         
                        false,
                        false      
                        );
   
    CategoryPlot plot=chart.getCategoryPlot();//获取图表区域对象
    CategoryAxis domainAxis=plot.getDomainAxis();         //水平底部列表
     domainAxis.setLabelFont(new Font("黑体",Font.BOLD,14));         //水平底部标题
     domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,12));  //垂直标题
     ValueAxis rangeAxis=plot.getRangeAxis();//获取柱状
     rangeAxis.setLabelFont(new Font("黑体",Font.BOLD,15));
      chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 15));
      chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));//设置标题字体
         
     frame1=new ChartPanel(chart,true);
     
}

为了解决问题,将建立图表信息的代码写入在main中,统计用户输入单词词频及绘制柱状图

			    for(i=0; i<input.length; i++) 
			    {
			       	for(Entry<String, Integer> entry : wordsStatistics.entrySet()) 
			       	{ 
			       		if(input[i].equals(entry.getKey()))
			        	{
			        		map.put(entry.getKey(), entry.getValue());

		        			print2+=entry.getKey()+":\n";
			        		for(int j=0;j<entry.getValue()/100;j++)
			        			print2+="*";
		        			print2+="\n";
			        		print += entry.getKey() + ":" + entry.getValue()+"    "; 
			        		dataset.addValue(entry.getValue(),entry.getKey(),entry.getValue());
			        		break;
			        	}
			         } 
			     }
			    long end = System.currentTimeMillis();
			   	JOptionPane.showConfirmDialog(null, print+print2+"\n运行时长"+(end-start)+"ms","结果",JOptionPane.DEFAULT_OPTION);
			   	
			   	JFreeChart chart = ChartFactory.createBarChart3D(
   		                "词频统计", // 图表标题
                        "单词", // 文件夹轴的显示标签
                        "数量", // 数值轴的显示标签
                        dataset,//.dataset, // 数据集
                        PlotOrientation.VERTICAL, // 图表方向:水平、垂直
                        true,           // 是否显示图例(对于简单的柱状图必须是false)
                        false,          // 是否生成工具
                        false           // 是否生成URL链接
                        );
    
			   	paint p = new paint(chart);
        		JFrame frame=new JFrame("Java数据统计图");
        		frame.setLayout(new GridLayout(2,2,10,10));
        		frame.add(p.getChartPanel());           //加入柱形图
        		frame.setBounds(50, 50, 800, 600);
        		frame.setVisible(true);
			}

统计行数、列数

while((read = br.readLine()) != null)
	{  
		linenumber++;//行数
		charnumber+=read.length();//字符数
         		for (String w:read.split("[^a-zA-Z]")) 
		{
		       if(w.length()!= 0)
		       {
		           list.add(w);  
		       }  
		  }  
	}

4.程序运行

程序运行前添加自定义jar包Libraries:



统计用户输入单词的词频,显示系统运行时间:



生成相应的柱状图:



若不退出程序继续查看其它单词词频,则柱状图将相应的单词柱状图添加到原有的图中:



要除去的冠词、代词、介词:



统计用户输入的n个文本中除冠词、代词、介词之外的高频词并显示运行时间:



统计该文本行数、字符数及每个单词和相应的词频,并将其写入到文件中,生成result.txt文件:



5.结对过程:

6.PSP

PSP2.1 任务内容 计划完成时间(min) 实际完成时间(min)
Planning 计划 20 20
.Estimate .估计这个任务需要多少时间,并规划大致工作步骤 20 20
Development 开发 700 9600
.Analysis .需求分析(包括学习新技术) 30 30
.Design Spec .生成设计文档 35 30
.Design Review .设计复审 10 10
.Coding Standard .代码规范 5 5
.Design .具体设计 60 60
.Coding .具体编码 480 720
.Code Review .代码复审 60 80
.test .测试 20 25
Reporting 报告 120 120
.Test Report .测试报告 100 100
.Size Measurement .计算工作量 20 20
.Postmortem & Process Improvement Plan .事后总结,病提出过程改进计划 28 20

7.小结感受

这次的合作让我切身感受到结对项目的过程,让我体会到了交流沟通对结对合作的重要性,有时候两个人的想法会发生分歧,很好的沟通会使我们的效率变得更高。
分工明确会使项目进展较快,不会在同一个问题上浪费时间。遇到问题时,会相互沟通交流,解决问题。

posted @ 2019-04-02 21:21  宋菲~  阅读(227)  评论(1编辑  收藏  举报