这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13228 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13228 |
这个作业的目标 | <实现论文查重,学会使用PSP表格,使用Github管理项目> |
作业要求:
1.在Github仓库中新建一个学号为名的文件夹
2.再开始程序之前在PSP上记录一下各个步骤消耗时间花费时间
3.使用C++ 、Java语言或者python3实现,实现程序后发布到Github仓库的realease中
4.提交的代码要求经过Code Quality Analysis工具的分析并消除所有的警告
5.完成项目的首个版本之后,请使用性能分析工具Studio Profiling Tools来找出代码中的性能瓶颈并进行改进
6.使用Github来管理源代码和测试用例,代码有进展即签入Github
7.6.使用Github来管理源代码和测试用例,代码有进展即签入Github
1.Github地址:
https://github.com/MUSAJIANG11/3122004960
2.PSP表格
阶段名称 | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|
Planning(计划) | 405 | 340 |
Estimate(估计时间) | 100 | 120 |
Development(开发) | 30 | 30 |
Analysis(需求分析) | 10 | 100 |
Design Spec(生成设计文档) | 10 | 10 |
Design Review(设计复审) | 40 | 40 |
Coding Standard(代码规范) | 80 | 40 |
Design(具体设计) | 60 | 20 |
Coding(具体编码) | 20 | 15 |
Code Review(代码复审) | 30 | 30 |
Test(测试) | 10 | 10 |
Test Report(测试报告) | 15 | 15 |
Total(合计) | 405 | 340 |
接口设计与实现
1
2.关于函数的实现与分析
相关资料及推论参考了:https://www.ruanyifeng.com/blog/2013/03/cosine_similarity.html
假设有两个句子A,B
假设有两个句子A,B
句子A:我喜欢打篮球,不喜欢打羽毛球。
句子B:我不喜欢打篮球,也不喜欢打羽毛球。
第一步,分词。
句子A:我/喜欢/打/篮球,不/喜欢/打/羽毛球。
句子B:我/不/喜欢/打/篮球,也/不/喜欢/打/羽毛球。
实现:通过IKAnalyzer中文分词器实现,即通过查询内置的词典进行分词
第二步,列出所有的词。
我,喜欢,打,篮球,羽毛球,不,也。
第三步,计算词频。
句子A:我 1,喜欢 2,打 2,篮球 1,足球 1,不 1,也 0。
句子B:我 1,喜欢 2,打 2,篮球 1,足球 1,不 2,也 1。
第四步,写出词频向量。
句子A:[1, 2, 2, 1, 1, 1, 0]
句子B:[1, 2, 2, 1, 1, 2, 1]
实现:词与词频是键值对的形式,因此可以用哈希表来存储
到这里,问题就变成了如何计算这两个向量的相似程度。
我们可以把它们想象成空间中的两条线段,都是从原点([0, 0, ...])出发,指向不同的方向。两条线段之间形成一个夹角,如果夹角为0度,意味着方向相同、线段重合;如果夹角为90度,意味着形成直角,方向完全不相似;如果夹角为180度,意味着方向正好相反。因此,我们可以通过夹角的大小,来判断向量的相似程度。夹角越小,就代表越相似。
则计算A, B向量间的夹角的余弦值
假定a向量是[x1, y1],b向量是[x2, y2],那么可以将余弦定理改写成下面的形式:
模块接口部分的性能改进
模块部分单元测试展示
1.测试工具
使用JUnit4进行单元测试,创建一个TestCoverage类,在其中测试各模块方法。
2.WordsUtil工具类方法测试
@Test
public void testWordUtil() {
// 测试正常情况下分词
Liststrings1 = WordsUtil.splitWords("今天是周天,天气晴朗,我晚上要去看电影。");
// 测试空串情况下分词
Liststrings2 = WordsUtil.splitWords("");
// 测试字符串中插入不同符号情况下分词
Liststrings3 = WordsUtil.splitWords("@*()-+今天是**周天,天气晴朗");
// 测试字符串中存在空格情况下分词
Liststrings4 = WordsUtil.splitWords(" 今天是周天,天气晴 朗,我晚上要去看电影。 ");
System.out.println("strings1:");
for (String string : strings1) {
System.out.print(string + "/");
}
System.out.println();
System.out.println("strings2:");
for (String string : strings2) {
System.out.print(string + "/");
}
System.out.println();
System.out.println("strings3:");
for (String string : strings3) {
System.out.print(string + "/");
}
System.out.println();
System.out.println("strings4:");
for (String string : strings4) {
System.out.print(string + "/");
}
System.out.println();
}
测试结果
QueryRepeat工具类测试
@Test
public void testQueryRepeat() {
// 完全倒序情况
double repeatRadius1 = QueryRepeat.getRepeatRadius("今天是星期天,天气晴,今天晚上我要去看电影。",
"影电看去要我上晚天今,晴气天,天期星是天今。");
// 空字符串情况
double repeatRadius2 = QueryRepeat.getRepeatRadius("", "");
// 完全相同情况
double repeatRadius3 = QueryRepeat.getRepeatRadius("今天是星期天,天气晴,今天晚上我要去看电影。",
"今天是星期天,天气晴,今天晚上我要去看电影。");
// 部分抄袭情况
double repeatRadius4 = QueryRepeat.getRepeatRadius("今天是星期天,天气晴,今天晚上我要去看电影。",
"今天是周天,天气晴朗,我晚上要去看电影。");
// 插入符号情况
double repeatRadius5 = QueryRepeat.getRepeatRadius("今天是星期天,天气晴,今天晚上我要去看电影。",
"今天是&星期(天,天气+-晴,今天晚&&上我要去看电影。");
// 包含空格情况
double repeatRadius6 = QueryRepeat.getRepeatRadius("今天是星期天,天气晴,今天晚上我要去看电影。",
"今天是 星期 天,天气 晴,今天晚 上我要去看电影。");
System.out.println("repeatRadius1:" + repeatRadius1);
System.out.println("repeatRadius2:" + repeatRadius2);
System.out.println("repeatRadius3:" + repeatRadius3);
System.out.println("repeatRadius4:" + repeatRadius4);
System.out.println("repeatRadius5:" + repeatRadius5);
System.out.println("repeatRadius6:" + repeatRadius6);
}