家蛙树

homework2-2016302580079-许泽松

许泽松-079
Java - 算法基础实验
2017-11-07

1.Maven项目

1.(1)创建:具体的创建过程可以参考

http://www.cnblogs.com/Ricky-Huang/p/5216373.html
http://www.cnblogs.com/wql025/p/5215570.html

创建时容易忽略的步骤

①添加servlet依赖

②servlet的deployment配置

1.(2)maven项目的好处:

Maven的用途之一是服务于构建,它是一个异常强大的构建工具,能够帮我们自动化构建过程,从清理、编译、测试到生成报告,再到打包和部署。我们不需要也不应该一遍又一遍地输入命令,一次又一次地点击鼠标,我们要做的是使用Maven配置好项目,然后输入简单的命令(如mvn clean install),Maven会帮我们处理那些烦琐的任务。利用maven自身及其插件还可以获得代码检查报告、单元测试覆盖率、实现持续集成等等。可以将项目过程规范化、自动化、高效化以及强大的可扩展性。

2.anjs分词

加载分词依赖和过滤停用词

这里用了某大佬在群里上传的stopwords.txt

StopRecognition filter=new StopRecognition();
filter.insertStopWords(stopwords);//过滤停词
filter.insertStopNatures("uj");//过滤词性
filter.insertStopNatures("ul");//
filter.insertStopNatures("null");//过滤空格
filter.insertStopNatures("w");//过滤标点符号
filter.insertStopRegexes(".*?\\w.*?"); //正则表达式,去掉包含数字和字母的
filter.insertStopRegexes("\\s"); //正则表达式,去掉空格

3.TF-IDF算法

3.(1)由于所得到的List words里面有重复的词,直接使用Pair会使程序较繁琐,因此选择了Hashmap先对数据进行处理再转为Pair型

HashMap<String, Double> mapTF = new HashMap<>();
        HashMap<String, Double> mapTFIDF= new HashMap<>();
        //计算TF值
        for(String key : words){
            double value = 1.0/(double)words.size();
            if (mapTF.get(key) != null) {
                value = mapTF.get(key) + 1.0/(double)words.size();
            }
            mapTF.put(key, value);
        }

使用Hashmap可以快速判断每个从List words里取出的词是否重复,若重复便累加Value的值,十分方便。

3.(2)IDF值的计算和语料库的选择

本来想用本次实验的60条数据作为语料库,但是感觉好像样本太小,于是就选用了上一次实验data.txt的10000条数据。(感觉从玄学上求出的IDF值的会比较准)

3.(3)将hashmap转为pair

//将HashMap转为Pair
        Pair <String,Double>[]pair=new Pair[mapTFIDF.size()];
        int i=0;
        for (Map.Entry<String,Double> entry : mapTFIDF.entrySet()) {
            Pair<String,Double> pair1=new Pair<String, Double>(entry.getKey(),entry.getValue());
            pair[i]=pair1;
            i++;
        }

求得mapTF-IDF后就可以转化成pair型,然后进行排序了

3.(4)pair的排序

这里的排序用的是上一次实验写过的快速排序,修改了一些参数实现的。

4.相似矩阵

这里计算TF-IDF值的时候不能直接用上面写的函数 TAT
于是稍微调整了一下参数写了个新的方法getContentfromInput

这一部分难度不是很大,主要就是不停不停不停不停不停不停不停不停的循环

相对词频

关于相对词频,我用的是词出现的次数除以新闻长度,再乘100(怕数字小了后面计算Cosine误差会很大),构成向量的时候不会有影响。

 //相对词频
                frequncy = (100.0 * ((double) total)) / ((double) str1.length());
                Vector[i - 1][j] = frequncy;

协同过滤算法

        for (int k = 0; k < 60; k++) {
            double recommend1 = 0;
            if (userInterest[i].interset[k] == '0') {
                for (int l = 0; l < AlReadyRead.size(); l++) {
                    recommend1 = recommend1 + matrix[AlReadyRead.get(l)][k];
                }
                recommend[i][k] = recommend1;
            }

            //将已阅读过的新闻推荐值设为零
            else recommend[i][k] = 0;
        }
        AlReadyRead.clear();

