软工个人项目
| 这个作业属于哪个课程 | 软件工程 |
|---|---|
| 这个作业要求在哪里 | 个人项目 |
| 这个作业的目标 | 编辑程序对论文进行查重 |
GitHub连接
PSP表格
| PSP2.1 | Personal Software Process Stages | 预计耗时(分钟) | 实现耗时(分钟) |
|---|---|---|---|
| Planning | 估计这个任务需要多少时间 | 5 | 5 |
| Development | 开发 | 240 | 250 |
| Analysis | 需求分析(包括学习新技能) | 60 | 90 |
| Design Spec | 生成设计文档 | 120 | 140 |
| Design Review | 设计复审 | 10 | 10 |
| Coding Standard | 代码规范(为目前的开发制定合适的规范) | 30 | 40 |
| Design | 具体设计 | 30 | 40 |
| Coding | 具体编码 | 60 | 70 |
| Code Review | 代码复审 | 10 | 10 |
| Test | 测试(自我测试,修改代码,提交修改) | 50 | 150 |
| Reporting | 报告 | 90 | 100 |
| Test Report | 测试报告 | 30 | 50 |
| Size Measurement | 计算工作量 | 5 | 5 |
| Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 10 | 10 |
| 合计 | 750 | 970 |
计算模块接口的设计与实现过程
计算模块流程图

计算模块的实现
在了解查重这个概念,并去查找文章后(文章),知道了几个关于文章查重的算法,我在其中选择了余弦相似性算法来作为本次作业的核心算法,其步骤就如上图所示。
其中的代码的实现如下:
# 将文本分词并转化为词汇列表
def tokenize(text):
tokens = jieba.cut(text)
return [token for token in tokens]
# 计算词频向量
def get_vector(tokens):
token_counts = Counter(tokens)
return token_counts
# 计算余弦相似性
def cosine_similarity(vec1, vec2):
dot_product = sum(vec1[token] * vec2[token] for token in vec1 if token in vec2)
norm_vec1 = math.sqrt(sum(vec1[token] ** 2 for token in vec1))
norm_vec2 = math.sqrt(sum(vec2[token] ** 2 for token in vec2))
similarity = dot_product / (norm_vec1 * norm_vec2)
return similarity
并注意到要求中要使用命令行的形式来运行程序所以对于文件位置和内容的读取代码如下:
#读取文件中的文本
def read_file(file_name):
try:
with open(file_name, 'r', encoding='utf-8') as file:
text = file.read()
return text
except FileNotFoundError:
print(f"File not found in: {file_name}")
sys.exit(1)
#从控制台给出的文件路径读取文本
text1 = read_file(sys.argv[1])
text2 = read_file(sys.argv[2])
模块接口部分的性能改进
各模块所花费的时间如图

性能分析图如图:

计算模块部分单元测试展示
设置了十个例子作为单元测试用例
部分展示如下
def test_0(self):
text = Compare("这是一个测试","这是一个测试")
# 分词并获取词频向量
tokens1,tokens2 = text.tokenize()
vector1,vector2 = text.get_vector()
# 计算余弦相似性
similarity_1_2 =text.cosine_similarity()
self.assertAlmostEqual(similarity_1_2, 1, places=7,msg='失败!')
def test_1(self):
text = Compare("这是一个测试_0", "这是一个测试_0")
# 分词并获取词频向量
tokens1, tokens2 = text.tokenize()
vector1, vector2 = text.get_vector()
# 计算余弦相似性
similarity_1_2 = text.cosine_similarity()
self.assertAlmostEqual(similarity_1_2, 1, places=7, msg='失败!')
在测试的时候先创建了一个Compare类,里面包含了main的函数,之后在test.py中引用了Compare类来实现测试类的测试。
测试用例选取的时候只要关注于是否能实现近义词的比较、是否能实现数字字母之间党的比较、是否能实现不同语言顺序的语句的比较。
测试覆盖率如图:

计算模块部分异常处理说明
测试途中发现一种异常情况:那就是测试文本不能为空

因为余弦相似性的计算途中有一个除法的存在,有空值存在会使除法不能正常运行。
在测试途中发现在使用本算法时,如果文本过短的话会使标点符号的比重过高
有句号:

删除了句号:

浙公网安备 33010602011771号