个人项目

这个作业属于哪个课程 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() {
// 测试正常情况下分词
List strings1 = WordsUtil.splitWords("今天是周天,天气晴朗,我晚上要去看电影。");
// 测试空串情况下分词
List strings2 = WordsUtil.splitWords("");
// 测试字符串中插入不同符号情况下分词
List strings3 = WordsUtil.splitWords("@*()-+今天是**周天,天气晴朗");
// 测试字符串中存在空格情况下分词
List strings4 = 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);
}

空串情况下

4.代码覆盖率截图

测试项目

posted on 2024-09-13 23:42  木萨江·米吉提  阅读(9)  评论(0编辑  收藏  举报