这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/?page=2
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/homework/13136
这个作业的目标 采用软件开发的流程实现一个论文查重程序
本次作业的仓库地址 https://github.com/GatsbyChenJk/GatsbyChenJk/tree/main/3122004856

1. 设计流程

1.1 开发环境

操作系统:Windows11,x64
IDE:Visual Studio
语言:C++11
变量命名规则:大驼峰

1.2 总体设计

根据作业要求,要开发的项目为论文查重程序,因此要实现的功能可简单概括为:

基于C++的面向对象编程,将不同的功能模块封装为类,每个类实现特定的功能,接着通过主程序调用各个类的方法实现论文查重功能。
根据实现的功能,可设计两个类,分别为文件管理类文本分析类,由于还要对实现的功能进行单元测试,故还要设计单元测试类
则要实现的功能为:

  • 文件管理类:文件的读取和写入
  • 文本分析类:对读取的文本进行分词处理->分词处理后计算逆文本频率并用向量表示->通过向量计算文本相似度
  • 单元测试类:测试文件管理类和文本分析类的功能是否正常
  • 主程序:调用文件管理类读取待对比文本->调用文本分析类处理文本信息并获得向量,并计算文本相似度->将相似度计算结果写入文件

1.3 具体设计

1.3.1 文件读取类的设计:

使用C++标准库的文件读写接口实现

1.3.2 文本分析类的设计

文本分析类的设计思路:
文本分析类要实现的功能可以概括为以下三个方面:

  • 文本分词处理
  • 计算逆文本频率
  • 计算文本相似度
    1)对于文本分词处理,我通过封装cppjieba分词库中已经实现好的分词功能进行实现,其功能可简单理解为用预训练的分类模型对输入的文本进行分词,并将分割好的词汇存入c++STL容器vector中
    2)对于逆文本频率的计算,实现思路为将分词处理后得到的vector通过另一种C++STL容器map来统计vector中各种词语出现的频率,即词频向量(TF),并通过分词处理后得到的vector构造语料库,接着通过公式

    计算逆文档频率(IDF)
    3)对于相似度的计算,我参考了机器学习中计算相似度的几种计算方法,其中包括欧氏距离、曼哈顿距离、余弦相似度等,其中欧氏距离和余弦相似度的计算公式为:
    欧氏距离:

    对于欧氏距离的相似度计算,公式为:

    对于余弦相似度的计算,公式为:

    由于随着文本量的增大,构造的IDF向量维度会不断增大,导致使用欧氏距离计算的结果会极其不合理,故采用余弦相似度进行计算

1.3.3 接口测试类的设计

对于接口测试类,我设计了两个接口分别测试了文件管理类和文本分析类的接口

1.3.4 主程序的设计

  • 首先调用文件管理类的读取文件接口将文本读取用string类型变量存储
  • 接着通过文本分析类的接口对文本进行分词处理并计算其逆文本频率,以向量存储
  • 然后通过调用文本分析类的接口计算不同文本的向量得到相似度
  • 最后通过文件管理类的接口将相似度结果写入文件

2. 性能测试


因为已经使用static关键字将设计的类设为静态类避免内存管理出现问题,所以觉得没什么可以优化的了

3.单元测试

