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

个人项目

时间:2024-09-13 20:06:58浏览次数:1  
标签:Set String 个人 项目 import println new line

个人项目

这个作业属于哪个课程 计科22级12班
这个作业要求在哪里 作业要求
这个作业的目标 完成个人项目,实现论文查重的功能,了解软件开发流程

github:https://github.com/MIR-mIsTEo/3122004822-01

一、完成PSP表格

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

二、项目结构与设计

其中,测试文件放在resources资源文件夹中
该项目由多个部分组成:
main函数:程序主入口,通过args从命令行获取原文,相似文章以及答案所写路径
tokenize函数:进行中文分词
jaccardSimilarity函数:利用jaccard算法计算两篇文章的相似度
tokenizeFile函数:用于读取文件中的文字
checkPlagiarism函数:比较两篇文章,设置阈值,并将结果输出到文件中
writeResultsToFile函数:输出结果到文件中的函数

项目结构
src
├── main
│ └── java
│ │ └── Main // 主函数
│ └── resources // 测试输入输出文件
│ │ └── answers
│ │ └── orig.txt
│ │ └── ...
├── test
代码实现
import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.seg.common.Term;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class PlagiarismChecker {

// 中文分词
private Set<String> tokenize(String text) {
    List<Term> terms = HanLP.segment(text);
    Set<String> words = new HashSet<>();
    for (Term term : terms) {
        words.add(term.word); // 提取Term中的word字段
    }
    return words; // 返回唯一的单词集合
}

// 计算Jaccard相似度
private double jaccardSimilarity(Set<String> set1, Set<String> set2) {
    Set<String> intersection = new HashSet<>(set1);
    intersection.retainAll(set2);
    Set<String> union = new HashSet<>(set1);
    union.addAll(set2);
    return (double) intersection.size() / union.size();
}

// 从文件中读取分词结果
private Set<String> tokenizeFile(String filePath) {
    Set<String> tokens = new HashSet<>();
    try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
        String line;
        while ((line = br.readLine()) != null) {
            tokens.addAll(tokenize(line)); // 对每一行进行分词
        }
    } catch (IOException e) {
        System.err.println("读取文件时发生错误: " + e.getMessage());
    }
    return tokens;
}

public void checkPlagiarism(String originalText, String plagiarizedText, String outputFilePath) {
    Set<String> tokens1 = tokenize(originalText);
    Set<String> tokens2 = tokenize(plagiarizedText);

    double similarity = jaccardSimilarity(tokens1, tokens2);
    double percentage = similarity * 100;

    String result = String.format("原文与抄袭文的相似度: %.2f%%\n", percentage);
    System.out.println(result);

    if (similarity > 0.5) { // 设置阈值为50%
        result += "警告:可能存在抄袭行为!\n";
    } else {
        result += "文本之间没有明显的抄袭行为。\n";
    }

    writeResultsToFile(outputFilePath, result);
}

// 将结果写入文件
private void writeResultsToFile(String filePath, String results) {
    try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) {
        writer.write(results);
        System.out.println("结果已写入 " + filePath);
    } catch (IOException e) {
        System.err.println("写入文件时发生错误: " + e.getMessage());
    }
}

public static void main(String[] args) {
    if (args.length < 3) {
        System.out.println("请提供原文路径、抄袭文路径和输出文件路径: ");
        return;
    }

    String originalFilePath = args[0];
    String plagiarizedFilePath = args[1];
    String outputFilePath = args[2];

    // 读取原文和抄袭文
    StringBuilder originalText = new StringBuilder();
    StringBuilder plagiarizedText = new StringBuilder();

    try {
        // 读取原文
        BufferedReader originalReader = new BufferedReader(new FileReader(originalFilePath));
        String line;
        while ((line = originalReader.readLine()) != null) {
            originalText.append(line).append("\n");
        }
        originalReader.close();

        // 读取抄袭文
        BufferedReader plagiarizedReader = new BufferedReader(new FileReader(plagiarizedFilePath));
        while ((line = plagiarizedReader.readLine()) != null) {
            plagiarizedText.append(line).append("\n");
        }
        plagiarizedReader.close();
    } catch (IOException e) {
        System.err.println("读取文件时发生错误: " + e.getMessage());
        return;
    }

    PlagiarismChecker checker = new PlagiarismChecker();
    checker.checkPlagiarism(originalText.toString(), plagiarizedText.toString(), outputFilePath);
}

结果:

三、性能分析

从数据来看,内存占用较大的函数为:
private Set tokenize(String text) {
List terms = HanLP.segment(text);
Set words = new HashSet<>();
for (Term term : terms) {
words.add(term.word); // 提取Term中的word字段
}
return words; // 返回唯一的单词集合
}
这说明在读取数据的方法需要有所改进:
1.更换其他中文分词器,提高读取效率
2.使用高级的输入流提高读取数据的效率

