第一次个人编程作业
第一次个人编程作业
这个作业属于哪个课程 | 计科22级12班 |
---|---|
这个作业要求在哪里 | 作业要求 |
这个作业的目标 | 设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率 |
github | 3119006813 |
一、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 10 | 15 |
Estimate | 估计这个任务需要多少时间 | 30 | 40 |
Development | 开发 | 360 | 420 |
Analysis | 需求分析 (包括学习新技术) | 100 | 120 |
Design Spec | 生成设计文档 | 60 | 60 |
Design Review | 设计复审 | 60 | 60 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 60 | 60 |
Design | 具体设计 | 40 | 60 |
Coding | 具体编码 | 60 | 90 |
Code Review | 代码复审 | 60 | 40 |
Test | 测试(自我测试,修改代码,提交修改) | 30 | 20 |
Reporting | 报告 | 30 | 30 |
Test Report | 测试报告 | 30 | 30 |
Size Measurement | 计算工作量 | 30 | 20 |
Reporting | 事后总结, 并提出过程改进计划 | 20 | 20 |
合计 | 980 | 1085 |
二、模块设计
模块设计概述
-
Main:
程序的入口,处理命令行参数。
调用 TxtIO 模块读取原文和抄袭文的内容。
使用 SimHash 模块计算两个文本的SimHash值。
使用 Hamming 模块计算SimHash值的海明距离,并将其转换为相似度。
调用 TxtIO 模块输出结果到指定文件。 -
TxtIO:
负责文件的读取与写入。
提供静态方法来读取文本文件的内容,并将内容写入到指定的输出文件。 -
SimHash:
生成给定文本的SimHash值。
SimHash用于将长文本压缩为固定长度的二进制指纹(通常为128位)。 -
Hamming:
计算两个SimHash值的海明距离。
海明距离是用于衡量两个SimHash值相似度的度量工具,表示两个相等长度的二进制字符串中不同字符的个数。
三、设计思路
四、性能测试
可以直接在代码中插入 cProfile 来分析整个脚本。
在 PyCharm 中,直接运行上述脚本(点击右上角的运行按钮或按 Shift + F10)。cProfile 会在控制台中输出性能分析结果。将分析结果保存到文件以便进一步查看和分析。使用第三方工具如 SnakeViz 来可视化性能数据。
五、单元测试
def test_readTxt(self):
# 创建临时文件,写入内容,然后读取
test_file = 'test.txt'
expected_content = 'This is a test.'
Txt_IO.writeTxt(expected_content, test_file)
content = Txt_IO.readTxt(test_file)
self.assertEqual(content, expected_content)
测试文件写入功能
def test_writeTxt(self):
test_file = 'write_test.txt'
content = 'Writing test content.'
Txt_IO.writeTxt(content, test_file)
with open(test_file, 'r', encoding='utf-8') as file:
read_content = file.read()
self.assertEqual(read_content, content)
class TestSimHash(unittest.TestCase):
def test_getSimHash(self):
text1 = "This is a simple test."
text2 = "This is a simple test!"
hash1 = SimHash.getSimHash(text1)
hash2 = SimHash.getSimHash(text2)
self.assertIsInstance(hash1, int)
self.assertIsInstance(hash2, int)
# Hashes should be different for these two similar strings
self.assertNotEqual(hash1, hash2)
测试海明距离
def test_getHammingDistance(self):
hash1 = int('101010', 2)
hash2 = int('111010', 2)
distance = Hamming.getHammingDistance(hash1, hash2)
self.assertEqual(distance, 1)
def test_zero_hamming_distance(self):
# 如果两个哈希值相同,海明距离应为 0
hash1 = int('101010', 2)
hash2 = int('101010', 2)
distance = Hamming.getHammingDistance(hash1, hash2)
self.assertEqual(distance, 0)
进行主程序的集成测试
class TestMainProgram(unittest.TestCase):
def test_main_program(self):
original_content = "This is the original text."
plagiarized_content = "This is the plagiarized text."
original_file = 'original.txt'
plagiarized_file = 'plagiarized.txt'
output_file = 'output.txt'
# 写入测试文件
Txt_IO.writeTxt(original_content, original_file)
Txt_IO.writeTxt(plagiarized_content, plagiarized_file)
# 模拟命令行参数
sys.argv = ['main.py', original_file, plagiarized_file, output_file]
# 运行主程序
Main.main(sys.argv)
# 验证输出结果
with open(output_file, 'r', encoding='utf-8') as file:
similarity = float(file.read().strip())
self.assertTrue(0 <= similarity <= 100)
if __name__ == '__main__':
unittest.main()