第一次编程作业
这个作业属于哪个课程 | 软件工程 |
---|---|
这个作业要求在哪里 | 作业要求 |
这个作业的目标 | 实现论文查重算法+单元测试+Git应用,熟悉软件开发流程 |
作业代码
- github(学号名文件夹中):Github 地址
psp表格
PSP2.1 ( Personal Software Process Stages ) | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|
Planning(计划) | 30 | 40 |
Estimate(估计这个任务需要多少时间) | 30 | 40 |
Development(开发) | 1060 | 1485 |
Analysis(需求分析 (包括学习新技术)) | 300 | 480 |
Design Spec(生成设计文档) | 30 | 25 |
Design Review(设计复审) | 60 | 30 |
Coding Standard(代码规范 (为目前的开发制定合适的规范)) | 30 | 30 |
Design(具体设计) | 90 | 60 |
Coding (具体编码) | 200 | 480 |
Coding Review(代码复审) | 100 | 180 |
Test(测试(自我测试,修改代码,提交修改)) | 250 | 200 |
Reporting(报告 | 40 | 30 |
Test Report(测试报告) | 40 | 40 |
Size Measurement(计算工作量) | 10 | 20 |
Postmortem & Process Improvement Plan (事后总结,并提出过程改进计划) | 20 | 20 |
合计 | 1200 | 1635 |
设计步骤
- 对文本文件实施分词操作;
- 去除不必要的符号;
- 提取特征值,计算相似值;
语言:python
设计流程图:
实现步骤
- LSI模型
LSI模型是一种简单使用的主题模型,LSI是基于奇异值分解(SVD)的方法来得到文本的主题的。把高维空间中的词和文档向量投影到更低维的空间使之降维并更易于得到两者之间的关系,将在高维空间中没有关系的文本(高维度文本向量不重合),在没有相同的词的情况下也可以用同样的向量进行表达。通过 LSI 模型得到文本主题矩阵之后使用余弦相似度的方法就可以用该矩阵进行文本相似度的计算。 - 引入的python包
import jieba#结巴分词
import re#正则计算去符号
from gensim import corpora, models, similarities
#基于LSI模型的相似度计算
- Get_file函数
def Get_file(doc):#1.文件预处理:读取文本文件,构造分词向量
...
- Dis_sig函数
def Dis_sig(str,stopwords):# 2.去符号及停用字
...
if (re.match(u"[a-zA-Z0-9\u4e00-\u9fa5]", tags)):# 去符号
if tags not in stopwords:#去停用字
...
...
- Com_sim函数
def Com_sim(all_doc_list, doc_test_list):# 3.计算相似值
text=[all_doc_list, doc_test_list]
dictionary = corpora.Dictionary(text)#构造语料库
corpus = [dictionary.doc2bow(doc) for doc in text]
doc_test_vec = dictionary.doc2bow(doc_test_list)
lsi = models.LsiModel(corpus)#模型训练
...
similarity = similarities.SparseMatrixSimilarity...#计算相似值
...
性能改进
- 最初设计是以TF-IDF模型 对文本相似度进行处理,但是由于TF-IDF模型是用于通过提取关键字以区分文本之间的关系的模型,对于IDF来说,它本身是一种试图抑制噪声的加权,本身倾向于文本中频率小的词,这使得TF-IDF算法的精度不高。故在此基础上修改为LSI模型,将词和文档向量投影到更低维的空间使之降维并更易于得到两者之间的关系。修改后性能如下:
异常处理
对于文件的输入输出采取了异常处理,当输入路径出错时会捕获异常,并停止运行。
测试结果
main2.py覆盖率为100%,且总体运行时间小于2.5s。
运行结果
-
orig与orig_0.8_del的对比结果为0.98
-
orig与orig_0.8_dis_15的对比结果为0.94
-
终端运行结果
需要4个路径输入,顺序分别为:原文本txt文件,待比较文本txt文件,输出结果的txt文件,停用词的txt文件,
由图可见,原文本文件与修改后的文本相似度较高,在打乱顺序后相似度仍为0.94,由此可得基于LSI模型求解文本相似度对顺序调整不敏感。
总结
- 由于python包含处理文本的包,能够较好的解决文本难以分解的问题。但由于之前并没有接触过python,通过查询资料和询问同学,可能存在不足,但自己也能够写完python脚本,这次也算是有所突破。
- 发现了自己对相关知识了解甚少,仅靠着强大的搜索引擎不断的学习,才能够有思路,代码能力也存在不足,需要之后不断练习来提高。
待改进
- 求解结果均高于0.9,由于测试文本是重复度过高,但用其他不相干的文章做检测并也会有较高的相似度,故查重算法还需再改进。