软件作业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插件分析每个函数的运行到退出的时间。
image

2.代码覆盖率

image

附录

  • 源代码
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
posted @ 2023-09-16 21:57  我有、事  阅读(57)  评论(0)    收藏  举报