5.遇到的一些问题

5.(1)空指针错误的问题和数组溢出的问题

在创建对象数组以后,一定要在给每个对象初始化以后再调用它的函数。。。
在这个问题上栽了好多次了,一栽Debug就要很久

5.(2)输出矩阵的问题

输出的路径,用不了相对路径,最后只好用了绝对路径

5.(3)没有用UTF-8读入的时候出了乱码。。

6.总结

这次实验的难度真的是比上次难太多了,代码量也增加了很多,也花了很多时间,希望下次可以简单点,不然双十一真的要买霸王育发液来用了。总之还是学到了很多东西,所谓算法实验,当然是学到了很多算法,这些算法都有很广泛的应用,也学会了maven项目的使用;

虽然这次实验肝的很辛苦很累,但是当我看到下面这张图的时候,真是,太太太太太开心了

点赞 1
0条评论
其他心得
Panda  · 382天前 
第二次实验心得 这次实验主要学习了5方面的知识,分别是maven、ansj中文分词、TF-IDF算法提取关键词、余弦相似度、协同过滤算法。 一、收获及疑惑 Maven 其实一开始进行这次实验的时候,并没有认真去了解maven,只是下载了maven,配置了环境变量并创建了maven项目。实验完成了才真的去学习maven,也发现因为一开始使用maven的时候没有了解就使用,走了些弯路。这也让我认识到,在使用工具时不要只是寻求一个不报错,可以编译,程序可以运行的结果,而是应该真正地去了解工具并
王博士 · 374天前 
java代码调试(2) emmm,介于第一次的debug写出来很多人还是不太明白什么时候debug或者怎么debug,所以这次就写个实战型的让你们看看到底怎么去找到一个错。(说实话制造错误比找错误还难,心塞)不过不包括配置错误等基础问题,这次主要是说一下关于java web出现了不是预料的情况的问题怎么解决 传送门: DEBUG技巧总结(1) 模拟场景一 写好了代码,点击调试,出现了404的错误,这是怎么回事? 这种错误属于路径问题,那么我们就需要去明确一下jav
李岚-261 · 365天前 
一、maven项目 1、搭建: 使用idea 搭建maven项目,在下一层选择webapp 创建之后应任务要求需要配置tomcat,可以在项目中设置 为了使用Maven,你首先必须创建一个项目对象模型(POM)。助教的实例项目中已经建好了。POM的默认值是project.xml文件,它描述了程序及其相关性。Maven用POM来构建项目和相关文件。一旦你有了一个基本的project.xml文件,你可以把它用作你所有
陈宇峰-180 · 380天前 
跟你讲个笑话——maven 在IntelliJ IDEA 环境下使用maven 点开IntelliJ IDEA 在项目中找到Maven项目,并设定GroupId和ArtificialId(这两个暂时没有很大的要求,随便设也暂时OK)IDE应该都自带了Maven,所以这都是OK的,但是使用Maven最好还是在有网的条件下使用,因为Maven在使用过程中会自动下载大量的插件和依赖 然后可以看到底下的pom.xml这是整个项目的一个文件,所谓POM即是(Project Object Mo
谭天任-247 · 388天前 
国软Java实验课第二次实验心得总结 总结 这次实验总体比实验一要难,无论是代码上的实现难度还是任务书的阅读难度。接触了很多新东西,比如Maven,ansj…以及无数的新坑 一、项目配置 IDEA中的Maven配置 类似Gradle,Maven同样是一个强大的项目配置工具。Gradle在使用上是基于Groovy的语言,代码简洁,但是自由度低;相反地,Maven是基于XML语言,虽然看上去比Gradle复杂,但是自由度很高。 安装Maven IDEA内置Maven,但是由于.