脚本宝典收集整理的这篇文章主要介绍了第一次个人项目作业,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
这个作业属于哪个课程 |
班级链接 |
这个作业要求在哪里 |
作业要求 |
这个作业的目标 |
设计文本查重算法,学习开发预估+单元测试+性能分析+gIT管理代码 |
PSP表格
PSP2.1 |
PErsonal Software PRocess Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
90 |
90 |
· EstiMATE |
· 估计这个任务需要多少时间 |
30 |
30 |
Development |
开发 |
420 |
480+ |
· Analysis |
· 需求分析 (包括学习新技术) |
30 |
40 |
· Design Spec |
· 生成设计文档 |
40 |
40 |
· Design review |
· 设计复审 |
20 |
20 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
10 |
10 |
· Design |
· 具体设计 |
60 |
60 |
· Coding |
· 具体编码 |
300 |
360 |
· Code Review |
· 代码复审 |
30 |
30 |
· test |
· 测试(自我测试,修改代码,提交修改) |
200 |
200 |
Reporting |
报告 |
40 |
50 |
· Test Report |
· 测试报告 |
20 |
40 |
· Size Measurement |
· 计算工作量 |
10 |
10 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
20 |
20 |
· 合计 |
|
1320 |
1480 |
一.项目结构及开发环境
-
开发环境
- 编程语言:Java 16
- 项目构建工具:maven
- 性能分析工具:JProfiler 9.2
- 单元测试:JUnit
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
- 外部依赖:HanLP
<groupId>com.hankcs</groupId>
<artifactId>hanlp</artifactId>
<version>portable-1.8.2</version>
-
项目结构
二.开发流程
-
了解、选择文本处理技术
- 作业要求计算两篇文本的相似度,人工判断文本是否相似是很简单的,但电脑无法识别,若需要通过程序,需要先将文字转化成计算机能处理的数据;
- 常见的文本表示模型有TF(Term Frequency)、TF-iDF(Term Frequency-Inverse Document Frequency)、句向量、simhash等等
除simhash外上述几种模型都有一些不足:
- (1)TF精度较差(暴力比较),即对“非常相似”到“相同”这个相似度范围的判断不是很敏感;受文本长度等因素影响较大,相似度阈值定起来比较麻烦。
- (2)精度也比较差; TF-IDF要求首先遍历一遍所有文本来的得到IDF,计算量比较大;
- (3)句向量主要关注的是语义,对字面的相似不太擅长;计算量比较大。
因此最终选择simHash,一种将文本数据映射为固定长度的二进制编码的算法;
- 相似度量度使用海明距离+余弦相似算法
-
深入了解算法
- 局部敏感hash、随机投影hash
- 局部敏感哈希(Local Sensitive Hash)LSH的思想是,在保留数据相对位置的条件下,将原始数据映射到一个碰撞率较高的低维的新空间里,从而降低下游任务的计算量。利用局部敏感哈希编码的高碰撞率,我们可以设计出更加稀疏的倒查索引键值,从而得到非常高效的文本去重方案,即基于simhash的文本去重方法。
- 随机投影hash的基础方法,是向量点积运算。而理解随机投影的基础,是理解向量点积运算的含义。向量点积表示的是,向量1在向量2法平面上投影长度的加权值,其中权重为向量2的长度;如果我们将向量2看做一个新空间的坐标轴,那么,在新的空间中,向量1的坐标就是向量1长度余弦值向量2余弦值,这样就完成了对向量1的映射。
- 基于随机投影的降维
- Johnson–Lindenstrauss引理指出,在欧式空间中的若干点,经过相同的映射后进入新的空间,它们仍然会保持原来的相对位置。简单来说“相对位置”指的是一些点相距较近,一些点相距较远。这里只从直觉上展示随机投影“保留数据相对位置”的性质。也就是说可以通过生成随机向量多次映射将高维数据降维。我们可以基于高斯分布,生成向量的横坐标和纵坐标。
- 数据点之间的相对距离存在一定程度的失真;假设有M条数据,维度非常高,为N。随机投影法将帮我们把这种数据压缩为K维(K远小于N)。将原始数据看做高维空间中的一个点。那么对应第m条数据,有一个向量,从原点出发到这个数据点。我们随机生成K个长度为N的一维向量,将原始数据映射到以这些随机向量所在直线为坐标轴的新空间中,得到新的点。这种降维方法叫做“随机投影法”。并且K越大,降维后的数据,保留的信息越多,数据之间的相对位置越“保真”。
- 基于随机投影的局部敏感哈希
- 改进随机投影法进一步简化计算;在将数据映射到新空间后,我们将落在坐标轴负轴的维度(该维度取值为负数),统一赋值为0,表示数据与对应随机向量夹角大于90度。或者说,数据点与随机向量,在以后者为法向量、过原点的超平面的同侧。类似的,我们将落在坐标轴非负轴的维度,统一赋值为1。这样原始数据就被映射到了一个离散的新空间里。
- 局部敏感哈希在随机投影降维方法的基础上,增加了离散化环节。直观地看,原来空间中的-0.66和-100,在新空间都成为1或者0,也就是说,二者在新的空间中是相等的。这样的结果是,在原来空间中比较接近的数据点,在新的空间中在一些维度上可能是相等的。
- 随机超平面hash
- 随机超平面hash是在随机投影hash的基础上发展而来的。二者的名称含义相近,就像算法内容一样。与随机投影hash的主要区别是,随机超平面hash的编码结果是-1和1组成的串——与随机向量点积为负数,新空间中该维度取值-1;与随机向量点积为非负数,新空间中该维度取值为1。由于使用了新空间中所有象限,随机超平面hash的性能更好一些,在文本分类、聚类任务中表现更好。
- 从文本的词向量空间模型到simhash
- simhash的计算过程
- 分词:按照一定的粒度切分文本,该项目使用HanLP的hanlp.extractkeyword()进行分词(关键字提取,进一步降低计算量)
- 将词语映射为定长二进制编码:使用hash函数,将文本的每一个碎片,用一种hash算法映射为一定长度的二进制编码(只有0与1);
- 将词语编码进一步转换:(随机超平面hash)我们需要把词语二进制编码中的“0”一律转换为“-1”,得到词语的最终编码,将0转换为-1的目的,是将映射后的词语放置在整个空间中,而不是某一个象限,这样可以让数据点分布得更均匀
- 加权:将句子中所有词语的编码加起来,将句子编码的非正数元素转换为0,正数元素转换为1,就得到了句子的最终编码就是句子的simhash编码。
- 基于simhash编码计算文本距离:Simhash完成了文本的低纬度表示 ,接下就可以进行文本相似度、文本分类等任务。海明距离是simhash的经典搭档,用来在simhash码的基础上度量文本之间的距离或相似度。
- 抽屉原理
- 有3个抽屉、4个苹果。将4个苹果放到抽屉里,那么至少一个抽屉里,有2个苹果。当我们有X个抽屉、X+1个苹果,可以得到同样的结论,至少有一个抽屉里有2个苹果。一般来说文本重复与否海明距离阈值是3,当两篇文档被判定相似,那么二者的simhash码最多有3个位置是不相等的。我们的simhash编码是64位,可以分为4组连续的数字。那么两篇相似文档的simhash编码中,至少有一个子串是完全相等的。换句话说,只有包含了文档A的4个子串中的一个的文档,才有可能与A相似。
-
设计流程图
-
性能测试
-
单元测试、异常处理
-
正常流程执行
-
文本异常
-
路径异常
-
配置异常
三、个人总结
1. 开发需要谋定而动,边想边敲代码开发效率低,本次作业急于求成走了不少弯路,后转换思路开发顺利不少;
2. 开发过程中多查阅资料,了解项目所需及相关知识,优化自身代码,转为知识储备;
3. 通过作业我学习了全面的代码测试模式和性能分析工具;软件最终是让客户用的而不是程序员,要考虑到用户各种误操作,优化代码提高健壮性,优化性能适应更多用户;
脚本宝典总结
以上是脚本宝典为你收集整理的第一次个人项目作业全部内容,希望文章能够帮你解决第一次个人项目作业所遇到的问题。
如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。