关于这门课,关于第一个作业
看着题目,大体上第一篇随笔要写两方面的事儿。
其一:
说说这门课,作为一名旁听生,选择旁听这门课,也许不仅仅是因为这门课的主讲是young,我们是他的学生,所以旁听。其实更重要的原因,是因为真的觉得这门课是有价值的,当然,我不清楚这个学期自己的时间是否充裕,是否会坚持下全程,但还是希望研一的小盆友们能够坚持,能够有所收获。而我及其他组内的童鞋也都认为,这门课young会带给你们别样的收获,不同于本科时代的收获。当然,说起软件工程,说起编程,其实还是自己的事儿。代码写的多了,也许就没那么难了。
其二:
说完了其一,说说第一周留的作业吧,其实完成作业的过程才是成长的过程,作为理工科的学生,我没有文科人的文笔,所以其一关于感慨人生的部分,寥寥草草写了几笔。更多的,我们还是关注下编程,关注下技术本身吧。先说说young推荐大家的版本控制,我第一次接触github大概是在大二那一年,刚接触的时候也走了很多弯路,而走过来发现,其实没有那么难,young平日里就要求我们编程做到版本控制,事实上,他自己也用git。版本控制的好处不想在这里说了,网上夸他的一大堆。github是一个开源的平台,官网地址在这里:https://github.com 关于如何使用,网上有很多帖子,也看到了yyg童鞋的博客,推荐了一个地方,当然,我更推荐大家去官网上看文档,https://help.github.com/ 对于我们使用的工具,young通常是推荐我们找官方的文档和手册的。
再说说本周的编程作业,下午想了想 “词频统计” 的这个问题,对于英文的词频统计,要比汉语的词频统计简单了许多。先完成一个简单的版本(通常老师教导我们就是这样,先实现功能,再考虑优化的事儿), 简单版本即先完成词频统计的基本需求和功能,我实现过程中算法大体如下(懒了,没画流程图):
1.读入要分析的文件,比如:anna.txt(安娜卡列尼娜的英文版)
2.对文件内容进行预处理,包括标点符号的处理,多空格的处理,等等了
3.对处理后的文件内容进行分词,遍历,统计词频。遍历统计词频的过程中,用到了hashmap,对于hashmap的介绍和使用,这里先不介绍了,有空了单独写一个,hashmap还是蛮有用的。
4.对统计后的结果进行格式化输出,我采用了对词频由大到小排序后输出到result.txt中。
对于词频统计的版本1基本就实现了,当然,下一个版本,还可以考虑往上加其他的功能,我现在能想到的:
1.优化的问题,对于现在全部读入内存的做法、hashmap的使用、时间复杂度上面的考虑等等方面,都是值得进一步改进的,如果其他人有好的建议欢迎留言一起讨论。
2.对于结果呈现部分的改良,对于用户来说,我们做出的产品如果在视觉上有更直观的感受,当然要好于给他看输出文件。我现在能想到的,比如,将词频较高的前多少多少个单词通过绘图控件以图形的形式呈现出来,也许效果会更好些。可以参考数据可视化方向的知识弄一弄(当然,这个方向我没研究,感兴趣的可以交流)
最后,附上词频统计版本1,我的程序:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
public class WordStatistics {
public void getWordRate(String sourceFileName) {
try {
BufferedReader br = new BufferedReader(new FileReader(new File(
System.getProperty("user.dir") + "//" + sourceFileName)));
String all_file = null;
String tmp = null;
while ((tmp = br.readLine()) != null) {
all_file += tmp;
}
br.close();
all_file = all_file.toLowerCase();
all_file = all_file.replaceAll("[^A-Za-z]", " ");
all_file = all_file.replaceAll("\\s+", " ");
String single_word[];
single_word = all_file.split("\\s+");
Map<String, Integer> hm = new HashMap<String, Integer>();
for (int i = 0; i < single_word.length; i++) {
String key = single_word[i];
if (hm.get(key) != null) {
int value = ((Integer) hm.get(key)).intValue();
value++;
hm.put(key, new Integer(value));
} else {
hm.put(key, new Integer(1));
}
}
ArrayList<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(
hm.entrySet());
Collections.sort(list,new Comparator<Object>() {
public int compare(Object e1,Object e2) {
int v1 = Integer.parseInt(((Entry<String, Integer>) e1)
.getValue().toString());
int v2 = Integer.parseInt(((Entry<String, Integer>) e2)
.getValue().toString());
return v2-v1;
}
});
BufferedWriter bw = new BufferedWriter(new FileWriter(new File(
System.getProperty("user.dir")+"//result.txt")));
for (Entry<String,Integer> e:list) {
bw.append((e.getKey()+" : "+e.getValue()+"\n"));
}
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
WordStatistics ws = new WordStatistics();
ws.getWordRate("anna.txt");
}
}