作业要求
| 工程概论 | 班级链接 |
|---|---|
| 作业要求 | 作业的要求链接 |
| 作业的目标 | 了解查重代码,熟悉github |
Github地址:
https://github.com/yaokesidayao/yaoke/blob/main/README.md
作业要求:
作业属于哪个课程 工程概论(首页 - 计算21级 - 集美大学 - 班级博客 - 博客园 (cnblogs.com))
作业要求 个人项目 - 作业 - 计算21级 - 班级博客 - 博客园 (cnblogs.com)
作业目标 熟悉项目设计流程,学习有关的查重算法并实现
项目需求
题目:论文查重
描述如下:
设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。
*原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
*抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求输入输出采用文件输入输出,规范如下:
- 从命令行参数给出:论文原文的文件的绝对路径。
- 从命令行参数给出:抄袭版论文的文件的绝对路径。
- 从命令行参数给出:输出的答案文件的绝对路径。
我们提供一份样例,课堂上下发,上传到班级群,使用方法是:orig.txt是原文,其他orig_add.txt等均为抄袭版论文。
注意:答案文件中输出的答案为浮点型,精确到小数点后两位
算法实现基本流程
采用余弦相似度对比查重信息
首先处理文本,过滤掉标点
统计某一个分词词频,构建向量
根据向量计算余弦相似度
余弦定理查找相似度流程方法:
(1)找出两个文本的关键词,或直接统计不同的分词词频
(2)每个文本的各取出若干个关键词,合并成一个集合,计算每个文本对于这个集合中的词的词频
(3)生成两个文本各自的词频向量
(4)计算两个向量的余弦相似度,值越大就表示越相似
PSP表格
| *PSP2.1* | *Personal Software Process Stages* | *预估耗时(分钟)* | *实际耗时(分钟)* |
|---|---|---|---|
| Planning | 计划 | 30 | 10 |
| · Estimate | · 估计这个任务需要多少时间 | 120 | 100 |
| Development | 开发 | 100 | 100 |
| · Analysis | · 需求分析 (包括学习新技术) | 15 | 10 |
| · Design Spec | · 生成设计文档 | - | - |
| · Design Review | · 设计复审 | - | - |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | - | - |
| · Design | · 具体设计 | 30 | 20 |
| · Coding | · 具体编码 | 100 | 90 |
| · Code Review | · 代码复审 | 20 | 20 |
| · Test | · 测试(自我测试,修改代码,提交修改) | 30 | 20 |
| Reporting | 报告 | 20 | 20 |
| · Test Repor | · 测试报告 | 20 | 20 |
| · Size Measurement | · 计算工作量 | 10 | 10 |
| · Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 20 |
| · 合计 | 515 | 440 |
余弦定理函数:
double calculateCosineSimilarity(const std::unordered_map<std::string, int>& originalWordFrequency, const std::unordered_map<std::string, int>& copiedWordFrequency) {
double dotProduct = 0.0;
double originalMagnitude = 0.0;
double copiedMagnitude = 0.0;
// 计算内积和向量模的乘积
for (const auto& entry : originalWordFrequency) {
const std::string& word = entry.first;
int originalFrequency = entry.second;
int copiedFrequency = copiedWordFrequency.at(word);
dotProduct += originalFrequency * copiedFrequency;
originalMagnitude += originalFrequency * originalFrequency;
copiedMagnitude += copiedFrequency * copiedFrequency;
}
// 计算余弦相似度
return dotProduct / (sqrt(originalMagnitude) * sqrt(copiedMagnitude));