第一次个人编程作业
| 这个作业属于哪个课程 | 21计科34班 |
|---|---|
| 这个作业要求在哪里 | 完成个人编程 |
| 这个作业的目标 | 评估个人开发能力、论文查重、单元测试 |
1、PSP表格
| 任务清单 | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|
| 计划 | 30 | 20 |
| 估计任务时间 | 20 | 10 |
| 开发 | 60 | 180 |
| 需求分析 | 180 | 120 |
| 生成设计文档 | 60 | 80 |
| 设计复审 | 30 | 30 |
| 代码规范 | 30 | 30 |
| 具体设计 | 30 | 40 |
| 具体编码 | 180 | 180 |
| 代码复审 | 30 | 30 |
| 测试 | 40 | 60 |
| 报告 | 40 | 60 |
| 测试报告 | 30 | 60 |
| 计算工作量 | 10 | 10 |
| 事后总结,改进计划 | 30 | 30 |
| 合计 | 800 | 940 |
运行环境
64-bit Windows 10
VS 2022开发
设计与实现
代码设计

共使用到了四个函数,其中汉语分词的实现通过调用结巴分词的库函数来实现。
算法设计
本文使用的是余弦相似度算法对不同文本进行查重。
算法的实现共有四个步骤:
- 首先是去除文本的标点符号;
- 其次是对文本内容进行分词;
- 然后是统计分词的频率;
- 最后将一个文本的所有分词的频率组成一个向量,计算两个文本向量的余弦值
向量值越接近1,说明文本相似度越高。
算法优化
上述算法采用的是一维向量计算相似度,对于内容较大的文本,误差也会随之变大,所以为了适应不同文本之间的比较,可以采用多维向量进行评估。
即比较文本每一行的相似度,然后将数据进行标准化,最后求出平均值即可。
性能改进

单元测试
将文本进行分词处理

最后输出相似度为:0.99565

保留两位小数,存放在txt文件中。

单元测试结果

单元测试主要是测试中文标点的处理和分词后的相似度计算。
这是中文标点测试的代码
words.push_back(",");
words.push_back("。");
words.push_back("?");
for (std::string& word : words)
{
Assert::AreEqual(Ispunct(word), false);
}
words.clear();
words.push_back(".");
words.push_back(",");
for (std::string& word : words)
{
Assert::AreEqual(Ispunct(word), true);
}
这是检测相似度的代码
std::string p1= "今天是星期天,天气晴,今天晚上我要去看电影";
std::string p2= "今天是周天,天气晴朗,我晚上要去看电影。";
cppjieba::Jieba jieba("../../cppjieba/dict/jieba.dict.utf8",
"../../cppjieba/dict/hmm_model.utf8",
"../../cppjieba/dict/user.dict.utf8",
"../../cppjieba/dict/idf.utf8",
"../../cppjieba/dict/stop_words.utf8");
jieba.Cut(p1, words, true);
for (auto& word : words)
{
if (Ispunct(word))
{
std::cout << word << "/";
paper1.push_back(word);
}
}
std::cout << '\n';
words.clear();
jieba.Cut(p2, words, true);
for (auto& word : words)
{
if (Ispunct(word))
{
std::cout << word << "/";
paper2.push_back(word);
}
}
double result = cosineSimilarity(paper1, paper2);
Assert::AreEqual((result > 0.9), true);
异常处理

在测试去除中文标点时,发生异常。

调试后发现在Ispunct添加中文标点时,字符串的大小和数据与测试添加的数据对不上,导致比对失败。

最后发现是编码的问题,将Ispunct编码修改为936测试就通过了。

但是,修改编码后又出现了新的问题,出现了许多字符警告。

解决方法是,将数据的编码从utf8转变为gdk。
新增代码:

最后编译正常。

测试也有没有问题。
浙公网安备 33010602011771号