软件作业2:个人项目-论文查重
| 这个作业属于哪个课程 | 软件工程 |
|---|---|
| 这个作业要求在哪里 | 作业要求 |
| 这个作业的目标 | 了解PSP表格、单元测试并锻炼编程能力 |
| Github库 | 库链接 |
PSP
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 20 | 35 |
| · Estimate | · 估计这个任务需要多少时间 | 25 | 30 |
| Development | 开发 | 600 | 630 |
| · Analysis | · 需求分析 (包括学习新技术) | 80 | 130 |
| · Design Spec | · 生成设计文档 | 20 | 20 |
| · Design Review | · 设计复审 | 15 | 25 |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 15 | 15 |
| · Design | · 具体设计 | 70 | 85 |
| · Coding | · 具体编码 | 200 | 180 |
| · Code Review | · 代码复审 | 20 | 20 |
| · Test | · 测试(自我测试,修改代码,提交修改) | 120 | 150 |
| Reporting | 报告 | 140 | 150 |
| · Test Report | · 测试报告 | 60 | 80 |
| · Size Measurement | · 计算工作量 | 30 | 30 |
| · Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 20 |
函数接口
get(path)
从指定路径path获取文本信息。
# 从指定路径获取文本信息
def get(path):
file = open(path, 'r', encoding='utf-8')
message = file.read()
file.close()
return message
cut(text)
对文本进行分割。这里采用结巴分割的算法,将文本进行分割,同时也采用了re包里的compile方法,使用正则表达式,去除标点符号。
# 对文本进行分割
def cut(text):
comp = re.compile('[^A-Z^a-z0-9\u4e00-\u9fa5]')
words = jieba.lcut(comp.sub('', text), cut_all=False)
word = [w for w in words if len(w.strip()) > 0]
return word
count(text1, text2)
对各词语出现次数进行统计。
# 对各词语出现次数进行统计
def count(text1, text2):
#合并两个句子的单词
key_word = list(set(text1 + text2))
v1 = []
for i in range(len(key_word)):
v1.append(0)
for j in range(len(text1)):
if key_word[i] == text1[j]:
v1[i] += 1
continue
v2 = []
for k in range(len(key_word)):
v2.append(0)
for m in range(len(text2)):
if key_word[k] == text2[m]:
v2[k] += 1
continue
return v1, v2
cosin(vec1, vec2)
根据两个向量的余弦值计算出两个文本的相似度。
# 计算余弦相似度
def cosin(vec1, vec2):
add = 0
squ1 = 0
squ2 = 0
for i in range(len(vec1)):
add += vec1[i] * vec2[i]
squ1 += vec1[i] ** 2
squ2 += vec2[i] ** 2
try:
cos = (add / ((math.sqrt(squ1)) * (math.sqrt(squ2))))
return cos
except ZeroDivisionError:
print('文本空白。')
return 0
性能分析
1.耗费时间
利用python自带的cProfile插件分析每个函数的运行到退出的时间。

2.代码覆盖率

附录
- 源代码
import math
import re
import jieba
import sys
# 从指定路径获取文本信息
def get(path):
file = open(path, 'r', encoding='utf-8')
message = file.read()
file.close()
return message
# 对文本进行分割
def cut(text):
comp = re.compile('[^A-Z^a-z0-9\u4e00-\u9fa5]')
words = jieba.lcut(comp.sub('', text), cut_all=False)
word = [w for w in words if len(w.strip()) > 0]
return word
# 对各词语出现次数进行统计
def count(text1, text2):
#合并两个句子的单词
key_word = list(set(text1 + text2))
v1 = []
for i in range(len(key_word)):
v1.append(0)
for j in range(len(text1)):
if key_word[i] == text1[j]:
v1[i] += 1
continue
v2 = []
for k in range(len(key_word)):
v2.append(0)
for m in range(len(text2)):
if key_word[k] == text2[m]:
v2[k] += 1
continue
return v1, v2
# 计算余弦相似度
def cosin(vec1, vec2):
add = 0
squ1 = 0
squ2 = 0
for i in range(len(vec1)):
add += vec1[i] * vec2[i]
squ1 += vec1[i] ** 2
squ2 += vec2[i] ** 2
try:
cos = (add / ((math.sqrt(squ1)) * (math.sqrt(squ2))))
return cos
except ZeroDivisionError:
print('文本空白。')
return 0
def main_test(path1, path2, save_path):
try:
file1 = get(path1)
file2 = get(path2)
cut1 = cut(file1)
cut2 = cut(file2)
count1, count2 = count(cut1, cut2)
result = cosin(count1, count2)
print(str(path1) + "与" + str(path2) + "的相似度:%.2f%%\n" % (result * 100))
f = open(save_path, 'a', encoding="utf-8")
f.write(str(path1) + "与" + str(path2) + "的相似度:%.2f%%\n" % (result * 100))
f.close()
# 捕捉文件路径错误
except FileNotFoundError:
print("抱歉,文件不存在。")
if __name__ == '__main__':
filepath1 = ''
filepath2 = ''
result_save_path = ''
try:
# 与命令行参数交互
filepath1 = sys.argv[1]
filepath2 = sys.argv[2]
result_save_path = sys.argv[3]
except IndexError:
filepath1 = input("输入原版文件路径:")
filepath2 = input("输入抄袭版文件路径:")
result_save_path = input("请输入要保存相似度结果的文件的路径:")
main_test(filepath1, filepath2, result_save_path)
- 运行结果
![image]()


浙公网安备 33010602011771号