个人项目-论文查重
这个作业属于属于哪个课程 | 网工1934-软件工程 |
---|---|
作业要求在哪里 | 作业要求 |
作业目标 | 通过独立完成个人项目熟悉软件开发流程,提高编程能力 |
作业github链接
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 30 |
· Estimate | · 估计这个任务需要多少时间 | 1000 | 1145 |
Development | 开发 | 400 | 610 |
· Analysis | · 需求分析 (包括学习新技术) | 30 | 30 |
· Design Spec | · 生成设计文档 | 60 | 20 |
· Design Review | · 设计复审 | 60 | 30 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 15 |
· Design | · 具体设计 | 30 | 30 |
· Coding | · 具体编码 | 280 | 340 |
· Code Review | · 代码复审 | 20 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 30 | 30 |
Reporting | 报告 | 20 | 20 |
· Test Report | · 测试报告 | 30 | 30 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 20 |
Total | · 合计 | 1030 | 1175 |
整体流程 | |||
1、将文件地址输入到readTxtile类中进读取文件以及去除文本的标点符号,返回String变量data | |||
2、data进入Analyzer中,进行分词,返回list | |||
3、list进入Count中,进行getStringFrequency获取词频向量以及getDoubleStrForCosValue进行余弦相似度的公式计算 | |||
4、三个类由Main调用输出重复率 | |||
计算模块接口的设计与实现过程 | |||
1、计算公式: | |||
关键:余弦相似度 (Cosine Similarity) 通过计算两个向量的夹角余弦值来评估他们的相似度。将向量根据坐标值,绘制到向量空间中,求得他们的夹角,并得出夹角对应的余弦值,此余弦值就可以用来表征这两个向量的相似性。夹角越小,余弦值越接近于1,它们的方向越吻合,则越相似。 | |||
2、具体实现: | |||
Count进行分次后的字符串的词频计算,用了两次循环分别对两个字符串进行词频计算,每遇到相同的的词语计数变量就自加,遍历完字符串后将当前变量的值放到数组相应位置。 | |||
getDoubleStrForCosValue利用Count中得到的字符串词频向量带入余弦相似度公式计算得出结果。 | |||
`public class Count { |
/**
* 获取两组字符串的词频向量
* @param str1List
* @param str2List
* @return
*/
public static int [][] getStringFrequency(List<String> str1List,List<String> str2List){
Set<String> cnSet = new HashSet<String>();
cnSet.addAll(str1List);
cnSet.addAll(str2List);
int [][] res = new int[2][cnSet.size()];
Iterator it = cnSet.iterator();
int i=0;
while(it.hasNext()){
String word = it.next().toString();
int s1 = 0;
int s2 = 0;
for(String str : str1List){
if(word.equals(str)){
s1++;
}
}
res[0][i] = s1;
for(String str : str2List){
if(word.equals(str)){
s2++;
}
}
res[1][i] = s2;
i++;
}
return res;
}
/**
* 获取两组向量的余弦值
* @param ints
* @return
*/
public static float getDoubleStrForCosValue(int [][] ints){
BigDecimal fzSum = new BigDecimal(0);
BigDecimal fmSum = new BigDecimal(0);
BigDecimal seq1SumBigDecimal = new BigDecimal(0);
BigDecimal seq2SumBigDecimal = new BigDecimal(0);
int num = ints[0].length;
for(int i=0;i<num;i++){
BigDecimal adb = new BigDecimal(ints[0][i]).multiply(new BigDecimal(ints[1][i]));
fzSum = fzSum.add(adb);
seq1SumBigDecimal = seq1SumBigDecimal.add(new BigDecimal(Math.pow(ints[0][i],2)));
seq2SumBigDecimal = seq2SumBigDecimal.add(new BigDecimal(Math.pow(ints[1][i],2)));
}
//开方
double sqrt1 = Math.sqrt(seq1SumBigDecimal.doubleValue());
double sqrt2 = Math.sqrt(seq2SumBigDecimal.doubleValue());
//使用BigDecimal保证精确计算浮点数
fmSum = new BigDecimal(sqrt1).multiply(new BigDecimal(sqrt2));
return fzSum.divide(fmSum,10,RoundingMode.HALF_UP).floatValue();
}`
计算模块接口部分的性能改进
1、去除多余的标点符号
2、利用匹配正则表达式有利于提高运行效率以及精确度。
计算模块部分单元测试展示
测试覆盖率
单元测试代码
总结
1、在网上查了很多资料,学习到了很多新的知识,代码实现了余弦相似度的计算
2、需求分析做的不够好,在分析这一块做的非常差,在看到项目需求之前根本不知道从何下手,查了很多资料之后才明白
3、在psp中也体现出来预想的与实际确实差距很大,需要积累更多的项目经验