首页 > 其他分享 >个人项目

个人项目

时间:2024-09-10 12:46:49浏览次数:1  
标签:similarityRate 个人 文件 double 项目 我要 今天 Test

这个作业属于哪个课程 计科22级12班
这个作业要求在哪里 作业
这个作业的目标 设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。

Github链接:https://github.com/CloneYek/Kevin/blob/main/3122004904


项目开发要求

题目:论文查重

描述如下:

设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。

原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求输入输出采用文件输入输出,规范如下:

从命令行参数给出:论文原文的文件的绝对路径。
从命令行参数给出:抄袭版论文的文件的绝对路径。
从命令行参数给出:输出的答案文件的绝对路径。
我们提供一份样例,课堂上下发,上传到班级群,使用方法是:orig.txt是原文,其他orig_add.txt等均为抄袭版论文。

注意:答案文件中输出的答案为浮点型,精确到小数点后两位

1 PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 1200 1100
· Estimate · 估计这个任务需要多少时间 900 720
Development 开发 600 300
· Analysis · 需求分析 (包括学习新技术) 120 300
· Design Spec · 生成设计文档 60 90
· Design Review · 设计复审 60 60
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 30 60
· Design · 具体设计 120 150
· Coding · 具体编码 60 30
· Code Review · 代码复审 30 30
· Test · 测试(自我测试,修改代码,提交修改) 120 60
Reporting 报告 300 300
· Test Repor · 测试报告 120 120
· Size Measurement · 计算工作量 120 60
Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 60 120
· 合计 1200 1100

2 项目模块设计与实现

主类:PlagiarismChecker:包含main方法,可以接收指定参数,使用JiebaSegmenter进行中文分词,再通过集合操作计算Jaccard相似度,结果以百分比形式输出到指定文件中。

测试类:JiebaPlagiarismTest:测试不同情况的字符串之间重复率。

2.1项目结构:

2.2程序流程:

  • 接收命令行参数:程序启动时,检查是否接收到三个命令行参数:
  1. 原始文本文件路径、抄袭文本文件路径、输出结果文件路径
  2. 如果参数数量不正确,输出用法提示并终止程序。
  • 读取文件内容:
  1. 使用 Files.readAllBytes 方法读取原始文本文件的内容,并将其存储为字符串。
  2. 读取抄袭文本文件的内容,并将其存储为字符串。
  • 计算相似度:
  1. 创建 JiebaSegmenter 实例,用于中文分词。
  2. 对原始文本进行分词,生成一个包含所有单词的集合。
  3. 对抄袭文本进行分词,生成另一个包含所有单词的集合。
  4. 计算这两个集合的交集,得到两个文本中共同存在的单词数量。
  5. 计算相似度百分比:将交集的大小除以原始文本单词集合的大小,并乘以 100,以获得相似度的百分比值。
  • 写入结果:
  1. 使用 BufferedWriter 将计算得到的相似度结果写入指定的输出文件。
  2. 结果格式化为两位小数。
  • 异常处理:
    在读取文件和写入结果的过程中,捕获可能发生的 IOException,并打印异常信息以便调试。

2.3关键方法分析

  • 分词

  1. 工具的介绍:Jieba分词器,最早是提供了python包,后来由huaban开发出了java版本。

  2. 引入:引入相关依赖

         <dependency>
         <groupId>com.huaban</groupId>
         <artifactId>jieba-analysis</artifactId>
         <version>1.0.2</version>
         <dependency>
    
  3. 原理:jieba项目resource目录下有个dict.txt文件,里面维护了非常多的拆词,jieba就是根据这个文件进行拆词的。自己也可以在这个文件中添加自定义拆词,或者新建一个文件。

  • 查重

  1. 将两个文本分词后存入集合;
  2. 计算两个文本分词后的交集;
  3. 计算相似度百分比;

3. 计算模块接口部分的性能改进

  • 主类模块的性能如下


  • 改进后

  1. 优化文件读取 采用BufferedReader;
  2. 优化集合操作 将较小的集合作为参数来使用retainAll;
  3. 使用并行处理;

4. 计算模块单元展示

测试代码展示:

点击查看代码
    public class JiebaPlagiarismTest {
private double calculateJaccardSimilarity(String originalText, String plagiarizedText) {
    JiebaSegmenter segmenter = new JiebaSegmenter();
    Set<String> originalWords = new HashSet<>(segmenter.sentenceProcess(originalText));
    Set<String> plagiarizedWords = new HashSet<>(segmenter.sentenceProcess(plagiarizedText));

    // 计算交集和并集
    Set<String> intersection = new HashSet<>(originalWords);
    intersection.retainAll(plagiarizedWords);

    Set<String> union = new HashSet<>(originalWords);
    union.addAll(plagiarizedWords);

    // Jaccard 相似度计算
    return union.isEmpty() ? 0 : (double) intersection.size() / union.size() * 100;
}

@Test
public void testExactMatch() {
    double similarityRate = calculateJaccardSimilarity("今天是星期天,天气晴,今天晚上我要去看电影。",
            "今天是星期天,天气晴,今天晚上我要去看电影。");
    System.out.printf("%.2f", similarityRate);
}

@Test
public void testReverseString() {
    double similarityRate = calculateJaccardSimilarity("今天是星期天,天气晴,今天晚上我要去看电影。",
            "电影看去我要晚上今天,晴天气,天星期是今天。");
    System.out.printf("%.2f", similarityRate);
}

@Test
public void testWithSymbols() {
    double similarityRate = calculateJaccardSimilarity("今天是星期天,天气晴,今天晚上我要去看电影。",
            "今天是星期天,天气晴,今天晚上我要去看电影!");
    System.out.printf("%.2f", similarityRate);
}

@Test
public void testPartialChange() {
    double similarityRate = calculateJaccardSimilarity("今天是星期天,天气晴,今天晚上我要去看电影。",
            "今天是星期天,天气晴,今晚上我要去看电影。");
    System.out.printf("%.2f", similarityRate);
}

@Test
public void testPartialMissing() {
    double similarityRate = calculateJaccardSimilarity("今天是星期天,天气晴,今天晚上我要去看电影。",
            "今天是星期天,天气晴,今晚上要去看电影。");
    System.out.printf("%.2f", similarityRate);
}

@Test
public void testEmptyString() {
    double similarityRate = calculateJaccardSimilarity("", "");
    System.out.printf("%.2f", similarityRate);
}

}

