【codenet】代码相似度计算框架调研 -- 把内容与形式分开
首发于我的gitpages博客 https://helenawang.github.io/2018/10/10/代码相似度计算框架调研
代码相似度计算框架调研
研究现状
代码相似度计算是一个已有40年研究历史的问题了。它的应用范围广泛,主要包括代码抄袭检测[3]、软件维护中的相似代码查找等。
Whale[1]于1988年首次提出一个代码相似性检测的通用框架和步骤,将检测过程分为以下两个阶段:
代码格式转换 + 相似度确定
后来很多检测方法都参考这一框架,并将检测过程细分为四个部分:
预处理 -> 中间代码转换 -> 比较单元生成 -> 匹配算法
参考以上算法,我把代码相似度计算的技术按照如下三个指标分类
中间表示 + 比较单元 + 匹配算法
综述中[2][3]对中间表示的总结常常把这个中间表示的内容(承载了代码的什么信息)和形式(用了什么样的数据结构)混在一起。对此,我想做一个把内容与形式分离的总结。
先总结代码中有哪些信息可以被提取出来用于相似度计算,包括:
- 词法信息
- 语法信息
- 统计属性信息
- 控制流信息
- 数据流信息
这些信息在被具体定义并准确提取后,可以构成中间表示的内容。其中有些信息是具有一些天然的数据结构的。如下表所示:
| 信息 | 数据结构 | 具体表示实例 |
|---|---|---|
| 词法信息 | 线性结构 | Token流 |
| 语法信息 | 树形结构 | 抽象语法树(AST) |
| 统计属性信息 | 数值向量结构 | 保留字计数向量 |
| 控制流信息 | 有向图结构 | 控制流图(CFG) |
| 数据流信息 | 有向图结构 | 数据流图(DFG) |
学过数据结构的同学应该记得,课本[4]将数据结构的逻辑结构分为三类:线性结构(如向量、列表)、半线性结构(树)与非线性结构(图)。
以上三类结构并不是相互独立的关系,而是有层次的关系。我认为,它们按照复杂程度和转换层次,可以表示为如下的递进关系:
线性结构 -> 树结构 -> 图结构
其中,高层次的结构可以通过分解为若干低层次的结构,而低层次的结构也可以通过组合得到高层次的结构。具体来说,树结构可以通过遍历序列化为线性结构,而线性结构也可以通过合并节点转化为树结构或图结构。
基于这个不同结构之间可转化的特性,无论我们的中间表示多么复杂,都可以转化为低层次的结构来做匹配。我认为这也是论文[2]中提出的把“中间表示”与“比较单元”区分开来的原因。而对于不同结构的匹配算法,这其实是数据结构与算法领域研究的内容了。
除了计算复杂度上的差异,我认为,不同的中间表示对源代码结构的反映程度也是不同的。
更高层次的结构承载的代码结构信息更多,也更接近源程序的结构,但这些结构比较复杂,不利于计算机处理;相反,较低层次的结构更便于计算机处理,但包含的信息过于抽象笼统,不能反映代码结构的全貌。
针对我的特定业务场景找到最适配的中间表示与比较单位,是我近期的目标。
未来研究展望
代码相似度计算的一个主要应用是软件抄袭检测[3]。
综述[3]给出了软件抄袭检测领域的几个挑战和未来研究方向,包括:
- 部分抄袭问题
- 抄袭定位及证据生成
对于这两个方向,我认为可以尝试引入其他领域的方法论,比如信息检索和知识工程。具体怎样融合我会在后续的博客文章中介绍。
参考文献
[1] Whale, Geoff and University of New South Wales. Department of Computer Science Plague : plagiarism detection using program structure. School of Electrical Engineering and Computer Science, University of New South Wales, [Sydney], 1988.
[2] 熊浩,晏海华,郭涛,等. 代码相似性检测技术:研究综述[J]. 计算机科学, 2010, 37(8): 9-14, 76.
[3] 田振洲,刘烃,郑庆华,等. 软件抄袭检测研究综述[J]. 信息安全学报, 2016, 1(3): 52-76.
[4] 邓俊辉. 数据结构(C++语言语言版 第3版). 2013
第一次在博客园发布markdown格式的随笔,效果还不错。以后的博客会同步在gitpages和博客园上发布,欢迎关注。
【codenet】代码相似度计算框架调研 -- 把内容与形式分开的更多相关文章
- C#和SQL实现的字符串相似度计算代码分享
http://www.jb51.net/article/55941.htm C#实现: 复制代码 代码如下: #region 计算字符串相似度 /// <summary> ...
- 大数据计算框架Hadoop, Spark和MPI
转自:https://www.cnblogs.com/reed/p/7730338.html 今天做题,其中一道是 请简要描述一下Hadoop, Spark, MPI三种计算框架的特点以及分别适用于什 ...
- 海量数据相似度计算之simhash和海明距离
通过 采集系统 我们采集了大量文本数据,但是文本中有很多重复数据影响我们对于结果的分析.分析前我们需要对这些数据去除重复,如何选择和设计文本的去重算法?常见的有余弦夹角算法.欧式距离.Jaccard相 ...
- Storm分布式实时流计算框架相关技术总结
Storm分布式实时流计算框架相关技术总结 Storm作为一个开源的分布式实时流计算框架,其内部实现使用了一些常用的技术,这里是对这些技术及其在Storm中作用的概括介绍.以此为基础,后续再深入了解S ...
- 开源图计算框架GraphLab介绍
GraphLab介绍 GraphLab 是由CMU(卡内基梅隆大学)的Select 实验室在2010 年提出的一个基于图像处理模型的开源图计算框架.框架使用C++语言开发实现. 该框架是面向机器学习( ...
- 图像相似度计算之哈希值方法OpenCV实现
http://blog.csdn.net/fengbingchun/article/details/42153261 图像相似度计算之哈希值方法OpenCV实现 2014-12-25 21:27 29 ...
- LSF-SCNN:一种基于 CNN 的短文本表达模型及相似度计算的全新优化模型
欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 本篇文章是我在读期间,对自然语言处理中的文本相似度问题研究取得的一点小成果.如果你对自然语言处理 (natural language proc ...
- OpenCV:Mat元素访问方法、性能、代码复杂度以及安全性分析
欢迎转载,尊重原创,所以转载请注明出处: http://blog.csdn.net/bendanban/article/details/30527785 本文讲述了OpenCV中几种访问矩阵元素的方法 ...
- java算法(1)---余弦相似度计算字符串相似率
余弦相似度计算字符串相似率 功能需求:最近在做通过爬虫技术去爬取各大相关网站的新闻,储存到公司数据中.这里面就有一个技术点,就是如何保证你已爬取的新闻,再有相似的新闻 或者一样的新闻,那就不存储到数据 ...
随机推荐
- docker link 过时不再用了?那容器互联、服务发现怎么办?
在 1-2 年前,Docker 所有容器都连接于默认的桥接网络上,也就是很多老文章鼓捣的 docker0 桥接网卡.因此实际上默认情况下所有容器都是可以互联的,没有隔离,当然这样安全性不好.而服务发现 ...
- 9.5Django
2018-9-5 15:23:00 配置数据库信息 setting MySQLdb 不支持python3 创建表 pycharm 连接数据库 好强大的赶脚
- NuGet 安装EntityFramework5 历程
第一步:VS2012中 (据说VS2010还得安装一下NuGet)工具->库程序包管理器->程序包管理器控制台,打开控制台 Install-Package EntityFramework ...
- POJ-2777 Count Color(线段树,区间染色问题)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 40510 Accepted: 12215 Descrip ...
- POJ-1191-棋盘分割(动态规划)
棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 13593 Accepted: 4846 Description 将一个 ...
- HDU 4514 - 湫湫系列故事——设计风景线 - [并查集判无向图环][树形DP求树的直径]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...
- POJ 2342 - Anniversary party - [树形DP]
题目链接:http://poj.org/problem?id=2342 Description There is going to be a party to celebrate the 80-th ...
- JavaScript学习11.30
window.history:包含浏览器的历史,可以不时用window这个前缀history.back():加载历史列表的前一个URLhistory.forward():加载历史列表的后一个URLwi ...
- Git:上传GitHub项目操作步骤
git教程:git详解.gitbook #首次上传步骤 首先在工程文件位置处右键git bash here 本地创建ssh key $ ssh-keygen -t rsa -C "your_ ...
- C# 多线程 详解
[基础篇] 怎样创建一个线程 受托管的线程与Windows线程 前台线程与后台线程 名为BeginXXX和EndXXX的方法是做什么用的 异步和多线程有什么关联 [WinForm多线程编程篇] 多线程 ...