四、异常处理

对读取文件时读到空文件进行异常处理
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = br.readLine()) != null) {
tokens.addAll(tokenize(line)); // 对每一行进行分词
}
} catch (IOException e) {
System.err.println("读取文件时发生错误: " + e.getMessage());
}

输入文件数不等于三的处理
if (args.length < 3) {
System.out.println("请提供原文路径、抄袭文路径和输出文件路径: ");
return;
}

对写入文件时发生错误的异常处理
private void writeResultsToFile(String filePath, String results) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) {
writer.write(results);
System.out.println("结果已写入 " + filePath);
} catch (IOException e) {
System.err.println("写入文件时发生错误: " + e.getMessage());
}
}

标签:Set,String,个人,项目,import,println,new,line
From: https://www.cnblogs.com/1Q122334488/p/18406677

相关文章

  • 个人项目
    这个作业属于哪个课程22级计科2班这个作业要求在哪里作业要求这个作业目标设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率Github地址:https://github.com/JiangJiazhe/JiangJiazhe项目设计......
  • 天空卫士项目荣获“2024 IDC 中国20大杰出安全项目 ”奖项 ,实力见证安全守护
    9月11日,IDC在上海圆满举办安全风险管控峰会,并现场官宣“2024IDC中国20大杰出安全项目(CSO20)”和“2024IDC中国CSO名人堂(十大人物)”奖项名单。联通软研院申报的联通邮件系统安全合规建设项目被评为“2024IDC中国20大杰出安全项目(CSO20)”。峰会现场聚集了近200位意见......
  • 深入解析 MyBatis:从理论到项目实例
    深入解析MyBatis:从理论到项目实例目录MyBatis概述MyBatis项目结构及作用核心概念详解分页功能的实现与深入剖析动态SQL缓存机制详解与Spring集成常见问题与深入分析完整项目示例总结1.MyBatis概述MyBatis是一个轻量级的持久层框架,使用SQL查询语句来访问数据......
  • 解决 Node.js 项目中的 Yarn 安装错误
    在开发Node.js项目时,我们经常需要依赖于各种包来增强项目功能。Yarn是一个流行的包管理工具,由Facebook推出,旨在提供更快、更安全、更可靠的依赖管理。然而,如果你在尝试运行项目时遇到了关于Yarn未安装的错误,这可能会阻碍你的开发流程。本文将指导你如何通过简单的步......
  • 【HBuilderX-从下载到项目创建】编程初学者适用的HBuilderX开发环境(超详细的)下载安装
    简介:HBuilderX是一款由DCloud公司开发的集成开发环境(IDE),专为前端开发设计,同时也支持多平台应用开发。它支持HTML、CSS、JavaScript、Vue、React、Uni-app等多种编程语言和框架,具备代码编辑、调试、测试等功能,并且提供了丰富的插件生态系统以扩展其功能。“......
  • 系统集成项目管理工程师只看教材能过吗?
    今天和一位同学私聊发现,他竟然还在用旧版的系统集成项目管理工程师教程在学习,我当时瞬间石化我马上想到了桃花源记中的这句话:“问今是何世,乃不知有汉,无论魏晋。”也许是去年年底考过之后,就再也没有关注过系统集成项目管理工程师考试,也就不知道上半年教程改版的事情了...所以我可能......
  • 个人项目
    作业GitHub地址https://github.com/Miaomia0QAQ/miaomiaoPSP表格PSP2.1PersonalSoftwareProcessStages预估耗时(分钟)实际耗时(分钟)Planning计划255Estimate估计这个任务需要多少时间2020Development开发5060Analysis需求分析(包括学习新技......
  • 创建一个Django项目
    步骤1:创建Django项目和应用创建Django项目:bashdjango-adminstartprojectmyprojectcdmyproject创建Django应用:bashpythonmanage.pystartappmyapp安装并配置DjangoRestFramework(如果尚未安装):bashpipinstalldjangorestframework将myapp和rest_f......
  • 个人项目:论文查重
    这个作业属于哪个课程https://edu.cnblogs.com/campus/gdgy/CSGrade22-34这个作业要求在哪里https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13228这个作业的目标设计一个论文查重程序,了解软件开发流程gitHub项目地址https://github.com/Abaistudy......
  • 【智慧城市】新中地GIS开发实训项目:华农优秀学生学习成果展示(1)云游江城
    项目名称:云游江城项目功能简介地球自转城市建筑桥梁航线图导航系统景点查询美食查询资讯简报☑0基础可学  ☑助力就业 ☑优选赛道嘉薇Gis_17得7天试听课+海量GIS资料授课形式:线上/线下,直播+录播均可......