ShawnChiu

个人项目(第二次作业)

| 这个作业属于哪个课程 | 计科国际班 |
| ---- | ---- | ---- |
| 作业要求 | 第二次作业要求 |
| 作业目标 | 编写一个论文查重程序(包含单元测试) |

PSP表格

PSP2.1 Personal Software Process Stages 预估耗时 实际耗时
Planning 计划 30
-Estimate -估计这个任务需要多少时间 50
Development 开发 240
-Analysis -需求分析 120
-Design Spec -生成设计文档 40
-Design Review -设计复审 30
-Coding Standard -代码规范 30
-Design -具体设计 70
-Coding -具体编码 230
-Code Review -代码复审 30
-Test -测试 60
Reporting 报告 30
-Test Report -测试报告 20
-Size Measurement -计算工作量 10
-Postmortem &Process Improvement Plan -事后总结,并提出过程改进计划 20
合计 1010

补充一下第一次尝试的过程 我先是在CSDN上查阅了一些判定相似度的算法资料

defi compare(file1,file2):

lines1= readLines(file1) lines2 readlines(file2)

count =0.

for line in lines1:

if lines2.count line)>0

count +=1

return count / max(len(lines1),len(lines2))

这样的结果是查重率高得离谱,果断放弃。

然后网上资料显示,Python有自带的查重函数difflib

import difflib
def string similar(s1,s2):
return difflib.sequenceMatcher(None,s1,s2).quick_ratio() for i in range(len(data4_message)):
s1 data4 message[i] s2= data4 answer[i]
print(string_similar(s1,s2))

这样的结果同样是查重率不符合逻辑,也不使用这种方法

3.查阅资料后发现还有一种以前没有接触过的方法:计算余弦相似度和TF-IDF算法
走投无路之下,只能硬着头皮尝试一下

计算模块接口的设计与实现过程。

设计的思路流程图

所用接口(函数)
1.分词模块
jieba.cut
从博客园的其他用户发表的随笔中,我得知jieba接口的功能十分强大,jieba分词有三种模式:全模式、精确模式、搜索引擎模式。> https://www.cnblogs.com/aloiswei/p/11567616.html
在这里我认为只需要用到精确模式就足够了。
jieba 代码例子:

运行结果:

2.求权重模块
核心思想就是将该句子的长度除以整篇文章的长度
这个是比较简单粗暴的方法,但我查阅资料发现,这十分有效。

for word in file_data:

      if '\u4e00'<=word<='\u9fff':
       
             file_len +=1

for sentence in file_sentence:

   for word in sentence:
   
       if '\u4e00' <= word <= '\u9fff':
           
                 quanzhong += 1

3.计算文本相似度模块
该模块的核心是基于TF-IDF算法来进行的
其主要思想是:如果某个单词在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
由于以前没有接触过该算法,以下资料大部分都是在CSDN上查阅的
源自> https://blog.csdn.net/asialee_bird/article/details/81486700
TF是词频(Term Frequency)
词频(TF)表示词条(关键字)在文本中出现的频率。
IDF是逆向文件频率(Inverse Document Frequency)
逆向文件频率 (IDF) :某一特定词语的IDF,可以由总文件数目除以包含该词语的文件的数目,再将得到的商取对数得到。
如果包含词条t的文档越少, IDF越大,则说明词条具有很好的类别区分能力。
TF-IDF实际上是:TF * IDF
某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。

4.在命令行进行文档读入读出
通过调用sys库来读取文档
例子:
import sys
file = open(sys.argv[1],'r', encoding='UTF-8')
data = orig_file.read()
file.close()
但此程序代码在pycharm中运行时是会报错的
需要在命令行界面才能运行
读出文档也同理
file = open('whatever.txt','w', encoding='UTF-8')
file.write(something)
file.close()

性能分析
使用Pycharm Professional版本自带的profile功能进行性能分析




单元测试
使用unnitest和beautifulreport模块进行测试

代码覆盖率

显示main.py百分百覆盖

计算模块的部分异常处理情况
输入空文本和不存在的文本的情况
将使用try-except语句来提示用户输入错误

posted on 2021-09-20 23:24  ShawnChiu  阅读(57)  评论(0编辑  收藏  举报

导航