第一次个人编程作业
一、计算模块接口的设计与实现过程
思路:
读取两份文件,将两个文件存入字符串中,利用jieba分词,分词编号,根据词袋模型统计形成每个词在文中出现的次数向量,进行余弦相似度计算,得到结果。
流程图:
有关知识的简单记录:
1、运用jieba库分词:
jieba分词依靠中文词库,确定汉字之间的关联概率,概率大的组成词组,形成分词结果。除了分词,用户还可以添加自定义的词组。
对于一长段文字,其分词原理大体可分为三步:
1.首先用正则表达式将中文段落粗略的分成一个个句子。
2.将每个句子构造成有向无环图,之后寻找最佳切分方案。
3.最后对于连续的单字,采用HMM模型将其再次划分。
2、词袋模型(bag of words model):
获得文档内容中每个词的 tf 权重,即词项频率(词项t在文档d中的出现次数),一篇文档则转换成了词-权重的集合,称为词袋模型。词袋模型中会忽略词项在文档中的出现次序,只关心出现的次数。所以,文档Mary is quicker than John和John is quicker than Mary是等价的。只考虑词项频率时,在和查询进行相关度计算时,所有的词项都被认为是同等重要的。将每个文档看成是一个向量,其中每个分量都对应词典中的一个词项,分量值为计算出的权重。当某个词项在文档中没有出现时,其对应的分量值为0。这种向量形式对于评分和排序十分重要。
3、余弦相似度计算:
一个向量空间中两个向量夹角间的余弦值作为衡量两个个体之间差异的大小,余弦值接近1,夹角趋于0,表明两个向量越相似,余弦值接近于0,夹角趋于90度,表明两个向量越不相似。余弦相似度公式:
公式的分母是两个向量的欧几里得长度之积,分子是两个向量的内积。这样计算得到的sim实际上就是两个欧式归一化的向量之间的夹角的余弦。如下图:
一些模块
利用jieba分词
stopwords=[]
'''
#利用停用词表,因为不能读写其他文件,故已放弃
fstop=open('stop_words.txt','r',encoding='utf-8-sig')
for eachWord in fstop:
eachWord = re.sub("\n", "", eachWord)
stopwords.append(eachWord)
fstop.close()
'''
s1_cut = [i for i in jieba.cut(s1, cut_all=True) if (i not in stopwords) and i!='']
s2_cut = [i for i in jieba.cut(s2, cut_all=True) if (i not in stopwords) and i!='']
word_set = set(s1_cut).union(set(s2_cut))
用字典保存两篇文章中出现的所有词并编上号
word_dict = dict()
i = 0
for word in word_set:
word_dict[word] = i
i += 1
根据词袋模型统计词在每篇文档中出现的次数,形成向量
s1_cut_code = [0]*len(word_dict)
for word in s1_cut:
s1_cut_code[word_dict[word]]+=1
s2_cut_code = [0]*len(word_dict)
for word in s2_cut:
s2_cut_code[word_dict[word]]+=1
计算余弦相似度
sum = 0
sq1 = 0
sq2 = 0
for i in range(len(s1_cut_code)):
sum += s1_cut_code[i] * s2_cut_code[i]
sq1 += pow(s1_cut_code[i], 2)
sq2 += pow(s2_cut_code[i], 2)
try:
result = round(float(sum) / (math.sqrt(sq1) * math.sqrt(sq2)), 3)
except ZeroDivisionError:
result = 0.0
二、计算模块接口部分的性能改进
用pycharm生成的性能分析表:
main.py 的运行时间为:
三、计算模块部分单元测试展示
测试了老师给的9个文本,相似度算出来偏高了些,测试结果如下:
D:\python_files\orig.txt
d:\Users\DELL\Desktop\个人编程作业样例数据\sim_0.8\orig_0.8_add.txt
文本相似度为:99.60%
D:\python_files\orig.txt
d:\Users\DELL\Desktop\个人编程作业样例数据\sim_0.8\orig_0.8_del.txt
文本相似度为:99.40%
D:\python_files\orig.txt
d:\Users\DELL\Desktop\个人编程作业样例数据\sim_0.8\orig_0.8_dis_1.txt
文本相似度为:99.90%
D:\python_files\orig.txt
d:\Users\DELL\Desktop\个人编程作业样例数据\sim_0.8\orig_0.8_dis_3.txt
文本相似度为:99.90%
D:\python_files\orig.txt
d:\Users\DELL\Desktop\个人编程作业样例数据\sim_0.8\orig_0.8_dis_7.txt
文本相似度为:99.80%
D:\python_files\orig.txt
d:\Users\DELL\Desktop\个人编程作业样例数据\sim_0.8\orig_0.8_dis_10.txt
文本相似度为:99.60%
D:\python_files\orig.txt
d:\Users\DELL\Desktop\个人编程作业样例数据\sim_0.8\orig_0.8_dis_15.txt
文本相似度为:98.70%
D:\python_files\orig.txt
d:\Users\DELL\Desktop\个人编程作业样例数据\sim_0.8\orig_0.8_mix.txt
文本相似度为:99.80%
D:\python_files\orig.txt
d:\Users\DELL\Desktop\个人编程作业样例数据\sim_0.8\orig_0.8_rep.txt
文本相似度为:99.20%
四、计算模块部分异常处理说明
对空文本(kong.txt,内容为空)的异常处理,测试结果如下:
五、总结
在这次作业中,我意识到自己的实践能力确实十分薄弱。但在这个过程中,自己学习到了很多东西,好好利用了搜索引擎,锻炼了搜索资料的能力。刚开始本来是想用c++拼拼凑凑、凑凑拼拼来写这个作业的,结果在计算相似度的时候卡住了,搜了很多相关知识都没能解决,于是放弃了改用python。虽然结果好像不是非常好,但是我的收获颇多,希望自己继续加油!
六、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
· Planning | · 计划 | 20 | 60 |
· Estimate | · 估计这个任务需要多少时间 | 30 | 30 |
· Development | · 开发 | 110 | 260 |
· Analysis | · 需求分析 (包括学习新技术) | 600 | 630 |
· Design Spec | · 生成设计文档 | 30 | 30 |
· Design Review | · 设计复审 | 30 | 30 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20 | 20 |
· Design | · 具体设计 | 250 | 320 |
· Coding | · 具体编码 | 200 | 120 |
· Code Review | · 代码复审 | 50 | 80 |
· Test | · 测试(自我测试,修改代码,提交修改 | 140 | 200 |
· Reporting | · 报告 | 60 | 80 |
· Test Repor | · 测试报告 | 30 | 30 |
· Size Measurement | · 计算工作量 | 15 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 70 |
· 合计 | 1645 | 1980 |
七、参考的博客链接:
https://www.cnblogs.com/sun0618-/p/10657400.html
https://www.cnblogs.com/HankTown/p/12757832.html
https://blog.csdn.net/u010772289/article/details/78947496?utm_source=blogxgwz3