测试用例:

    //测试代码
	//样例1
	string TestOrig1 = "今天是星期天,天气晴,今天晚上我要去看电影。";
	string TestCopy1 = "今天是周天,天气晴朗,我晚上要去看电影。";	
	//样例2
	string TestOrig2 = "《Starfield》是由载誉无数、曾为大家带来《The Elder Scrolls V: Skyrim》和《Fallout 4》的Bethesda Game Studios睽违25年所打造的第一个全新宇宙";
	string TestCopy2 = "PC 版Grand Theft Auto V 能够以超越 4K 的最高分辨率和 60 帧每秒的帧率,为您呈现屡获殊荣、令人痴迷的游戏世界——洛桑托斯市和布雷恩郡";
	//样例3
	string TestOrig3 = "掸掸喷灯和锤子上的灰尘 - 有新的工作给你,该去干活儿了。来到新的海岸边,这里有世界上数一数二的、超大型的船舶墓地,拆解掉大型的船舶部件,把成吨的价值不菲的钢铁资源都收集起来。撸起袖子加把劲儿,回到你的商业帝国来吧。";
	string TestCopy3 = "不经历艰险,怎能成就非凡旅程。在《Outward》中,极冷的夜晚和感染的伤口与潜伏在黑暗中的捕食者一样危险。玩家可以选择单枪匹马,或是和他人合作,探索欧鲁拉的广袤世界。Definitive Edition包含了两个DLC和对生命质量的优化。";
	//样例4
	string TestOrig4 = "《天国:拯救》是一个能让你沉浸于在神圣罗马帝国的史诗冒险的剧情向、开放世界角色扮演游戏。与入侵的敌人战斗以为你死去的双亲报仇。完成能改变剧情走向的任务,并做好每个能影响剧情的选择。";
	string TestCopy4 = "艾尔登法环是以正统黑暗奇幻世界为舞台的动作RPG游戏。 走进辽阔的场景与地下迷宫探索未知,挑战困难重重的险境,享受克服困境时的成就感吧。 不仅如此,登场角色之间的利害关系谱成的群像剧,更是不容错过。";
	//样例5
	string TestOrig5 = "我们将卡牌游戏与Roguelike游戏融为一体,制作出了这款最棒的单机组牌游戏。打造出独一无二的牌组、遇见无数离奇的生物、发现威力强大的遗物、去屠戮这座高塔吧!";
	string TestCopy5 = "你被派到了一座孤岛上,寻找一位失踪的亿万富翁,结果却发现自己深陷被食人生物占领的炼狱之地。你需要制作工具和武器、建造房屋,倾尽全力生存下去,无论独自一人还是与朋友一起——一切尽在这款新推出的开放世界恐怖生存模拟游戏中。";
	//样例6
	string TestOrig6 = "Red Dead Redemption 2 已荣获超过 175 项年度游戏奖项且获得超过 250 个满分评价,游戏中述说亚瑟·摩根和声名狼藉的范德林德帮派的传奇故事,体验在 19 世纪的最后岁月里横跨美国的亡命之旅。除此之外,还可免费享受 Red Dead 在线模式中与众多玩家共享的逼真世界。";
	string TestCopy6 = "《The Outer Worlds》是一款荣获奖项的单人第一人称科幻RPG游戏,由Obsidian Entertainment和Private Division联手打造。当你探索一个太空殖民地时,你所选定的角色将决定这个玩家驱动的故事接下来将会如何展开。在这个殖民地的企业方程中,你是计划外的未知变量。";
	//样例7
	string TestOrig7 = "知名游戏制作人小岛秀夫为大家带来了一种颠覆传统的体验,现在这种体验在此导演剪辑版的最终版本中加以扩展。玩家将扮演山姆·布里奇斯(Sam Bridges),你的任务就是将这残破的美国中最后的幸存者们联合起来,为人类带来希望。你能一步一步地将这破碎的世界重新连接起来吗?";
	string TestCopy7 = "在世界上最盛大的汽车嘉年华上,不断变化的赛季改变着一切。单枪匹马或者与其他人组队,在一个共享开放世界中探索美丽而富有历史气息的英国。收集、改装和驾驶超过 450 辆车辆。尽情竞速、表演特技、创造和探索:选择您专属的方式来成为地平线中的超级巨星。";
	//样例8
	string TestOrig8 = "Valve 携 VR 大作《半衰期:爱莉克斯》重磅回归《半衰期》系列。 这个战斗故事发生在《半衰期》和《半衰期2》之间,是与邪恶的外星种族联合军之间看似毫无胜算的较量。 扮演爱莉克斯·凡斯,人类存活下去的唯一希望。";
	string TestCopy8 = "新的生命之地。狩猎, 就是本能! 「Monster Hunter: World」中,玩家可以体验终极的狩猎生活,活用新建构的世界中各种各样的地形与生态环境享受狩猎的惊喜与兴奋。";
	//样例9
	string TestOrig9 = "在充满异域风情的广大世界中开启全新旅程,征服强大的敌人,解开极具挑战性的难题,在一次次任务中,揭开奥里的命运。";
	string TestCopy9 = "在广阔的世界中收集神奇的生物“帕鲁”,派他们进行战斗、建造、做农活,工业生产等,这是一款支持多人游戏模式的全新开放世界生存制作游戏。";
	//样例10	
	string TestOrig10 = "您的“终极地平线冒险”即将开启!驾驶世界名车,探索墨西哥充满活力的户外景色,享受无拘无束又充满乐趣的驾驶体验。在终极地平线拉力赛中征服富有挑战的塞拉努埃瓦。需拥有《极限竞速:地平线 5》才能体验,扩充内容需另购。";
	string TestCopy10 = "与逾2200万名玩家一同游玩这款屡获殊荣的在线多人角色扮演游戏,在历久弥新的上古卷轴世界体验无限冒险。战斗、制造、争夺或探索,并结合不同种类的装备和能力,打造你个人专属的游戏风格。游戏无须购买订阅服务即可畅玩。";


	Tester::TestForEssayAnalysist(TestOrig1, TestCopy1);
	Tester::TestForEssayAnalysist(TestOrig2, TestCopy2);
	Tester::TestForEssayAnalysist(TestOrig3, TestCopy3);
	Tester::TestForEssayAnalysist(TestOrig4, TestCopy4);
	Tester::TestForEssayAnalysist(TestOrig5, TestCopy5);
	Tester::TestForEssayAnalysist(TestOrig6, TestCopy6);
	Tester::TestForEssayAnalysist(TestOrig7, TestCopy7);
	Tester::TestForEssayAnalysist(TestOrig8, TestCopy8);
	Tester::TestForEssayAnalysist(TestOrig9, TestCopy9);
	Tester::TestForEssayAnalysist(TestOrig10, TestCopy10);

	return 0;

测试结果:

4. 错误处理

为避免输入的路径为空,在主程序中添加处理

if (argc == 1)
    return 0;	

5. 各模块开发消耗时间(PSP表格)

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 10 5
· Estimate · 估计这个任务需要多少时间 180 120
Development 开发 390 320
· Analysis · 需求分析 (包括学习新技术) 30 30
· Design Spec · 生成设计文档 15 10
· Design Review · 设计复审 5 5
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 5 5
· Design · 具体设计 45 30
· Coding · 具体编码 240 180
· Code Review · 代码复审 30 45
· Test · 测试(自我测试,修改代码,提交修改) 20 15
Reporting 报告 70 50
· Test Repor · 测试报告 45 30
· Size Measurement · 计算工作量 10 10
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 15 10
· 合计 650 495
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。