【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)---余弦相似度计算字符串相似率
余弦相似度计算字符串相似率 功能需求:最近在做通过爬虫技术去爬取各大相关网站的新闻,储存到公司数据中.这里面就有一个技术点,就是如何保证你已爬取的新闻,再有相似的新闻 或者一样的新闻,那就不存储到数据 ...
随机推荐
- 2015.8.2js-19(完美运动框架)
/*完美运动框架*/ //1.先清除定时期,2,获取样式,如果是opacity则单独解决,3,定义速度,4,定义当前值是否到达目的地,5,判断当前值是否到达目的地,6运动基本,如果是opacity f ...
- Unity3D研究院之将UI的点击事件渗透下去(转)
转自 http://www.xuanyusong.com/archives/4241 处理UI还有3D模型的点击推荐使用UGUI的这套事件系统,因为使用起来比较简洁,不需要自己用代码来发送射线,并且可 ...
- Shell while
while commanddo ...done c=0while [ $c -lt 5 ]do c='expr $c+1' echo $cdone
- Mongodb 副本集 数据同步简单测试
副本集的搭建,请见 CENTOS6.5 虚拟机MONGODB创建副本集 接下来将简单说明下副本集之间的数据同步. 1.首先,进入primary节点 MOGO_PATH/bin/mongo -por ...
- 8.28 jQuery
2018-8-28 18:25:27 jQuery 参考:https://www.cnblogs.com/liwenzhou/p/8178806.html 2018-8-28 19:53:19 还是讲 ...
- POJ-1975 Median Weight Bead(Floyed)
Median Weight Bead Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3162 Accepted: 1630 De ...
- hdu1754 I Hate It【线段树】
很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老 ...
- POJ 1180 - Batch Scheduling - [斜率DP]
题目链接:http://poj.org/problem?id=1180 Description There is a sequence of N jobs to be processed on one ...
- MySQL在linux上的二进制安装方法
建组.建用户: [root@dbking mysql]# groupadd mysql [root@dbking mysql]# useradd -g mysql mysql 解压安装程序: [roo ...
- hadoop2.x编译安装
Build instructions for Hadoop (Hadoop 编译安装,参考hadoop源码包中BUILDING.txt文档) ----------------------------- ...