测试结果展示:

5.模块部分异常处理

5.1 文件路径检查

if (!Files.exists(Paths.get(originalFilePath))||!Files.exists(Paths.get(plagiarizedFilePath))) 
{
    System.out.println("One or both input files do not exist.");
    return;
}

5.2 读取文件的异常处理

try {
    String originalText = readFile(originalFilePath);
    String plagiarizedText = readFile(plagiarizedFilePath);
    // 其他代码...
} catch (IOException e) {
    e.printStackTrace();
}

5.3 并发处理的异常处理

try {
    double similarityRate = similarityFuture.get();  // 等待计算结果
    // 写入文件的代码...
} catch (InterruptedException | ExecutionException e) {
    e.printStackTrace();
} finally {
    executor.shutdown();
}

5.4 写入文件的异常处理

try (BufferedWriter writer = new BufferedWriter(new FileWriter(outputFilePath))) {
    writer.write(String.format("Similarity Rate: %.2f%%", similarityRate));
} catch (IOException e) {
    e.printStackTrace();
}

6. 项目功能测试






标签:similarityRate,个人,文件,double,项目,我要,今天,Test
From: https://www.cnblogs.com/kevin-/p/18394709

相关文章

  • 基于java ssm vue mysql大学校医院信息管理系统毕业设计项目实战分享
    前言......
  • java+vue计算机毕设大学生创新创业项目管理【源码+开题+论文+程序】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在当今全球化和知识经济时代,创新创业已成为推动社会进步与经济发展的重要引擎。随着高等教育的普及与深化,大学生作为最具活力和创造力的群体之一,其创......
  • 组合和继承怎么集成一个性能较好的项目
     组合和继承都是计算机面向对象编程的基础概念。组合是一个类对象的属性组合。继承是对项目中类对象重复代码块的重复利用。重复使用的代码块需要在项目中抽取出来,供其它子模块引用。继承可以是的项目中的代码空间和内存空间都可以进行有效缩减。组合在现在的项目开发中使用很多......
  • 新斗音低价全自动下单挂机项目
    项目概述本项目旨在开发一款工具,用于自动化地分析和参与电商平台上的促销活动。该工具可以帮助用户高效地识别优惠商品,并进行数据分析以优化购买策略。核心功能数据采集:自动采集电商平台上的促销商品信息。智能下单:根据用户设定的条件,自动下单购买符合条件的商品。订......
  • 实战项目01-icon图标修改
    修改项目图标引入图片资源,放入指定目录,覆盖掉之前图片即可目录:entry>src>main>resources>base>media图片:startIcon.png foreground.pngbackground.png  修改项目标题需要修改EntryAbility_label字段的值。同时因为项目没有做国际化语言配置,所以直接使用......
  • 『功能项目』C#拓展 - 优化冗余脚本【36】
    我们打开上一篇35战士的平A特效的项目,本章要做的事情是代码优化,通常为了少写一些重复的脚本,会将常用到的一段代码封装在一个自定义的静态拓展方法里,在外部类中调用即可。新建一个脚本文件夹创建脚本:WExtension.csusingUnityEngine;publicstaticclassWExtension{......
  • 【LLM训练系列】从零开始训练大模型之Phi2-mini-Chinese项目解读
    一、前言本文主要是在复现和实践Phi2-mini-Chinese后,简要分析下Phi2-mini-Chinese这个项目,做一个学习实战总结。原文发布于知乎:https://zhuanlan.zhihu.com/p/718307193,转载请注明出数。Phi2-mini-Chinese简介Phi2-Chinese-0.2B从0开始训练自己的Phi2中文小模型,支持接入langc......
  • 一种基于祈祷的开源项目学习方法
    总体上是这几点:以祈祷、读文档、读注释、看issue为理解代码的主要手段以读代码、debug为辅助理解代码的方法以debug为验证理解的主要手段每日整理当日理解的内容不理解的留个印象,先跳过为什么要祈祷?因为作者不一定太关心文档和注释:大多数人以正确实现为主要目标。所以要......
  • 贪吃蛇项目实现(C语言)——附源码
    前言贪吃蛇是一款十分经典的游戏,其通过控制贪吃蛇的上下左右移动来吃食物,延长自己的身体,也会因为撞到墙体和自身而死亡。下面我们通过C语言来实现贪吃蛇。1.技术要点C语言枚举,结构体,链表,动态内存管理,预处理指令,函数,Win32API等。2.Win32API 要使用Win32API我们就需......
  • 【Django开发】前后端分离django美多商城项目第10篇:收货地址,1. 展示地址接口设计和定
    本教程的知识点为:项目准备项目准备配置1.修改settings/dev.py文件中的路径信息2.INSTALLED_APPS3.数据库用户部分图片1.后端接口设计:视图原型2.具体视图实现用户部分使用Celery完成发送判断帐号是否存在1.判断用户名是否存在后端接口设计:用户部分JWT什......