第一次个人编程作业
这个作业属于哪个课程 | |
---|---|
这个作业要求在哪里 | |
作业的目标 | 设计一个论文查重算法。 |
作业需求
设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。
-
原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
-
抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求输入输出采用文件输入输出,规范如下:
-
从命令行参数给出:论文原文的文件的绝对路径。
-
从命令行参数给出:抄袭版论文的文件的绝对路径。
-
从命令行参数给出:输出的答案文件的绝对路径。
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 10 | 20 |
Estimate | 估计这个任务需要多少时间 | 5 | 5 |
Development | 开发 | 30 | 30 |
Analysis | 需求分析 (包括学习新技术) | 30 | 20 |
Design Spec | 生成设计文档 | 20 | 10 |
Design Review | 设计复审 | 20 | 10 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 0 | 0 |
Design | 具体设计 | 30 | 20 |
Coding | 具体编码 | 180 | 120 |
Code Review | 代码复审 | 10 | 20 |
Test | 测试(自我测试,修改代码,提交修改) | 20 | 20 |
Reporting | 报告 | 10 | 20 |
Test Repor | 测试报告 | 10 | 10 |
Size Measurement | 计算工作量 | 10 | 10 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 10 | 20 |
合计 | 395 | 315 |
模块设计与实现过程
-
模块设计:主要划分为三大模块。读文件模块、论文查重模块和写文件模块。
-
读文件模块:将论文原文和抄袭版论文的内容读取出来。
-
论文查重模块:将两个文章中的内容进行查重率计算并得出查重率。
-
写文件模块:将查重率写入到输出答案文件中。
-
-
实现过程
-
读文件模块:设计一个函数,输入变量为文件路径(String),输出变量为文件内容(String)。首先创建一个StringBuilder变量(用于拼接字符串提高效率),使用FileInputStream(文件路径)打开文件输入流,再使用InputStreamReader将字节流转换为字符流,最后使用BufferedReader逐行读取字符流。写一个循环,将BufferedReader变量中的内容逐行拼接到StringBuilder变量,直至内容为空。最后使用toString方法将StringBuilder转为String类型变量并返回。
-
论文查重模块:将论文原文和抄袭版论文内容按空格或符号划分为单词并保存到数组中,将原文单词添加到HashSet中,定义一个匹配单词数初始值为0,用于记录匹配的单词数,循环将抄袭版论文中单词与论文原文单词匹配,每匹配一个单词匹配单词数就加1。匹配单词数量/总单词数量=查重率。
-
写文件模块:设计一个函数,输入变量为文件路径(String)和查重率(Double)。首先创建FileWriter变量,再将查重率保留两位小数转换成字符串格式并写入到结果文件中。
-
-
流程图:
开发环境
-
开发系统:Windows 10
-
开发工具:IntelliJ IDEA 2021.1.1 x64
-
使用语言:java8
性能改进与分析
-
性能分析:我在每个函数执行时开始统计时间,到函数运行结束后打印出函数执行时间,通过观察可以看出最耗费时间的函数是writeResultToFile,可以得出结论,对文件进行写操作是比较花费时间的。
-
-
性能优化点:
-
在中文文本分词方面,可以考虑使用专门的中文分词库或算法,而不是进行分词后,再循环剔除符号,这将导致耗时变长。
-
在文件写入方面,可以使用缓冲机制,如BufferedWriter,以提高写入性能。
-
测试
-
运行指令:
-
编译:javac -source 1.8 -target 1.8 PlagiarismChecker.java
-
运行:java -classpath . PlagiarismChecker original.txt plagiarized.txt output.txt
-
-
测试案例
-
案例一:
-
原论文:
-
-
抄袭版论文:
-
查重率:
-
-
-
案例二:
-
原论文:
-
抄袭版论文:
-
查重率:
-
-
异常处理
-
打印出将原文单词划分为内容的数组,可以发现该程序将符号也划分为单词,而我的算法是匹配单词数/总单词数=查重率,可见将符号划分为单词会影响结果正确性。
-
解决方法:使用循环以及正则表达式将数组中的符号删除
-
private static List<String> segmentChineseText(String text) {
Pattern pattern = Pattern.compile("[\\pP\\p{S}\\s]+"); // 匹配中英文符号和空格
String cleanText = pattern.matcher(text).replaceAll(" ");
String[] words = cleanText.split("\\s+");
List<String> result = new ArrayList<>();
for (String word : words) {
if (!word.isEmpty()) {
result.add(word);
}
}
return result;
} -
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