文件相似度比对工具的设计与实现
一、背景与目标
我们业务维护了两个代码仓库,两端的代码很多都是一个平台先开发好,几乎直接copy到另一个仓库。于是产生了一个技术需求,实现这两个仓库代码复用。在技术预研阶段,需要统计早先copy的代码文件有多少,提前预估双端代码的大概可复用文件比例。早先我是利用Beyond Compare 手动遍历文件,依据“肉眼”去对比的,花了大概一天的时间,而且估计的数据比较粗略。考虑到这个工作以后还会碰到,而且这个过程就是纯粹机械的文件“相似度”对比,所以期望这个过程可以采取自动化脚本完成。大家都经历过论文查重,主流的有PaperPass、中国知网等;不同的是,我要做的是一个批量文件的对比,当然它的每一步其实是两个文件之间的相似度比较。之前有人推荐我用simian等工具,很短时间就能完成对比,可以设定相似代码行数的阈值,并且可以输出相似代码。我觉得这款工具的确是好,但是毕竟是第三方工具,算法不可控,还收费。而且我们重复的不仅有代码,还有重复图片。
二、算法的设计
大家在学校论文查重时,应该用过至少听说够PaperPass。PaperPass文件比对是以句子为单位检测的,它的对比过程大致是文本预处理、语义挖掘、深度识别、全局扫描等,如下:
当然,具体还会涉及文字颜色、大小的比对,比较复杂。我们来看一下PaperPass的处理大致过程:t是要对比的文章,T是PP的论文库,S是重复计数器,M是分割后的t的string数据大小:
然后开始遍历查找,具体操作状态如下:
查找到则S=S+1,否则,t数组继续遍历,
直到t数据遍历完,循环结束。
那么t文章的相似比例为2/3。
但是这样的算法对于代码比对来说,有下面两个问题:
1、PP是以句子为单位检测的,但是代码不是简单的句子分隔,如下:
2、既然代码文件不能按语句分隔,该如下结合代码copy场景找到最佳的分隔单位呢?是按空格、还是按行呢?
实际copy常常会因人习惯不同,增加些个人习惯的换行,尤其“左大括号换行派”与不换行派的互相copy代码的时候有一定的误差;我们来看看按空格分隔,分隔后的数组示意图如下:
根据这个分隔原理,我用ruby脚本憝了这个算法,并验证了下算法的情况,如下:
三、工具的原理
上面内容已经基本验证了按空格分隔的效果,根据PaperPass的过程,写了一个完整的工具,进行扫描:
我可以根据工具进行灵活性调整,筛选出相似比超过90%的文件或者其他。
四、算法的不足与改进
这个小工具的目的本身就是为了方便自己使用,出发点也没打算做的很牛逼,没有花过多时间去改进它,但是还是有很多方案可以改进这个算法提升比对效率的:
1、由于算法的比对以及遍历工程目录下的文件时,使用的都是“暴力”循环遍历,时间复杂度较高,我最高比对库代码达到7000个.m文件,脚本执行了一天没跑完;后来执行时,去除了不必要的底层pod代码库,只对比了业务层的代码,发现不到2小时,就跑完了。
2、中间也提过,如果你不想那么精确地比对,可以按单行进行分隔,或者按多行为分隔单位。
3、原子算法的复杂度是O(n2)的,如果再想着优化,就要优化原子算法本身了。对于T1文件与T2文件的比对过程中,如果发现T1中的某一行在T2中找不到重复的(这种情况应该是较大概率的),可以对T1针对这一行进行一次去重处理O(n);如果这一行在T2中找到了,去重处理并且计数器S累加。如果想把复杂度降到O(nlogn),那么恐怕要采取二叉树这样的数据结构去处理T2了。
4、针对代码文件,我们发现前面几行文本往往都是很相似的,这些文本的对比会影响代码内容的相似度的精确性,例如:
我们也可以直接过滤掉这些代码段。
文件相似度比对工具的设计与实现相关推荐
- C++ 项目实战:跨平台的文件与视频压缩解压工具的设计与实现
C++实战:跨平台文件与视频压缩解压工具的设计与实现 一.引言(Introduction) 1.1 项目背景与目标 1.2 技术选型:C++.FFmpeg.libarchive.libzip.Qt C ...
- kettle工具的设计原则
Kettle工具在设计初,就考虑到了一些设计原则.这些原则里借鉴了以前使用过的其他一些ETL工具积累下的经验和教训. 易于开发:作为数据仓库和ETL开发者,你只想把时间用在创建BI解决方案上.任何用于 ...
- 推荐一些能提升工作幸福度的小工具
盘点那些真正能提升工作幸福度的小工具,都是我日常开发中经常使用的工具.包括4个维度:软件.终端.VScode插件.Chrome插件. 软件篇 Alfred 官网:www.alfredapp.com/ ...
- 盘点那些真正能提升工作幸福度的小工具
盘点那些真正能提升工作幸福度的小工具,都是我日常开发中经常使用的工具.包括4个维度:软件.终端.VScode插件.Chrome插件. 软件篇 Alfred 官网: www.alfredapp.com/ ...
- 远程管理linux系统工具,远程管理Linux系统工具的设计与实现Linux013
一种远程管理Linux系统工具的设计与实现 摘 要 现在,Linux已经是应用比较广泛的操作系统之一,在其系统中有很多的服务.为了实现远程配置和管理Linux中的各种服务,需要有一种远程管理Linu ...
- 【C 语言】文件操作 ( 配置文件读写 | 业务逻辑 | 接口设计 )
文章目录 一.配置文件读写 业务逻辑 二.接口设计 1.写文件接口 2.读文件接口 3.修改文件接口 4.接口合并 一.配置文件读写 业务逻辑 开发一个系统 , 在命令行中实现如下功能 , 通过命令操 ...
- 查找重复文件_重复文件查找和磁盘整理工具:Tidy Up
为大家带来一款实用的重复文件查找和磁盘整理工具,Tidy Up 5 for Mac可以用来快速查找重复文件并整理硬盘,tidy up 5 mac特别版会根据文件的种类组织分离找到项目,非常的好用. t ...
- 一个图形数据维护工具架构设计
一个图形数据维护工具架构设计 1.背景 近期负责一个GIS矢量化项目,工程中涉及图形数据.GIS业务数据的关联存储和管理.为弥补图形矢量化软件在附属属性管理方面的局限性,采用两套数据库系统进行图-数关 ...
- 基于FME的地形图图面压盖检查工具的设计与制作
基于FME的地形图图面压盖检查工具的设计与制作 程丽萍 (1,2.昆明市测绘研究院,云南 昆明650051) The Design and Implementation of FME-based T ...
- 【高级Java开发】类QQ聊天工具的设计与实现(代码已上传)
1.要求 类QQ聊天工具的设计与实现,要求如下: 用户可注册并通过密码录登. 用户可通过查找添加自己的好友. 用户可通过好友列表选择好友并与之对话. 需实现聊天记录查看功能. 界面美观大方,交互设计尽 ...
最新文章
- 关于物理像素/逻辑像素
- 美团悄悄进入企业早餐,其战略目的为高频带低频?
- python tcp通信如何实现多人聊天,Python实现多用户全双工聊天(一对一),python多用户,多用户全双工聊天简陋...
- 间歇性掉帧卡顿_电脑卡顿问题靠它解决,我只能帮你到这儿了
- drupal 使用补丁_使用Drupal解决大学需求
- H264/SVC Temporal Scalability
- python操作文件open_【转】PYTHON open/文件操作
- java框架的作用_java三大框架的作用介绍
- 三极管的基础知识(下)①
- linux filesystem not open,建立物理卷报错Can't open /dev/sdb5 exclusively. Mounted filesystem的问题解决过程记录...
- Python 中文数字对照表 输入一个数字,转换成中文数字。比如:1234567890 -> 壹贰叁肆伍陆柒捌玖零。【简单易懂,代码可以直接运行】
- 对于幸福不是悖论的证明,在现代对于幸福探寻
- 《wireshark》怎么抓包
- fastadmin 百度编辑器无法上传图片的几种原因和修改方法
- IC设计之CDC(跨时钟域)问题
- codewars练习(javascript)-2021/2/18
- 戴尔笔记本提示“您已插入低瓦数电源适配器 在bios设置中可以禁用此警告”
- 人工智能+智能运维解决方案_如何建立对人工智能解决方案的信任
- 基恩士KV7500,KV8000轴控制FB模板,直接可以拿来用,使基恩士编程也随心所欲
- Lanczos 重采样