第一次个人项目作业

发布时间:2022-07-05 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了第一次个人项目作业脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
这个作业属于哪个课程 班级链接
这个作业要求在哪里 作业要求
这个作业的目标 设计文本查重算法,学习开发预估+单元测试+性能分析+gIT管理代码

GitHub

  • 代码链接

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

一.项目结构及开发环境

  • 开发环境

    1. 编程语言:Java 16
    2. 项目构建工具:maven
    3. 性能分析工具:JProfiler 9.2
    4. 单元测试:JUnit

      <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version>

    5. 外部依赖:HanLP

      <groupId>com.hankcs</groupId> <artifactId>hanlp</artifactId> <version>portable-1.8.2</version>

  • 项目结构

    • ArticleCompare:main 方法

    • TxtIO:读写 txt 文件工具类

    • HammingUtils:计算海明距离工具类

    • SimHashUtils:计算SimHash值工具类

    • TooShortException:自定义文本过短异常类

    • HTMLSpirit:处理html标签工具类

      第一次个人项目作业

二.开发流程

  1. 了解、选择文本处理技术

    • 作业要求计算两篇文本的相似度,人工判断文本是否相似是很简单的,但无法识别,若需要通过程序,需要先将文字转化成计算机能处理的数据;
    • 常见的文本表示模型有TF(Term Frequency)、TF-iDF(Term Frequency-Inverse Document Frequency)、句向量、simhash等等 除simhash外上述几种模型都有一些不足:
      • (1)TF精度较差(暴力比较),即对“非常相似”到“相同”这个相似度范围的判断不是很敏感;受文本长度等因素影响较大,相似度阈值定起来比较麻烦。
      • (2)精度也比较差; TF-IDF要求首先遍历一遍所有文本来的得到IDF,计算量比较大;
      • (3)句向量主要关注的是语义,对字面的相似不太擅长;计算量比较大。 因此最终选择simHash,一种将文本数据映射为固定长度的二进制编码的算法;
    • 相似度量度使用海明距离+余弦相似算法
  2. 深入了解算法

    1. 局部敏感hash、随机投影hash
      • 局部敏感哈希(Local Sensitive Hash)LSH的思想是,在保留数据相对位置的条件下,将原始数据映射到一个碰撞率较高的低维的新空间里,从而降低下游任务的计算量。利用局部敏感哈希编码的高碰撞率,我们可以设计出更加稀疏的倒查索引键值,从而得到非常高效的文本去重方案,即基于simhash的文本去重方法。
      • 随机投影hash的基础方法,是向量点积运算。而理解随机投影的基础,是理解向量点积运算的含义。向量点积表示的是,向量1在向量2法平面上投影长度的加权值,其中权重为向量2的长度;如果我们将向量2看做一个新空间的坐标轴,那么,在新的空间中,向量1的坐标就是向量1长度余弦值向量2余弦值,这样就完成了对向量1的映射。
    2. 基于随机投影的降维
      • Johnson–Lindenstrauss引理指出,在欧式空间中的若干点,经过相同的映射后进入新的空间,它们仍然会保持原来的相对位置。简单来说“相对位置”指的是一些点相距较近,一些点相距较远。这里只从直觉上展示随机投影“保留数据相对位置”的性质。也就是说可以通过生成随机向量多次映射将高维数据降维。我们可以基于高斯分布,生成向量的横坐标和纵坐标。
      • 数据点之间的相对距离存在一定程度的失真;假设有M条数据,维度非常高,为N。随机投影法将帮我们把这种数据压缩为K维(K远小于N)。将原始数据看做高维空间中的一个点。那么对应第m条数据,有一个向量,从原点出发到这个数据点。我们随机生成K个长度为N的一维向量,将原始数据映射到以这些随机向量所在直线为坐标轴的新空间中,得到新的点。这种降维方法叫做“随机投影法”。并且K越大,降维后的数据,保留的信息越多,数据之间的相对位置越“保真”。
    3. 基于随机投影的局部敏感哈希
      • 改进随机投影法进一步简化计算;在将数据映射到新空间后,我们将落在坐标轴负轴的维度(该维度取值为负数),统一赋值为0,表示数据与对应随机向量夹角大于90度。或者说,数据点与随机向量,在以后者为法向量、过原点的超平面的同侧。类似的,我们将落在坐标轴非负轴的维度,统一赋值为1。这样原始数据就被映射到了一个离散的新空间里。
      • 局部敏感哈希在随机投影降维方法的基础上,增加了离散化环节。直观地看,原来空间中的-0.66和-100,在新空间都成为1或者0,也就是说,二者在新的空间中是相等的。这样的结果是,在原来空间中比较接近的数据点,在新的空间中在一些维度上可能是相等的。
    4. 随机超平面hash
      • 随机超平面hash是在随机投影hash的基础上发展而来的。二者的名称含义相近,就像算法内容一样。与随机投影hash的主要区别是,随机超平面hash的编码结果是-1和1组成的串——与随机向量点积为负数,新空间中该维度取值-1;与随机向量点积为非负数,新空间中该维度取值为1。由于使用了新空间中所有象限,随机超平面hash的性能更好一些,在文本分类、聚类任务中表现更好。
    5. 从文本的词向量空间模型到simhash
      • simhash的计算过程
        1. 分词:按照一定的粒度切分文本,该项目使用HanLP的hanlp.extractkeyword()进行分词(关键字提取,进一步降低计算量)
        2. 将词语映射为定长二进制编码:使用hash函数,将文本的每一个碎片,用一种hash算法映射为一定长度的二进制编码(只有0与1);
        3. 将词语编码进一步转换:(随机超平面hash)我们需要把词语二进制编码中的“0”一律转换为“-1”,得到词语的最终编码,将0转换为-1的目的,是将映射后的词语放置在整个空间中,而不是某一个象限,这样可以让数据点分布得更均匀
        4. 加权:将句子中所有词语的编码加起来,将句子编码的非正数元素转换为0,正数元素转换为1,就得到了句子的最终编码就是句子的simhash编码。
        5. 基于simhash编码计算文本距离:Simhash完成了文本的低纬度表示 ,接下就可以进行文本相似度、文本分类等任务。海明距离是simhash的经典搭档,用来在simhash码的基础上度量文本之间的距离或相似度。
    6. 抽屉原理
      • 有3个抽屉、4个苹果。将4个苹果放到抽屉里,那么至少一个抽屉里,有2个苹果。当我们有X个抽屉、X+1个苹果,可以得到同样的结论,至少有一个抽屉里有2个苹果。一般来说文本重复与否海明距离阈值是3,当两篇文档被判定相似,那么二者的simhash码最多有3个位置是不相等的。我们的simhash编码是64位,可以分为4组连续的数字。那么两篇相似文档的simhash编码中,至少有一个子串是完全相等的。换句话说,只有包含了文档A的4个子串中的一个的文档,才有可能与A相似。
  3. 设计流程图

    • 第一次个人项目作业

  4. 性能测试

    • 测试html文本消耗

      第一次个人项目作业

      第一次个人项目作业

    • 测试标准文本消耗

      第一次个人项目作业

      第一次个人项目作业

  5. 单元测试、异常处理

    1. 正常流程执行

    2. 文本异常

    3. 路径异常

    4. 配置异常

      第一次个人项目作业

      第一次个人项目作业

三、个人总结

  1. 开发需要谋定而动,边想边敲代码开发效率低,本次作业急于求成走了不少弯路,后转换思路开发顺利不少;
  2. 开发过程中多查阅资料,了解项目所需及相关知识,优化自身代码,转为知识储备;
  3. 通过作业我学习了全面的代码测试模式和性能分析工具;软件最终是让客户用的而不是程序员,要考虑到用户各种误操作,优化代码提高健壮性,优化性能适应更多用户;

脚本宝典总结

以上是脚本宝典为你收集整理的第一次个人项目作业全部内容,希望文章能够帮你解决第一次个人项目作业所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。