第一次个人编程作业
第一次个人编程作业
01 课程及作业目标
这个作业属于哪个课程 | 班级链接 |
---|---|
这个作业要求在哪里 | 作业要求 |
这个作业的目标 | 论文查重算法实现+单元测试使用+学会程序性能分析+程序结构设计 |
本人Github | 3119005424 |
02 PSP 表格
PSP2.1 | Personal Software Process Stages | 预计耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 65 |
Estimate | 估计这个任务需要多少时间 | 10 | 5 |
Development | 开发 | 360 | 540 |
Analysis | 需求分析(包括学习新技术) | 300 | 370 |
Design Spec | 生成设计文档 | 30 | 35 |
Design Review | 设计复审 | 20 | 30 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 30 | 45 |
Design | 具体设计 | 60 | 45 |
Coding | 具体编码 | 240 | 410 |
Code Review | 代码复审 | 30 | 40 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 25 |
Reporting | 报告 | 30 | 45 |
Test Reporting | 测试报告 | 30 | 50 |
Size Measurement | 计算工作量 | 15 | 10 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 15 | 25 |
合计 | 1260 | 1695 |
03 所使用的包及算法
jieba库
- 首先是jieba库的原理图
1.支持三种分词模式:
- 精确模式,试图将句子最精确地切开,适合文本分析;
- 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
- 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
2.jieba自带了一个叫做dict.txt的词典, 里面有2万多条词
- 该词条包含了词条出现的次数(这个次数是于作者自己基于人民日报语料等资源训练得出来的)和词性. 这个第一条的trie树结构的词图扫描, 说的就是把这2万多条词语, 放到一个trie树中, 而trie树是有名的前缀树, 也就是说一个词语的前面几个字一样, 就表示他们具有相同的前缀, 就可以使用trie树来存储, 具有查找速度快的优势。
3.jieba分词应该属于概率语言模型分词
- 概率语言模型分词的任务是:在全切分所得的所有结果中求某个切分方案S,使得P(S)最大。
4.总而言之,jieba库是我在网上查阅资料之后,确定的最全面且使用的python中文分词组件,因为此前也没有系统学习过python,使用这个库是对于我而言较为实际的选择。
jieba.analyse
jieba.analyse.extract_tags(sentence, topK=n, withWeight=True)
参数说明 :
- sentence 需要提取的字符串,必须是str类型,不能是list
- topK 提取前多少个关键字
- withWeight 是否返回每个关键词的权重
原理:
jieba.analyse.extract_tags()提取关键字的原理是使用TF-IDF算法
Jaccard相似度算法
jaccard index又称为jaccard similarity coefficient用于比较有限样本集之间的相似性和差异性。
主要应用场景:
比较文本的相似度,用于文本的查重与去重
计算对象间的距离,用于数据聚类
用于衡量有限样本集之间的相似程度:
jaccard距离公式:
jaccard系数取值范围[0,1]
当A==B时,jaccard系数为1;当A与B不相交,jaccard系数为0
jaccard距离表示样本或集合的不相似程度,jaccard距离越大,样本相似度越低。
04 部分代码及解释
-
关于Jaccard函数的使用
-
对分词的关键词进行提取与处理
首先对分词与关键词进行提取,再进行Jaccard相似度计算,并且除0处理 -
异常的捕捉
当键盘键入的文件路径错误时,会提醒“文件路径错误”,并允许重新输入 -
可进行多次查重对比
05 测试结果
- 运行结果
06 性能分析
- 占用内存
07 个人总结
- 认识到了python语言的强大以及其在文本识别、数据处理方面的易用性,以及其开源库的强大,数据处理相关的、统计学相关的几乎任何模型、公式、都能在其中找到,并能够很快的上手调用,但是缺点是对此中的原理以及细节就并不是很掌握,其中所使用的算法往往也较为复杂。
- 在学习语言的时候,语言的细节十分重要,算法同样占据非常重要的地位,并且在软件开发时要注意易用性与完整性,以及与用户的交互。
- 由于是第一次接python语言,还是有很多很多细节没有详细去掌握,更多是实用主义的拿来就用调好参数,会用就行,需要后期对python语言的特性以及细节进行更深入的学习与掌握