本周作业是结对编写一个词频统计的程序,我们组是我(欧阳思琪)和贺晋飞同学共同完成这项任务。在仔细阅读了要求之后,我们组对程序编程进行了讨论。由于语言可以不必局限于要求中的C、C++,我们便考虑JAVA或python,两者各有优缺点,JAVA写起来比较繁重,而基于以往用python处理NLP相关项目的经验觉得python较为简单,但觉得在简单要求下,使用JAVA的运行速度明显更快,所以我们选择使用JAVA来完成本次作业。
分工:欧阳思琪 代码编写与博客编写
贺晋飞 代码审查与代码测试
实际:由我编写完代码并进行简单测试后,发布到github上,然后贺晋飞同学对代码进行审查和测试,发现我漏读了两个条件,一是单词至少长度为4,且前四个必须为英文字母,二是输出到文件时的格式我忽略了,贺晋飞同学对代码进行了修改,但由于贺晋飞同学的git下载失败了。。。,所以他直接把代码发给我了,并没有使用git fork的功能。。。,同时我再次对代码审校的过程中发现贺晋飞同学对要求忽略了排序按照ASCII码,把我已有的正确代码改错了。。。,于是我又进行了修正。。。贺晋飞同学生成了10个测试数据并在自己修正的代码上进行了测试,但由于代码在相互审校中的发现了错误,所以我对数据在最终版本的代码中进行了测试。由于正值国庆假期,所以完成的时间跨度比较长,我于10月1日完成了代码并发布到github上开源了,但是code review是到10月7日才做的,然后10月9日我写完了博客。。。
估计:项目构思:1小时 实际:项目构思:1小时
代码编写:2小时 代码编写:2小时
代码审查:1小时 代码审查0.5小时
代码测试:1小时 代码测试:1小时
代码调试:1小时 代码调试:0.5小时
博客编写:1小时 博客编写:1.5小时
总计 预估: 7小时 实际: 6.5小时
代码思想:
建立一个Dictionary类来对文本处理并统计单词频度,Test类对Dictionary类生成实例进行调用。
Dictionary类对输入的文件夹名进行递归寻找文件进行读入,在一个实例中对所有的文件用hashmap进行存储单词的频度和应该存储的字符串,word存储的是单词的小写形式和按ASCII码排列后应该输出的单词形式,count存储的是单词的小写形式和单词的频率。每次读入一个文件进行处理,然后每次处理一行文本,用正则表达式匹配,将所有的非数字和英文字母的符号转化成空格,然后读取间隔的字符串进行判断是否符合要求。若是长度不小于四并且前四个字符都是英文字母,则是单词,将小写形式在count中对频度加一,然后与word中已经出现过的形式进行ASCII码比较,若较小则更新word中的value,(若未出现过该单词,则count中value为1,word中的value为该单词本身)在拓展模式下,我们判断是单词后再除去末尾连续的数字,然后存入词典中。
代码开源在:https://github.com/Victorianuonuo/projects-for-Software-Engineering/tree/master/WordCount
转载请注明:http://www.cnblogs.com/victorianuonuo/p/5941616.html
最后我用jprofiler对代码执行情况进行了分析,在处理超长文本(一个多G)时的情况: