一种基于侧面信息的代码片段编程语言识别方法

文档序号:10553002阅读:171来源:国知局
一种基于侧面信息的代码片段编程语言识别方法
【专利摘要】本发明公开了一种基于侧面信息的代码片段编程语言识别方法,通过对代码片段周围附属的侧面信息,如评论、描述、标签等的分析,构造更为合理的用于代码片段编程语言识别的分类器,从而较好地解决了传统的仅基于源代码本身的识别方法的准确率低下问题。本方法分为两个主要步骤,首先利用关键词增强的多标记学习技术对代码片段周围的文本信息和已知标签进行分析,扩充足够数量的与代码片段相关的标签,之后利用已知编程语言的代码片段和标签训练出贝叶斯分类器,用于对未知编程语言的代码片段进行编程语言识别。在收集于编程社区问答网站StackOverflow的真实数据集上的实验表明,该方法较传统的识别技术具有更高识别准确率。
【专利说明】
一种基于侧面信息的代码片段编程语言识别方法
技术领域
[0001] 本发明涉及代码语言识别,特别是侧重于代码片段的编程语言识别。互联网上的 代码片段周围往往有文本、标签等侧面信息,利用侧面信息,在文本分析技术的基础上,抽 取特征,提炼为标签,基于标签训练贝叶斯模型,有效增强了对代码片段的编程语言识别能 力,提高了代码片段编程语言识别系统的识别精度。
【背景技术】
[0002] 近年来,随着互联网的快速发展,以及流行编程语言使用的全球化,博客、论坛、问 答网站等等应用上出现程序的源代码变得越来越多,比如StackOverflow、CSDN等等。然而, 大多数的博客、论坛以及在线问答网站上,源代码都是以片段形式存在的,这些网站对于特 定的编程语言源代码的搜索能力很弱,原因是网站对代码片段的自动语言识别技术的准确 率低下。
[0003] 大部分的网站采用比较传统的基于文件的识别技术和基于完整代码的识别技术 去猜测代码片段的语言类别,比如利用文件的后缀名、利用语言保留字等等。现有的基于语 言保留字的技术有Google Code Prettify和Highlight这类采用启发式规则进行语法高亮 进而达到语言类别识别目的,有SourceClassifier这类直接对源代码本身进行分类识别。 然而成千上万的在线网站的代码片段,它们是以纯文本的形式出现的,没有文件后缀名,利 用保留字达不到很好的效果,利用语法工具也无法对代码片段进行解析。但是代码周围存 在很多侧面信息,比如代码片段周围的文字解释、周围的标签信息等等,这些信息能够被利 用来辅助进行代码片段的语言识别。利用文本分类来进行代码片段的语言识别成为了解决 该问题的有效途径。
[0004]为此,我们在基于文本、标签等侧面信息和贝叶斯技术的基础上提出了一种新的 面向代码片段的编程语言识别方法一一基于侧面信息的编程语言识别方法(Side Information-based Programming Language Detecting Method,SIPLDM)〇通过代码片段 周围文字解释信息对标签信息进行推断补全,利用补全之后的标签信息训练识别模型,根 据模型预测得到识别出的语言类别,从而较好地解决无法自动识别代码片段语言的问题。 在编程社区问答网站StackOverflow的真实数据集上的实验表明,该方法较传统的识别技 术能获得更高准确率的识别效果。

【发明内容】

[0005]发明目的:由于传统的基于文件的识别技术和基于完整代码的识别技术难以高准 确率地猜测代码片段的语言类别,利用语法工具也无法对代码片段进行解析,而代码周围 存在很多侧面信息,比如代码片段周围的文字解释、周围的标签信息等等,这些信息能够被 利用来辅助进行代码片段的语言识别。利用文本分类来进行代码片段的语言识别成为了解 决该问题的有效途径。为此,本发明在文本、标签等侧面信息和贝叶斯技术的基础上提出了 一种新的面向代码片段的编程语言识别方法,有效地解决了代码片段的识别准确率低下问 题。
[0006] 以编程社区问答网站StackOverflow为例,用户提出的每个问题帖子上几乎都附 有代码片段,周围围绕着文字解释描述,描述代码片段的功能、遇到的bug、解决不了的问题 等等,帖子下方或多或少会附带标签。我们认为直接对代码片段进行编程语言识别有困难, 代码片段周围的侧面信息与代码片段非常相关,可以间接通过对侧面信息的分析来实现对 代码片段的编程语言识别。在此假设的基础上,本发明首次提出一种基于侧面信息的代码 片段编程语言识别方法,称之为SIPLDM。
[0007] 利用侧面信息的方式有很多,比如单独利用标签信息、单独利用文字解释信息、将 文字解释信息和标签信息组合利用等等。单独利用标签信息,数据规模较少,效率很高,但 是信息量也会相对地小,识别出来的准确率就会低。单独利用文字解释信息,数据规模较 大,信息量会比较多,但是也带来两个问题:一是噪声较多,影响识别准确率;二是数据量 大,运行效率低。故我们考虑将两种信息结合起来利用。如果是简单地组合利用的话,带来 的问题和单独利用文字信息一样,噪声多、效率低,准确率低。我们考虑到文本往往是不凝 练的,是长度一般比较长,带有解释性质,如果能够将文本提炼为标签,那么表达的含义会 更加明确,信息会更加丰富,对我们的语言类别判断的准确性会有更大帮助。故我们提出一 种结合利用两种信息的框架。该框架分为两个步骤,首先利用文本关键词增强的多标记学 习技术对代码片段周围的文本信息和已知标签进行分析,扩充足够数量的与代码片段相关 的标签,之后利用已知编程语言的代码片段和标签训练出贝叶斯分类器,用于对未知编程 语言的代码片段进行编程语言识别。
[0008] 技术方案:一种基于侧面信息的代码片段编程语言识别方法,包括如下部分:
[0009] 首先通过代码片段周围文字解释信息即代码片段的侧面信息对标签信息进行推 断补全,即基于代码片段的侧面信息,将文本信息转换为数量较多、但含义更为明确的标 签。之后基于已知代码片段的标签与编程语言类别,训练出专门用于编程语言类别判断的 贝叶斯分类器;即利用补全之后的标签信息训练识别模型,根据模型预测得到识别出的语 言类别。框架中涉及两个步骤,也就是两种基本技术。一是推断补全标签的技术,我们提出 基于文本关键词增强的文本标签推荐技术MATAR;二是利用标签信息识别语言类别的技术, 我们提出基于代码片段附属标签的编程语言识别技术SIPLDM-MATAR。下文我们会分别阐述 这两种技术。
[0010] 文本信息直接利用有两个缺点,一是数据量过大,效率不高;二是噪音较多,对识 别准确率影响较大。故提出一种将文本信息提炼为标签的技术,叫做标签推荐技术MATAR。 MATAR算法是基于多标记学习和文本关键词抽取的一个标签推荐算法。该算法基于一个基 本发现:经过统计,有70%左右的标签会在对应的文本中出现。故将文本关键词抽取加入到 多标记学习的框架中来提高标签推荐的准确率。我们将文本向量作为特征记作X,将标签向 量记作Y。
[0011] 该算法的基本思想是要计算每个标签对于新实例的概率值,根据概率值大小进行 推荐。计算概率值成为这个算法的核心。算法首先定义了 K-近邻集合N(Xi),采用余弦距离 可以得到。
[0012]假设任意两个向量Xi = (ai,a2,"_,am),Xj=(bi,b2,"_,bm),向量的每一位代表文本 中词出现的频率值,那么余弦距离
[0014]余弦距离的范围在[-1,1]之间,值越接近1,代表两个向量越接近。我们根据余弦 距离从高到低排序,取前K个作为K-近邻集合。在K-近邻集合的基础上定义了计数向量,对 任意第i个向量,有
[0016] 其中,t代表标签的编号,Xj代表K-近邻集合中的向量,Yj (t)代表Xj对应的标签向 量中标签t的值。
[0017] 基于计数向量定义了标签概率值,公式如下,
[0018] F^(t) = P(lJ^ |V^r(t)), t = 1,2, -, T
[0019] 其中T代表标签的总数,啤代表标签t属于新实例的概率事件,代表在新实例 的K-近邻集合中恰好有Sr (t)个实例有标签t。
[0020] 应用贝叶斯公式以及概率分解原则,我们得到
[0022] 其中,炖代表标签t不属于新实例的概率事件。
[0023] 我们观察上式,可以发现,只需要计算p〇J0和这两项就可以计算得到标 签概率值。P(;V(|U0我们通过最大后验估计计算得到。对P(;U0,我们利用全概率公式,得到
[0024] P(U^) - P(Ug|wt)P(wt) -i- PfUgjw^Pfw1)
[0025] 其中,PfU^wt;)代表在标签t是关键词的条件下标签t是否属于新实例的概率, 代表在标签t不是关键词的条件下标签t是否属于新实例的概率,P( Wt)代表标签t 是关键词的概率,Pp;)代表标签t不是关键词的概率。所以= 1 _ PCwO^Uljwt) 和这两项同样通过最大后验估计计算得到。而P(wt)的计算我们采用文本关键词 抽取的技术得到,这点是基于上文阐述的发现:有70%左右的标签会在对应的文本中出现。
[0026] 我们对未知样本一一的计算标签概率值,然后将标签根据概率值排序,得到Top-N 的标签作为我们提炼文本取得的标签集合。
[0027]利用以上的MATAR标签推荐技术对描述文本信息进行处理,然后进行标签推断补 全,得到扩充之后的标签集合。接下来我们阐述基于代码片段附属标签的编程语言识别技 术SIPLDM-MATAR。
[0028]我们将得到标签集记作St,编程语言类别集合记作Sl。
[0029]我们利用贝叶斯公式,我们可推断代码c的编程语言L的概率为:
[0031]根据朴素贝叶斯假设,我们有:
[0033] 米用最大后验概率估计,可以从训练数据得到P(LG Sl)和P(t G St | LG Sl)。代入以 上式子即可得到概率值。我们将概率值最大的那个语言类别作为最终的预测输出。我们将 这种技术称为SIPLDM-MATAR技术。
[0034] 我们基于代码片段编程语言识别框架和以上两种基本技术实现了代码片段的编 程语言识别系统。图2展现了基于侧面信息的代码片段编程语言识别系统架构图。
[0035] 有益效果:与经典的基于文件后缀名的识别技术和基于完整代码的识别技术相 比,本发明利用代码片段侧面信息,提出了一种有效识别代码片段编程语言的框架,且提出 框架中的两种基本技术,并将其运用在编程社区问答网站StackOverflow中,提高了识别的 准确率。
【附图说明】
[0036] 图1为StackOverf low数据的几个样例;
[0037] 图2为基于侧面信息的代码片段编程语言识别系统架构图;
[0038] 图3为每种方法的整体准确率比较;
[0039] 图4为每种方法对于每个类别的分类别准确率比较。
【具体实施方式】
[0040] 下面结合具体实施例,进一步阐明本发明,应理解这些实施例仅用于说明本发明 而不用于限制本发明的范围,在阅读了本发明之后,本领域技术人员对本发明的各种等价 形式的修改均落于本申请所附权利要求所限定的范围。
[0041 ]实例一,本专利的SIPLDM方法的语言识别能力的量化评测 [0042] 1、输入输出数据说明
[0043]我们把本发明的方法运用于编程社区问答网站StackOverflow的真实数据集上, 输入是一组问题帖子数据,每个帖子带有代码片段、代码周围解释文字、代码周围标签以及 语言类别,统计情况如表1所示:数据集有459393条帖子,按照不同的语言类别分为13个组, 因为语言的流行程度不同每组的数量有多有少,平均每组有35337.92条帖子。图1列举了数 据的几个样例。我们随机抽取了90%的数据作为训练数据,剩下的10%的数据作为测试数 据。
[0044]输出是本发明SIPLDM方法的语言识别质量评测指标。
[0045] 2、模型学习、参数推断与预测过程
[0046]为了证明我们提出的基于侧面信息的代码片段编程语言识别框架有效,我们还实 现了只利用标签信息的SIPLDM-Tag方法和只利用文本解释信息的SIPLDM-Text方法来作为 比较。
[0047]我们简单介绍SIPLDM-Tag方法,将代码片段周围的标签集记作ST,将编程语言类 别集合记作Sl。依据以上说明并利用贝叶斯公式,我们可推断代码c的编程语言L的概率为:
[0049] 根据朴素贝叶斯假设,P(ST|L) = nteSTP(t|L)。采用最大后验概率估计,用统计的 方式可以从训练数据得到P(LgSl)和P(teST|LGSL)。代入以上式子即可得到概率值。对于 这种方法,我们将每个帖子的代码周围的非语言类别的标签作为特征,依据上文所述的模 型学习,通过最大后验估计得到模型的先验概率和后验概率,然后对于测试数据的未知样 本推断所属的语言类别。
[0050] 我们简单介绍SIPLDM-Text方法。对于这种方法,我们对每个帖子的文本进行处 理,通过自然语言处理工具NLTK去除文本中的停词,对文本进行词根还原,去除低频词,然 后利用词袋模型得到文本向量。向量的每一维代表这个词在文本中出现的次数。我们将文 本向量作为特征记作X,将编程语言类别作为类记作L。由于是多分类问题,我们选择one-versus-rest策略来解决。每一个分类器的训练方式是一样的,故我们以训练一个分类器为 例。文本向量仍为X,此时的类别只有两类±1,记作Y。我们使用最大间隔分类器Maximum Margin Classifier的思想来训练,目标函数为
[0052]等价于下式所示,
[0054]依据该优化目标函数进行梯度下降,得到13个分类器的参数co,对于测试数据的 未知样本比较每个分类器的函数值,取值最大的那个作为语言类别。
[0055] 对于SIPLDM-MATAR方法,同样,我们对每个帖子的文本进行处理,通过自然语言处 理工具NLTK去除文本中的停词,对文本进行词根还原,去除低频词,然后利用词袋模型得到 文本向量。向量的每一维代表这个词在文本中出现的次数。标签集合也转化为标签向量,向 量的长度为标签总数,每一维用〇或者1表示该标签是否属于该标签集合。我们将文本向量 作为特征记作X,将标签向量记作Y,将编程语言类别作为类记作L。依据MATAR算法,训练得 到所有的概率参数值。依据贝叶斯估计,训练得到先验概率和后验概率。
[0056] MATAR算法的基本思想是要计算每个标签对于新实例的概率值,根据概率值大小 进行推荐。计算概率值成为这个算法的核心。算法首先定义了 K-近邻集合N(X〇,采用余弦 距离可以得到。
[0057]假设任意两个向量Xi = (ai,a2,'",am),Xj=(bi,b2,'",bm),向量的每一位代表文本 中词出现的频率值,那么余弦距离
[0059]余弦距离的范围在[_1,1]之间,值越接近1,代表两个向量越接近。我们根据余弦 距离从高到低排序,取前K个作为K-近邻集合。在K-近邻集合的基础上定义了计数向量,对 任意第i个向量,有
[0060] .Si(t) = X Y)⑴ Xj-eNCXj)
[0061 ]其中,t代表标签的编号,Xj代表K-近邻集合中的向量,Yj (t)代表Xj对应的标签向 量中标签t的值。
[0062] 基于计数向量定义了标签概率值,公式如下,
[0063] Pr(t) = P(Ui |v|r⑴),t = 1,2,…,T
[0064] 其中T代表标签的总数,坷代表标签t属于新实例的概率事件,代表在新实例 的K-近邻集合中恰好有Sr (t)个实例有标签t。
[0065] 应用贝叶斯公式以及概率分解原则,我们得到
[0067] 其中,I玲代表标签t不属于新实例的概率事件。
[0068] 我们观察上式,可以发现,只需要计算p(uy和【?|叫)这两项就可以计算得到标 签概率值。P(碎吨)我们通过最大后验估计计算得到。对P(U0,我们利用全概率公式,得到
[0069] p(ufy = p(u;\|wt)p(wt) + p(u^j^')prx)
[0070] 其中,代表在标签t是关键词的条件下标签t是否属于新实例的概率, P(U^v^_;)代表在标签t不是关键词的条件下标签t是否属于新实例的概率,P(Wt)代表标签t 是关键词的概率,p(^)代表标签〖不是关键词的概率。所以二1 - p(wthp0#lwt) 和这两项同样通过最大后验估计计算得到。而P(wt)的计算我们采用文本关键词 抽取的技术得到,这点是基于上文阐述的发现:有70%左右的标签会在对应的文本中出现。 [0071]我们对未知样本一一的计算标签概率值,然后将标签根据概率值排序,得到Top-N 的标签作为我们提炼文本取得的标签集合。
[0072]利用以上的MATAR标签推荐技术对描述文本信息进行处理,然后进行标签推断补 全,得到扩充之后的标签集合。接下来我们阐述基于代码片段附属标签的编程语言识别技 术SIPLDM-MATAR。
[0073] 我们将得到标签集记作St,编程语言类别集合记作Sl。
[0074] 我们利用贝叶斯公式,我们可推断代码c的编程语言L的概率为:
[0076] 根据朴素贝叶斯假设,我们有: 标签,然后根据贝叶斯估计算法将这10个标签作为输入推断出语言类别。
[0080] 3、输出结果
[0081] 语言类别的识别本质上就是多分类问题,所以语言识别的质量就是分类的准确 率,故评测指标采用的是多分类问题常用的混淆矩阵ConfusionMatrix、每个分类模型整体 的准确率Total Accuracy (TA)以及每个分类模型对每个类别的准确率Each-Class Accuracy(ECA)〇
[0082] 混淆矩阵在分类精度评价中,主要用于比较分类结果和实际值,可以把分类结果 的精度显示在同一个矩阵里面。混淆矩阵的每一列代表了预测类别,每一列的总数表示预 测为该类别的数据的数目;每一行代表了数据的真实类别,每一行的数据总数表示该类别 的数据数目。矩阵中每个位置的数表示真实属于某类A被预测为某类B的数目。假设测试数 据数目为N,预测语言类别和真实语言类别一致,我们就记Hit=l,否则为0,整体准确率的 定义如下:
[0084]对每个类别的准确率就是
[0086]其中Nl是真实类别为L的类别数。
[0087] 我们将S I P L D M - M A T A R方法和传统的方法(基于代码启发式高亮的方法 CodeRelevance,基于代码保留字分类的方法TokenNaiveBayes、 TokenMultinomialNaiveBayes、TokenBayesianNetwork,只利用单独信息的方法SIPLDM-Tag、SIPLDM-Text)进行了比较,计算了整体准确率,分类别准确率,展示了每个方法的混淆 矩阵。
[0088] 最终的结果如表2至表8和图3、图4所示,表2至表8展示了我们方法和对比方法的 混淆矩阵,图3展现了每个模型的整体准确率,图4展现了每个模型的分类别准确率。
[0089] 从实验结果可以发现,我们的方法与预想的一致,要好于传统的基于代码本身的 四种方法。同时,我们的方法也好于利用单独信息的两种方法,说明我们提出的结合利用两 种信息的框架确实有效果。观察混淆矩阵的时候,主对角线上的值越大越好,非主对角线上 的值越接近〇越好。我们观察对比方法的混淆矩阵,非主对角线上的值都比较的大,分类正 确的和分类错误的差距体现的并不明显,甚至分类错误的数量比分类正确的数量更多。我 们观察我们方法的混淆矩阵,非主对角线上的值都较小,很多已经趋向于〇甚至已经是〇,分 类错误的数量较少,说明我们的方法区分度比较大,能够正确识别代码片段的编程语言。
[0090] 我们继续看图3,最后一项是我们的方法。可以明显看到,我们的方法,相比于传统 方法,整体准确率有很大的提高。举个例子,我们的方法对TokenNB有109.08%的提高,对 TokenBN 有 29.08%的提高,对51?0^-1&8有21.03%的提高,对51?0^-161七有1.05%的提 高。我们接着分析对于每个类别的准确率。图4的每个簇代表13个语言类别的一类,最后一 项是我们的方法。可以看到,平均来说,我们的方法是每个簇里面准确率最高的,证明了我 们方法对每个类别的识别是有整体性的,而不是偏向于某个类别。
[0091] 通过对实验结果的分析,证明了本发明能准确地利用代码片段周围的侧面信息来 判断代码片段所属的语言类别,证明了基于侧面信息的代码片段编程语言识别框架的有效 性,且证明了基于侧面信息的代码片段编程语言识别系统在现实中能被合理的应用。
[0092] 表1.代码片段所属语言的数据统计情况


【主权项】
1. 一种基于侧面信息的代码片段编程语言识别方法,其特征在于,包括如下部分: 首先通过代码片段周围文字解释信息即代码片段的侧面信息对标签信息进行推断补 全, 然后利用补全之后的标签信息训练识别模型,根据模型预测得到识别出的语言类别; 方法实现设计两个技术:一是推断补全标签的技术,即基于文本关键词增强的文本标 签推荐技术MATAR;二是利用标签信息识别语言类别的技术,即基于代码片段附属标签的编 程语言识别技术SIPLDM-MTAR。2. 如权利要求1所述的基于侧面信息的代码片段编程语言识别方法,其特征在于,所述 代码片段的侧面信息包括评论、描述、标签信息。3. 如权利要求1所述的基于侧面信息的代码片段编程语言识别方法,其特征在于,将文 本向量作为特征记作X,将标签向量记作Y; MATAR算法的基本思想是要计算每个标签对于新实例的概率值,根据概率值大小进行 推荐,计算概率值成为运个算法的核屯、;算法首先定义了 K-近邻集合N(Xi),采用余弦距离 可W得到; 假设任意两个向量Xi=(ai,a2,…,am),X.i=(bi,b2,…,bm),那么余弦距离余弦距离的范围在[- 度近;根据余弦距离从高 到低排序,取前K个作为K 7计数向量,对任意第i个 向量,有 其中,t代表标签的编巧,Xj代巧K-化邻集曾甲的同重,Yj U)代表Xj对应的标签向量中 标签t的值; 基于计数向量定义了标签概率值,公式如下,其中T代表标签的总数,巧代表标签t属于新实例的概率事件,呜1.^3代表在新实例的K- 近邻集合中恰好有Sr (t)个实例有标签t。 应用贝叶斯公式W及概率分解原则,得到 且其中,而P(Wt)的计算采用文本关键词抽取得到,其余各项通过最大后验估计计算得到; 利用W上的MATA財示签推荐技术对描述文本信息进行处理,然后进行标签推断补全,得 到扩充之后的标签集合。4.如权利要求1所述的基于侧面信息的代码片段编程语言识别方法,其特征在于,将标 签集记作St,编程语言类别集合记作Sl;利用贝叶斯公式,推断代码C的编程语言L的概率为: 根据朴素贝叶期采用最大后验概率估计,可W从训练数据得到P(LGSl)和PUGStI LGSl);代入W上式 子即可得到概率值,将概率值最大的编程语言作为最终的预测输出。
【文档编号】G06F17/30GK105912648SQ201610218523
【公开日】2016年8月31日
【申请日】2016年4月8日
【发明人】吕建, 徐锋, 李立成
【申请人】南京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1