个人项目

个人项目


附录

这个作业属于哪个课程 软工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);
 }
posted @ 2025-03-08 01:20  R1-pp  阅读(42)  评论(0)    收藏  举报