个人项目
个人项目
附录
| 这个作业属于哪个课程 | 软工1班 |
|---|---|
| 这个作业要求在哪里 | 个人项目:作业要求 |
| 这个作业的目标 | 尝试进行个人项目,学会单元测试,了解性能分析 |
仓库网址:qazwsx2323ppp/3123004220
环境说明
语言:C++
IDE工具:Visual Studio 222
PSP图
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 30 | 50 |
| Estimate | 估计这个任务需要多少时间 | 1650 | 1500 |
| Development | 开发 | 200 | 350 |
| Analysis | 需求分析 (包括学习新技术) | 300 | 500 |
| Design Spec | 生成设计文档 | 30 | 30 |
| Design Review | 设计复审 | 40 | 30 |
| Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 35 |
| Design | 具体设计 | 60 | 40 |
| Coding | 具体编码 | 180 | 180 |
| Code Review | 代码复审 | 60 | 60 |
| Test | 测试(自我测试,修改代码,提交修改) | 300 | 900 |
| Reporting | 报告 | 90 | 120 |
| Test Repor | 测试报告 | 40 | 50 |
| Size Measurement | 计算工作量 | 40 | 60 |
| Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 50 | 60 |
| 合计 | 1450 | 2000 |
模块接口与算法实现
算法:simhash和汉明威距离
- 分词:对输入文本进行分词,提取出关键词及其权重(如词频或 TF-IDF 值)。
- 哈希计算:对每个关键词计算其哈希值(通常使用 64 位的哈希函数,如 MurmurHash)
- 加权:将每个关键词的哈希值乘以其权重
- 累加:将所有关键词的加权哈希值按位相加,得到一个向量。
- 生成 SimHash:对累加后的向量进行二值化:如果某一位的值大于 0,则置为
'1';否则置为'0'。- 输出:最终生成一个 64 位的二进制字符串作为 SimHash 值
- 汉明距离:计算两个 SimHash 值之间不同位的数量。
- 相似度计算:基于汉明距离计算相似度。相似度公式:
similarity = 1 - (hamming_distance / hash_length)。
主要函数模块
- compute_simhash(const std::string& text):计算simhash值
- calculate_hamming_distance:计算两个 SimHash 值的汉明距离
- calculate_similarity:// 计算相似度
模块之间的关系
+-------------------+
| 调用 read_file 函数 | 读取文件内容并返回字符串
+-------------------+
|
v
+-------------------+
| 调用 compute_simhash 函数 | 计算输入文本的 SimHash 值
+-------------------+
|
v
+-------------------+
| 调用 calculate_hamming_distance 函数 | 计算两个 SimHash 值的汉明距离
+-------------------+
|
v
+-------------------+
| 调用 calculate_similarity 函数 | 根据汉明距离计算相似度
+-------------------+
|
v
+-------------------+
| 结束 |
+-------------------
算法的关键
- 算法调用思路简洁明了
- 在C++语言的基础上使用了simhash库,在较短的代码上就完成需求
算法性能改进
- 性能分析图:
算法的不足
- 判断方式较单一
- 得到的结果数值有30%左右的浮动
- 较多调用外部库函数
计划算法改进
- 怎加余弦值比较法,以不同过的权重共同完成分析
模块单元测试
部分代码
#include "CppUnitTest.h" #include "simhash.h" #include "pch.h" using namespace Microsoft::VisualStudio::CppUnitTestFramework; namespace SimHashUnitTest { TEST_CLASS(SimHashUtilsTest) { public: // 测试 compute_simhash 函数 TEST_METHOD(TestComputeSimHash_EmptyString) { std::string result = compute_simhash(""); Assert::AreEqual(std::string(64, '0'), result); } TEST_METHOD(TestComputeSimHash_SingleChar) { std::string result = compute_simhash("a"); Assert::AreEqual(64ull, result.length()); } TEST_METHOD(TestComputeSimHash_SameString) { std::string text1 = "hello"; std::string text2 = "hello"; Assert::AreEqual(compute_simhash(text1), compute_simhash(text2)); } TEST_METHOD(TestComputeSimHash_DifferentString) { std::string text1 = "hello"; std::string text2 = "world"; Assert::AreNotEqual(compute_simhash(text1), compute_simhash(text2)); }
异常模块处理
- 命令行启动异常--处理:重新输入路劲,并推出程序
// 检查命令行参数 if (argc != 4) { std::cerr << "Usage: " << argv[0] << " <original_file> <plagiarized_file> <output_file>" << std::endl; return -1; }
- 文件路径错误--处理:显示路劲错误,要求重新运行
if (!file.is_open()) { throw std::runtime_error("Error: Unable to open file: " + file_path); }



浙公网安备 33010602011771号