第一次个人编程作业
第一次编程作业
这个作业属于哪个课程 | 软件工程2024-双学位 (广东工业大学) |
---|---|
这个作业要求在哪里 | 个人项目作业-论文查重 |
这个作业的目标 | 设计PSP表格、计算模块接口设计与实现、计算模块接口部分的性能改进、单元测试、异常处理 |
参考文献 | CSDN、知乎、博客园、百度百科 |
仓库地址
https://gitcode.net/flaghess/3121002697
需求分析
题目:论文查重
描述如下:
设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。
开发工具
Java版本:Java 8
IDE工具:Intellij IDEA 2022
项目构建工具:maven
PSP表格
*PSP2.1* | *Personal Software Process Stages* | *预估耗时(分钟)* | *实际耗时(分钟)* |
---|---|---|---|
Planning | 计划 | 5 | 5 |
· Estimate | · 估计这个任务需要多少时间 | 5 | 5 |
Development | 开发 | 300 | 420 |
· Analysis | · 需求分析 (包括学习新技术) | 50 | 120 |
· Design Spec | · 生成设计文档 | 20 | 20 |
· Design Review | · 设计复审 | 10 | 20 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 30 |
· Design | · 具体设计 | 40 | 60 |
· Coding | · 具体编码 | 80 | 50 |
· Code Review | · 代码复审 | 30 | 60 |
· Test | · 测试(自我测试,修改代码,提交修改) | 30 | 60 |
Reporting | 报告 | 50 | 50 |
· Test Repor | · 测试报告 | 10 | 10 |
· Size Measurement | · 计算工作量 | 10 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 20 |
· 合计 | 355 | 475 |
算法实现基本思路
一、文本预处理:
对输入的文本进行预处理,包括去除标点符号、转换为小写字母等操作,以确保文本的一致性和可比性。
-
去除特殊字符和标点符号:
使用正则表达式或内置函数去除文本中的特殊字符和标点符号,例如
.,?!
等。 -
转换为小写字母:
将文本中的所有字母转换为小写字母,以确保大小写一致性。
-
分词:
将文本拆分为单词或词语,这是后续构建词袋模型的基础。可以使用空格分割、分词器等方法进行分词。
二、词袋模型构建:
将文本表示为词袋模型的向量表示。将每篇文本转换为一个向量,其中向量的每个元素表示对应词汇的出现次数或TF-IDF值。
-
词汇表构建:
遍历所有文档,将文档中出现的所有单词收集起来,构建一个词汇表(vocabulary)。
-
文档向量化:
对每篇文档进行向量化,将文档表示为一个向量,向量的每个元素表示对应词汇在文档中出现的次数或TF-IDF值。
-
标准化向量:
对向量进行标准化处理,例如将词频转换为TF-IDF值,以减少常见词汇对相似度计算的影响。
三、余弦相似度计算:
使用余弦相似度算法计算两篇文本之间的相似度。余弦相似度是一种常用的文本相似度度量方法,计算两个向量之间的夹角余弦值以得到两个向量的相似度。
-
计算向量点积:
首先,计算两个向量的点积(dot product),即将两个向量对应位置的元素相乘,并将结果相加。
-
计算向量范数:
分别计算两个向量的范数(norm),即每个向量的模的平方再开方。
-
计算余弦相似度:
将步骤1中计算的点积除以两个向量的范数乘积,即得到余弦相似度的值。
其中余弦相似度数学公式计算为:
cosine_similarity = dot_product / (norm(vector1) * norm(vector2))
四、整合和展示:
将以上步骤整合为一个完整的文本相似度检测工具,可以接受用户输入的文本,经过处理和计算后输出相似度结果。
计算模块接口设计与实现
1、读写模块
FileHandler
类
方法:readTextFile
方法用于读取文本文件内容 writeTextFile
方法用于将内容写入文本文件
2、文件预处理模块
TextPreprocessor
类
方法:processText
方法,用于对文本内容进行预处理,构建词袋模型
buildBagOfWords
方法用于构建文本的词袋模型
preprocessWord
对单词进行简单的文本预处理,如转换为小写并去除非字母数字字符
3、计算文本相似度模块
PlagiarismChecker
类
方法:
calculateCosineSimilarity(Map<String, Integer> bag1, Map<String, Integer> bag2)
: 这个私有静态方法用于计算两个词袋模型之间的相似度。在这个简单示例中,相似度计算方法是通过比较两个词袋模型中共同单词的数量,并计算共同单词数占总单词数的比例来表示相似度。