第一次个人编程作业

这个作业属于哪个课程 21计科34班
这个作业要求在哪里 完成个人编程
这个作业的目标 评估个人开发能力、论文查重、单元测试

github作业仓库

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. 首先是去除文本的标点符号;
  2. 其次是对文本内容进行分词;
  3. 然后是统计分词的频率;
  4. 最后将一个文本的所有分词的频率组成一个向量,计算两个文本向量的余弦值
    向量值越接近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。
新增代码:

最后编译正常。

测试也有没有问题。

posted @ 2023-09-17 15:44  jackchen1349  阅读(44)  评论(0)    收藏  举报