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

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

Info

Publication number
CN105912648A
CN105912648A CN201610218523.2A CN201610218523A CN105912648A CN 105912648 A CN105912648 A CN 105912648A CN 201610218523 A CN201610218523 A CN 201610218523A CN 105912648 A CN105912648 A CN 105912648A
Authority
CN
China
Prior art keywords
label
programming language
information
code snippet
code
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN201610218523.2A
Other languages
English (en)
Inventor
吕建
徐锋
李立成
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nanjing University
Original Assignee
Nanjing University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nanjing University filed Critical Nanjing University
Priority to CN201610218523.2A priority Critical patent/CN105912648A/zh
Publication of CN105912648A publication Critical patent/CN105912648A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/95Retrieval from the web
    • G06F16/953Querying, e.g. by the use of web search engines
    • G06F16/9535Search customisation based on user profiles and personalisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F18/00Pattern recognition
    • G06F18/20Analysing
    • G06F18/24Classification techniques
    • G06F18/241Classification techniques relating to the classification model, e.g. parametric or non-parametric approaches
    • G06F18/2415Classification techniques relating to the classification model, e.g. parametric or non-parametric approaches based on parametric or probabilistic models, e.g. based on likelihood ratio or false acceptance rate versus a false rejection rate
    • G06F18/24155Bayesian classification

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Databases & Information Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Life Sciences & Earth Sciences (AREA)
  • Probability & Statistics with Applications (AREA)
  • Artificial Intelligence (AREA)
  • Bioinformatics & Cheminformatics (AREA)
  • Bioinformatics & Computational Biology (AREA)
  • Computer Vision & Pattern Recognition (AREA)
  • Evolutionary Biology (AREA)
  • Evolutionary Computation (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了一种基于侧面信息的代码片段编程语言识别方法,通过对代码片段周围附属的侧面信息,如评论、描述、标签等的分析,构造更为合理的用于代码片段编程语言识别的分类器,从而较好地解决了传统的仅基于源代码本身的识别方法的准确率低下问题。本方法分为两个主要步骤,首先利用关键词增强的多标记学习技术对代码片段周围的文本信息和已知标签进行分析,扩充足够数量的与代码片段相关的标签,之后利用已知编程语言的代码片段和标签训练出贝叶斯分类器,用于对未知编程语言的代码片段进行编程语言识别。在收集于编程社区问答网站StackOverflow的真实数据集上的实验表明,该方法较传统的识别技术具有更高识别准确率。

Description

一种基于侧面信息的代码片段编程语言识别方法
技术领域
本发明涉及代码语言识别,特别是侧重于代码片段的编程语言识别。互联网上的代码片段周围往往有文本、标签等侧面信息,利用侧面信息,在文本分析技术的基础上,抽取特征,提炼为标签,基于标签训练贝叶斯模型,有效增强了对代码片段的编程语言识别能力,提高了代码片段编程语言识别系统的识别精度。
背景技术
近年来,随着互联网的快速发展,以及流行编程语言使用的全球化,博客、论坛、问答网站等等应用上出现程序的源代码变得越来越多,比如StackOverflow、CSDN等等。然而,大多数的博客、论坛以及在线问答网站上,源代码都是以片段形式存在的,这些网站对于特定的编程语言源代码的搜索能力很弱,原因是网站对代码片段的自动语言识别技术的准确率低下。
大部分的网站采用比较传统的基于文件的识别技术和基于完整代码的识别技术去猜测代码片段的语言类别,比如利用文件的后缀名、利用语言保留字等等。现有的基于语言保留字的技术有Google Code Prettify和Highlight这类采用启发式规则进行语法高亮进而达到语言类别识别目的,有SourceClassifier这类直接对源代码本身进行分类识别。然而成千上万的在线网站的代码片段,它们是以纯文本的形式出现的,没有文件后缀名,利用保留字达不到很好的效果,利用语法工具也无法对代码片段进行解析。但是代码周围存在很多侧面信息,比如代码片段周围的文字解释、周围的标签信息等等,这些信息能够被利用来辅助进行代码片段的语言识别。利用文本分类来进行代码片段的语言识别成为了解决该问题的有效途径。
为此,我们在基于文本、标签等侧面信息和贝叶斯技术的基础上提出了一种新的面向代码片段的编程语言识别方法——基于侧面信息的编程语言识别方法(SideInformation-based Programming Language Detecting Method,SIPLDM)。通过代码片段周围文字解释信息对标签信息进行推断补全,利用补全之后的标签信息训练识别模型,根据模型预测得到识别出的语言类别,从而较好地解决无法自动识别代码片段语言的问题。在编程社区问答网站StackOverflow的真实数据集上 的实验表明,该方法较传统的识别技术能获得更高准确率的识别效果。
发明内容
发明目的:由于传统的基于文件的识别技术和基于完整代码的识别技术难以高准确率地猜测代码片段的语言类别,利用语法工具也无法对代码片段进行解析,而代码周围存在很多侧面信息,比如代码片段周围的文字解释、周围的标签信息等等,这些信息能够被利用来辅助进行代码片段的语言识别。利用文本分类来进行代码片段的语言识别成为了解决该问题的有效途径。为此,本发明在文本、标签等侧面信息和贝叶斯技术的基础上提出了一种新的面向代码片段的编程语言识别方法,有效地解决了代码片段的识别准确率低下问题。
以编程社区问答网站StackOverflow为例,用户提出的每个问题帖子上几乎都附有代码片段,周围围绕着文字解释描述,描述代码片段的功能、遇到的bug、解决不了的问题等等,帖子下方或多或少会附带标签。我们认为直接对代码片段进行编程语言识别有困难,代码片段周围的侧面信息与代码片段非常相关,可以间接通过对侧面信息的分析来实现对代码片段的编程语言识别。在此假设的基础上,本发明首次提出一种基于侧面信息的代码片段编程语言识别方法,称之为SIPLDM。
利用侧面信息的方式有很多,比如单独利用标签信息、单独利用文字解释信息、将文字解释信息和标签信息组合利用等等。单独利用标签信息,数据规模较少,效率很高,但是信息量也会相对地小,识别出来的准确率就会低。单独利用文字解释信息,数据规模较大,信息量会比较多,但是也带来两个问题:一是噪声较多,影响识别准确率;二是数据量大,运行效率低。故我们考虑将两种信息结合起来利用。如果是简单地组合利用的话,带来的问题和单独利用文字信息一样,噪声多、效率低,准确率低。我们考虑到文本往往是不凝练的,是长度一般比较长,带有解释性质,如果能够将文本提炼为标签,那么表达的含义会更加明确,信息会更加丰富,对我们的语言类别判断的准确性会有更大帮助。故我们提出一种结合利用两种信息的框架。该框架分为两个步骤,首先利用文本关键词增强的多标记学习技术对代码片段周围的文本信息和已知标签进行分析,扩充足够数量的与代码片段相关的标签,之后利用已知编程语言的代码片段和标签训练出贝叶斯分类器,用于对未知编程语言的代码片段进行编程语言识别。
技术方案:一种基于侧面信息的代码片段编程语言识别方法,包括如下部分:
首先通过代码片段周围文字解释信息即代码片段的侧面信息对标签信息进行推断补全,即基于代码片段的侧面信息,将文本信息转换为数量较多、但含义更为明确的标签。之后基于已知代码片段的标签与编程语言类别,训练出专门用于编程语言类别判断的贝叶斯分类器;即利用补全之后的标签信息训练识别模型,根据模型预测得到识别出的语言类别。框架中涉及两个步骤,也就是两种基本技术。一是推断补全标签的技术,我们提出基于文本关键词增强的文本标签推荐技术MATAR;二是利用标签信息识别语言类别的技术,我们提出基于代码片段附属标签的编程语言识别技术SIPLDM-MATAR。下文我们会分别阐述这两种技术。
文本信息直接利用有两个缺点,一是数据量过大,效率不高;二是噪音较多,对识别准确率影响较大。故提出一种将文本信息提炼为标签的技术,叫做标签推荐技术MATAR。MATAR算法是基于多标记学习和文本关键词抽取的一个标签推荐算法。该算法基于一个基本发现:经过统计,有70%左右的标签会在对应的文本中出现。故将文本关键词抽取加入到多标记学习的框架中来提高标签推荐的准确率。我们将文本向量作为特征记作X,将标签向量记作Y。
该算法的基本思想是要计算每个标签对于新实例的概率值,根据概率值大小进行推荐。计算概率值成为这个算法的核心。算法首先定义了K-近邻集合N(Xi),采用余弦距离可以得到。
假设任意两个向量Xi=(a1,a2,…,am),Xj=(b1,b2,…,bm),向量的每一位代表文本中词出现的频率值,那么余弦距离
余弦距离的范围在[-1,1]之间,值越接近1,代表两个向量越接近。我们根据余弦距离从高到低排序,取前K个作为K-近邻集合。在K-近邻集合的基础上定义了计数向量,对任意第i个向量,有
其中,t代表标签的编号,Xj代表K-近邻集合中的向量,Yj(t)代表Xj对应的标签向量中标签t的值。
基于计数向量定义了标签概率值,公式如下,
其中T代表标签的总数,代表标签t属于新实例的概率事件,代表在新实例的K-近邻集合中恰好有Sr(t)个实例有标签t。
应用贝叶斯公式以及概率分解原则,我们得到
其中,代表标签t不属于新实例的概率事件。
我们观察上式,可以发现,只需要计算这两项就可以计算得到标签概率值。我们通过最大后验估计计算得到。对我们利用全概率公式,得到
其中,代表在标签t是关键词的条件下标签t是否属于新实例的概率,代表在标签t不是关键词的条件下标签t是否属于新实例的概率,P(wt)代表标签t是关键词的概率,代表标签t不是关键词的概率。所以 这两项同样通过最大后验估计计算得到。而P(wt)的计算我们采用文本关键词抽取的技术得到,这点是基于上文阐述的发现:有70%左右的标签会在对应的文本中出现。
我们对未知样本一一的计算标签概率值,然后将标签根据概率值排序,得到Top-N的标签作为我们提炼文本取得的标签集合。
利用以上的MATAR标签推荐技术对描述文本信息进行处理,然后进行标签推断补全,得到扩充之后的标签集合。接下来我们阐述基于代码片段附属标签的编程语言识别技术SIPLDM-MATAR。
我们将得到标签集记作ST,编程语言类别集合记作SL
我们利用贝叶斯公式,我们可推断代码c的编程语言L的概率为:
根据朴素贝叶斯假设,我们有:
采用最大后验概率估计,可以从训练数据得到P(L∈SL)和P(t∈ST|L∈SL)。代入以上式子即可得到概率值。我们将概率值最大的那个语言类别作为最终的预测输出。我们将这种技术称为SIPLDM-MATAR技术。
我们基于代码片段编程语言识别框架和以上两种基本技术实现了代码片段的编程语言识别系统。图2展现了基于侧面信息的代码片段编程语言识别系统架构图。
有益效果:与经典的基于文件后缀名的识别技术和基于完整代码的识别技术相比,本发明利用代码片段侧面信息,提出了一种有效识别代码片段编程语言的框架,且提出框架中的两种基本技术,并将其运用在编程社区问答网站StackOverflow中,提高了识别的准确率。
附图说明
图1为StackOverflow数据的几个样例;
图2为基于侧面信息的代码片段编程语言识别系统架构图;
图3为每种方法的整体准确率比较;
图4为每种方法对于每个类别的分类别准确率比较。
具体实施方式
下面结合具体实施例,进一步阐明本发明,应理解这些实施例仅用于说明本发明而不用于限制本发明的范围,在阅读了本发明之后,本领域技术人员对本发明的各种等价形式的修改均落于本申请所附权利要求所限定的范围。
实例一,本专利的SIPLDM方法的语言识别能力的量化评测
1、输入输出数据说明
我们把本发明的方法运用于编程社区问答网站StackOverflow的真实数据集上,输入是一组问题帖子数据,每个帖子带有代码片段、代码周围解释文字、代码周围标签以及语言类别,统计情况如表1所示:数据集有459393条帖子,按照不同的语言类别分为13个组,因为语言的流行程度不同每组的数量有多有少,平均每组有35337.92条帖子。图1列举了数据的几个样例。我们随机抽取了90% 的数据作为训练数据,剩下的10%的数据作为测试数据。
输出是本发明SIPLDM方法的语言识别质量评测指标。
2、模型学习、参数推断与预测过程
为了证明我们提出的基于侧面信息的代码片段编程语言识别框架有效,我们还实现了只利用标签信息的SIPLDM-Tag方法和只利用文本解释信息的SIPLDM-Text方法来作为比较。
我们简单介绍SIPLDM-Tag方法,将代码片段周围的标签集记作ST,将编程语言类别集合记作SL。依据以上说明并利用贝叶斯公式,我们可推断代码c的编程语言L的概率为:
根据朴素贝叶斯假设,采用最大后验概率估计,用统计的方式可以从训练数据得到P(L∈SL)和P(t∈ST|L∈SL)。代入以上式子即可得到概率值。对于这种方法,我们将每个帖子的代码周围的非语言类别的标签作为特征,依据上文所述的模型学习,通过最大后验估计得到模型的先验概率和后验概率,然后对于测试数据的未知样本推断所属的语言类别。
我们简单介绍SIPLDM-Text方法。对于这种方法,我们对每个帖子的文本进行处理,通过自然语言处理工具NLTK去除文本中的停词,对文本进行词根还原,去除低频词,然后利用词袋模型得到文本向量。向量的每一维代表这个词在文本中出现的次数。我们将文本向量作为特征记作X,将编程语言类别作为类记作L。由于是多分类问题,我们选择one-versus-rest策略来解决。每一个分类器的训练方式是一样的,故我们以训练一个分类器为例。文本向量仍为X,此时的类别只有两类±1,记作Y。我们使用最大间隔分类器MaximumMargin Classifier的思想来训练,目标函数为
等价于下式所示,
依据该优化目标函数进行梯度下降,得到13个分类器的参数ω,对于测试 数据的未知样本比较每个分类器的函数值,取值最大的那个作为语言类别。
对于SIPLDM-MATAR方法,同样,我们对每个帖子的文本进行处理,通过自然语言处理工具NLTK去除文本中的停词,对文本进行词根还原,去除低频词,然后利用词袋模型得到文本向量。向量的每一维代表这个词在文本中出现的次数。标签集合也转化为标签向量,向量的长度为标签总数,每一维用0或者1表示该标签是否属于该标签集合。我们将文本向量作为特征记作X,将标签向量记作Y,将编程语言类别作为类记作L。依据MATAR算法,训练得到所有的概率参数值。依据贝叶斯估计,训练得到先验概率和后验概率。
MATAR算法的基本思想是要计算每个标签对于新实例的概率值,根据概率值大小进行推荐。计算概率值成为这个算法的核心。算法首先定义了K-近邻集合N(Xi),采用余弦距离可以得到。
假设任意两个向量Xi=(a1,a2,…,am),Xj=(b1,b2,…,bm),向量的每一位代表文本中词出现的频率值,那么余弦距离
余弦距离的范围在[-1,1]之间,值越接近1,代表两个向量越接近。我们根据余弦距离从高到低排序,取前K个作为K-近邻集合。在K-近邻集合的基础上定义了计数向量,对任意第i个向量,有
其中,t代表标签的编号,Xj代表K-近邻集合中的向量,Yj(t)代表Xj对应的标签向量中标签t的值。
基于计数向量定义了标签概率值,公式如下,
其中T代表标签的总数,代表标签t属于新实例的概率事件,代表在新实例的K-近邻集合中恰好有Sr(t)个实例有标签t。
应用贝叶斯公式以及概率分解原则,我们得到
其中,代表标签t不属于新实例的概率事件。
我们观察上式,可以发现,只需要计算这两项就可以计算得到标签概率值。我们通过最大后验估计计算得到。对我们利用全概率公式,得到
其中,代表在标签t是关键词的条件下标签t是否属于新实例的概率,代表在标签t不是关键词的条件下标签t是否属于新实例的概率,P(wt)代表标签t是关键词的概率,代表标签t不是关键词的概率。所以 这两项同样通过最大后验估计计算得到。而P(wt)的计算我们采用文本关键词抽取的技术得到,这点是基于上文阐述的发现:有70%左右的标签会在对应的文本中出现。
我们对未知样本一一的计算标签概率值,然后将标签根据概率值排序,得到Top-N的标签作为我们提炼文本取得的标签集合。
利用以上的MATAR标签推荐技术对描述文本信息进行处理,然后进行标签推断补全,得到扩充之后的标签集合。接下来我们阐述基于代码片段附属标签的编程语言识别技术SIPLDM-MATAR。
我们将得到标签集记作ST,编程语言类别集合记作SL
我们利用贝叶斯公式,我们可推断代码c的编程语言L的概率为:
根据朴素贝叶斯假设,我们有:
采用最大后验概率估计,可以从训练数据得到P(L∈SL)和P(t∈ST|L∈SL)。代入以上式子即可得到概率值。我们将概率值最大的那个语言类别作为最终的预 测输出。
对于测试数据的未知样本,先采用MATAR算法推荐补全标签,我们现在是推荐10个标签,然后根据贝叶斯估计算法将这10个标签作为输入推断出语言类别。
3、输出结果
语言类别的识别本质上就是多分类问题,所以语言识别的质量就是分类的准确率,故评测指标采用的是多分类问题常用的混淆矩阵ConfusionMatrix、每个分类模型整体的准确率Total Accuracy(TA)以及每个分类模型对每个类别的准确率Each-ClassAccuracy(ECA)。
混淆矩阵在分类精度评价中,主要用于比较分类结果和实际值,可以把分类结果的精度显示在同一个矩阵里面。混淆矩阵的每一列代表了预测类别,每一列的总数表示预测为该类别的数据的数目;每一行代表了数据的真实类别,每一行的数据总数表示该类别的数据数目。矩阵中每个位置的数表示真实属于某类A被预测为某类B的数目。假设测试数据数目为N,预测语言类别和真实语言类别一致,我们就记Hit=1,否则为0,整体准确率的定义如下:
对每个类别的准确率就是
其中NL是真实类别为L的类别数。
我们将SIPLDM-MATAR方法和传统的方法(基于代码启发式高亮的方法CodeRelevance,基于代码保留字分类的方法TokenNaiveBayes、TokenMultinomialNaiveBayes、TokenBayesianNetwork,只利用单独信息的方法SIPLDM-Tag、SIPLDM-Text)进行了比较,计算了整体准确率,分类别准确率,展示了每个方法的混淆矩阵。
最终的结果如表2至表8和图3、图4所示,表2至表8展示了我们方法和对比方法的混淆矩阵,图3展现了每个模型的整体准确率,图4展现了每个模型的分类别准确率。
从实验结果可以发现,我们的方法与预想的一致,要好于传统的基于代码本身的四种方法。同时,我们的方法也好于利用单独信息的两种方法,说明我们提出的结合利用两种信息的框架确实有效果。观察混淆矩阵的时候,主对角线上的值越大越好,非主对角线上的值越接近0越好。我们观察对比方法的混淆矩阵,非主对角线上的值都比较的大,分类正确的和分类错误的差距体现的并不明显,甚至分类错误的数量比分类正确的数量更多。我们观察我们方法的混淆矩阵,非主对角线上的值都较小,很多已经趋向于0甚至已经是0,分类错误的数量较少,说明我们的方法区分度比较大,能够正确识别代码片段的编程语言。
我们继续看图3,最后一项是我们的方法。可以明显看到,我们的方法,相比于传统方法,整体准确率有很大的提高。举个例子,我们的方法对TokenNB有109.08%的提高,对TokenBN有29.08%的提高,对SIPLDM-Tag有21.03%的提高,对SIPLDM-Text有1.05%的提高。我们接着分析对于每个类别的准确率。图4的每个簇代表13个语言类别的一类,最后一项是我们的方法。可以看到,平均来说,我们的方法是每个簇里面准确率最高的,证明了我们方法对每个类别的识别是有整体性的,而不是偏向于某个类别。
通过对实验结果的分析,证明了本发明能准确地利用代码片段周围的侧面信息来判断代码片段所属的语言类别,证明了基于侧面信息的代码片段编程语言识别框架的有效性,且证明了基于侧面信息的代码片段编程语言识别系统在现实中能被合理的应用。
表1.代码片段所属语言的数据统计情况
编程语言类别 代码片段及侧面信息实例数
C# 102594
C++ 37921
C 14692
CSS 8747
HTML 7185
Java 67184
JavaScript 50351
Objective-C 24693
PHP 61659
Perl 6484
Python 35769
Ruby 15340
SQL 26774
总计 459393
表2.CodeRelevance方法的混淆矩阵
cs cpp c css html java js objective-c php perl python ruby sql classified as
3314 418 26 5 22 232 1114 16 203 70 1382 1 2037 cs
564 545 173 0 1 69 252 44 40 111 419 6 930 cpp
70 47 221 0 3 2 74 21 2 106 165 0 544 c
11 1 9 7 109 3 55 5 11 19 487 1 252 css
15 3 1 0 15 4 90 4 22 15 366 2 202 html
976 309 15 4 47 1630 779 8 233 58 1110 4 1907 java
111 11 0 6 50 12 2077 17 127 45 1520 8 2084 js
67 27 61 1 3 4 117 394 10 61 1345 34 1030 objective-c
132 7 1 1 27 13 653 29 1387 88 1712 19 2976 php
4 0 0 0 2 0 12 0 5 252 64 0 138 perl
148 4 5 3 14 5 60 9 17 49 1975 17 995 python
10 20 3 2 13 1 88 3 6 32 389 374 719 ruby
32 4 1 0 5 2 49 65 8 16 205 6 1803 sql
表3.TokenNB方法的混淆矩阵
cs cpp c css html java js objective-c php perl python ruby sql classified as
3901 88 50 84 85 369 325 2544 182 146 175 735 156 cs
252 1064 183 9 4 26 33 1201 19 46 129 161 27 cpp
23 56 418 5 2 13 16 573 8 22 53 55 11 c
7 3 2 349 39 1 204 257 16 5 18 66 3 css
30 2 0 54 54 6 239 225 41 7 14 66 1 html
1696 64 59 18 44 1989 206 1939 111 156 209 504 85 java
221 22 26 182 193 43 2935 1394 213 86 91 625 37 js
51 32 46 8 8 21 24 2720 27 33 60 95 29 objective-c
262 19 76 56 141 76 523 2289 2434 237 118 529 285 php
9 1 3 6 3 3 7 114 13 246 28 32 12 perl
48 17 36 21 18 75 70 1208 43 95 1402 216 52 python
35 9 10 8 9 17 62 521 23 47 69 816 34 ruby
72 7 7 7 4 27 17 760 53 33 31 279 899 sql
表4.TokenMNB方法的混淆矩阵
cs cpp c css html java js objective-c php perl python ruby sql classified as
6491 181 67 115 167 523 416 67 283 51 101 55 323 cs
350 2042 360 9 4 128 36 33 55 23 46 48 20 cpp
93 143 871 1 1 19 9 12 25 11 32 23 15 c
72 3 1 645 80 10 90 5 22 3 16 15 8 css
86 1 2 108 229 14 162 8 93 7 13 9 7 html
1611 136 89 35 135 4172 161 64 261 55 118 107 136 java
448 28 9 331 446 51 4188 28 338 32 58 71 40 js
350 71 94 11 13 70 51 2171 105 16 114 47 41 objective-c
579 36 62 83 280 139 506 49 4462 101 113 90 545 php
40 4 3 1 7 11 12 5 16 328 24 14 12 perl
317 42 25 28 31 95 77 33 160 86 2214 90 103 python
214 16 12 17 35 44 51 20 104 34 52 998 63 ruby
212 3 7 3 14 28 62 6 119 13 18 19 1692 sql
表5.TokenBN方法的混淆矩阵
cs cpp c css html java js objective-c php perl python ruby sql classified as
6225 96 26 114 214 383 339 613 251 25 125 150 279 cs
231 2053 277 5 8 52 21 295 60 8 58 77 9 cpp
21 96 862 1 4 9 9 147 19 10 36 33 8 c
9 0 0 613 134 3 83 74 14 1 14 21 4 css
28 1 1 87 274 11 166 53 60 7 18 28 5 html
1315 76 40 36 169 3998 122 518 230 39 180 258 99 java
169 13 6 208 413 32 4455 292 265 15 66 123 11 js
81 37 69 8 20 29 23 2678 75 6 70 47 11 objective-c
216 22 18 48 282 102 481 493 4563 55 129 161 475 php
11 1 4 2 6 2 11 32 19 328 34 19 8 perl
63 22 19 15 52 23 46 314 128 39 2365 143 72 python
45 9 4 8 43 18 45 175 75 22 82 1087 47 ruby
65 3 0 3 36 21 7 256 102 4 21 37 1641 sql
表6.SIPLDM-Tag方法的混淆矩阵
cs cpp c css html java js objective-c php perl python ruby sql classified as
7109 229 78 263 29 219 209 6 361 24 104 4 205 cs
201 2137 322 116 4 112 19 20 125 13 77 3 5 cpp
41 215 638 57 1 104 4 14 80 23 62 4 12 c
55 3 0 579 22 19 223 6 36 0 13 10 4 css
63 3 2 80 129 44 287 12 92 5 5 12 5 html
484 224 123 256 44 5066 115 13 458 32 167 16 82 java
308 70 22 248 107 134 4369 32 642 10 60 59 7 js
32 48 24 128 7 21 15 2777 59 1 31 4 7 objective-c
200 97 58 124 51 142 576 21 5293 59 120 28 276 php
26 24 18 30 3 17 4 0 146 160 33 9 7 perl
142 131 80 133 6 167 56 7 329 64 2120 18 48 python
29 33 18 65 5 33 38 2 126 34 48 1215 14 ruby
134 5 2 33 3 71 10 4 257 2 24 31 1620 sql
表7.SIPLDM-Text方法的混淆矩阵
cs cpp c css html java js objective-c php perl python ruby sql classified as
8091 120 29 14 25 153 140 15 82 7 22 3 139 cs
224 2581 222 2 3 54 10 10 16 5 16 3 8 cpp
58 190 905 1 0 27 6 19 23 7 11 3 5 c
33 4 1 748 24 14 106 4 28 1 4 2 1 css
80 0 0 55 231 34 234 2 74 4 11 10 4 html
576 66 17 8 15 6155 63 17 56 10 30 7 60 java
274 19 6 95 99 62 5199 13 217 5 21 47 11 js
75 29 18 3 7 32 20 2911 27 1 15 4 12 ob jective-c
168 20 11 9 29 57 222 7 6240 7 14 19 242 php
31 5 6 0 3 4 6 1 19 388 7 2 5 perl
107 24 16 4 5 22 24 2 31 7 3019 13 27 python
61 9 4 6 8 16 37 3 42 4 14 1426 30 ruby
124 5 3 2 2 41 4 4 95 3 13 15 1885 sql
表8.SIPLDM-MATAR方法的混淆矩阵
cs cpp c css html java js objective-c php perl python ruby sql classified as
8128 0 0 712 0 0 0 0 0 0 0 0 0 cs
15 2967 0 161 1 1 0 0 6 0 1 0 2 cpp
225 18 804 103 0 19 23 1 45 0 9 1 7 c
152 1 0 709 4 6 43 0 33 0 14 1 7 css
206 2 0 48 309 11 73 1 79 0 3 1 6 html
0 0 1 556 0 6522 0 0 0 0 0 0 1 java
7 0 0 278 0 1 5776 2 3 0 0 0 1 js
222 12 5 360 0 28 24 2410 72 1 4 0 16 objective-c
0 1 0 450 0 2 0 0 6591 0 0 0 1 php
203 8 0 25 2 19 16 0 69 91 32 0 12 perl
32 1 0 214 5 4 19 2 26 0 2990 0 8 python
354 14 0 151 7 25 54 2 108 1 16 905 23 ruby
42 3 1 107 5 11 12 0 20 0 1 0 1994 sql

Claims (4)

1.一种基于侧面信息的代码片段编程语言识别方法,其特征在于,包括如下部分:
首先通过代码片段周围文字解释信息即代码片段的侧面信息对标签信息进行推断补全,
然后利用补全之后的标签信息训练识别模型,根据模型预测得到识别出的语言类别;
方法实现设计两个技术:一是推断补全标签的技术,即基于文本关键词增强的文本标签推荐技术MATAR;二是利用标签信息识别语言类别的技术,即基于代码片段附属标签的编程语言识别技术SIPLDM-MATAR。
2.如权利要求1所述的基于侧面信息的代码片段编程语言识别方法,其特征在于,所述代码片段的侧面信息包括评论、描述、标签信息。
3.如权利要求1所述的基于侧面信息的代码片段编程语言识别方法,其特征在于,将文本向量作为特征记作X,将标签向量记作Y;
MATAR算法的基本思想是要计算每个标签对于新实例的概率值,根据概率值大小进行推荐,计算概率值成为这个算法的核心;算法首先定义了K-近邻集合N(Xi),采用余弦距离可以得到;
假设任意两个向量Xi=(a1,a2,…,am),Xj=(b1,b2,…,bm),那么余弦距离
c o s θ = Σ i = 1 m ( a i × b i ) Σ i = 1 m a i 2 × Σ i = 1 m b i 2
余弦距离的范围在[-1,1]之间,值越接近1,代表两个向量越接近;根据余弦距离从高到低排序,取前K个作为K-近邻集合;在K-近邻集合的基础上定义了计数向量,对任意第i个向量,有
S i ( t ) = Σ X j ∈ N ( X i ) Y j ( t )
其中,t代表标签的编号,Xj代表K-近邻集合中的向量,Yj(t)代表Xj对应的标签向量中标签t的值;
基于计数向量定义了标签概率值,公式如下,
P r ( t ) = P ( U 1 t | V S r ( t ) t ) , t = 1 , 2 , ... , T
其中T代表标签的总数,代表标签t属于新实例的概率事件,代表在新实例的K-近邻集合中恰好有Sr(t)个实例有标签t。
应用贝叶斯公式以及概率分解原则,得到
P r ( t ) = P ( U 1 t ) P ( V S r ( t ) t | U 1 t ) P ( V S r ( t ) t ) = P ( U 1 t ) P ( V S r ( t ) t | U 1 t ) Σ g ∈ { 0 , 1 } P ( U g t ) P ( V S r ( t ) t | U g t )
P ( U g t ) = P ( U g t | w t ) P ( w t ) + P ( U g t | w t ‾ ) P ( w t ‾ )
其中,而P(wt)的计算采用文本关键词抽取得到,其余各项通过最大后验估计计算得到;
利用以上的MATAR标签推荐技术对描述文本信息进行处理,然后进行标签推断补全,得到扩充之后的标签集合。
4.如权利要求1所述的基于侧面信息的代码片段编程语言识别方法,其特征在于,将标签集记作ST,编程语言类别集合记作SL;利用贝叶斯公式,推断代码c的编程语言L的概率为:
P ( L ∈ S L | S T ) = P ( L ) P ( S T | L ) P ( S T ) = P ( L ) P ( S T | L ) Σ l ∈ S L P ( l ) P ( S T | l )
根据朴素贝叶斯假设,
P ( S T | L ) = Π t ∈ S T P ( t | L )
采用最大后验概率估计,可以从训练数据得到P(L∈SL)和P(t∈ST|L∈SL);代入以上式子即可得到概率值,将概率值最大的编程语言作为最终的预测输出。
CN201610218523.2A 2016-04-08 2016-04-08 一种基于侧面信息的代码片段编程语言识别方法 Pending CN105912648A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201610218523.2A CN105912648A (zh) 2016-04-08 2016-04-08 一种基于侧面信息的代码片段编程语言识别方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201610218523.2A CN105912648A (zh) 2016-04-08 2016-04-08 一种基于侧面信息的代码片段编程语言识别方法

Publications (1)

Publication Number Publication Date
CN105912648A true CN105912648A (zh) 2016-08-31

Family

ID=56745835

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201610218523.2A Pending CN105912648A (zh) 2016-04-08 2016-04-08 一种基于侧面信息的代码片段编程语言识别方法

Country Status (1)

Country Link
CN (1) CN105912648A (zh)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107239564A (zh) * 2017-06-13 2017-10-10 南京大学 一种基于监督主题模型的文本标签推荐方法
CN108228791A (zh) * 2017-12-29 2018-06-29 北京奇虎科技有限公司 数据的识别方法及装置
CN111324715A (zh) * 2020-02-18 2020-06-23 北京百度网讯科技有限公司 问答机器人的生成方法和装置
CN112394984A (zh) * 2020-10-29 2021-02-23 北京软安科技有限公司 一种固件代码分析方法及装置
CN117235727A (zh) * 2023-11-09 2023-12-15 中孚安全技术有限公司 基于大型语言模型的WebShell识别方法和系统

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101281521A (zh) * 2007-04-05 2008-10-08 中国科学院自动化研究所 一种基于多分类器融合的敏感网页过滤方法及系统

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101281521A (zh) * 2007-04-05 2008-10-08 中国科学院自动化研究所 一种基于多分类器融合的敏感网页过滤方法及系统

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
KHASNABISH J.N等: ""Detecting Programming Language from Source Code Using Bayesian Learning Techniques"", 《MACHINE LEARNING AND DATA MINING IN PATTERN RECOGNITION. SPRINGER, PP》 *
LICHENG LI等: "Machine Learning and Data Mining in Pattern Recognition. Springer, pp", 《PROC. WEB TECHNOLOGIES AND APPLICATIONS: 17TH ASIA-PACIFIC WEB CONFERENCE (APWEB)》 *

Cited By (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107239564A (zh) * 2017-06-13 2017-10-10 南京大学 一种基于监督主题模型的文本标签推荐方法
CN107239564B (zh) * 2017-06-13 2021-03-19 南京大学 一种基于监督主题模型的文本标签推荐方法
CN108228791A (zh) * 2017-12-29 2018-06-29 北京奇虎科技有限公司 数据的识别方法及装置
CN111324715A (zh) * 2020-02-18 2020-06-23 北京百度网讯科技有限公司 问答机器人的生成方法和装置
CN111324715B (zh) * 2020-02-18 2023-07-14 北京百度网讯科技有限公司 问答机器人的生成方法和装置
CN112394984A (zh) * 2020-10-29 2021-02-23 北京软安科技有限公司 一种固件代码分析方法及装置
CN112394984B (zh) * 2020-10-29 2022-09-30 北京智联安行科技有限公司 一种固件代码分析方法及装置
CN117235727A (zh) * 2023-11-09 2023-12-15 中孚安全技术有限公司 基于大型语言模型的WebShell识别方法和系统
CN117235727B (zh) * 2023-11-09 2024-02-23 中孚安全技术有限公司 基于大型语言模型的WebShell识别方法和系统

Similar Documents

Publication Publication Date Title
CN108021616B (zh) 一种基于循环神经网络的社区问答专家推荐方法
CN111444334B (zh) 数据处理方法、文本识别方法、装置及计算机设备
CN105912648A (zh) 一种基于侧面信息的代码片段编程语言识别方法
CN103593352B (zh) 一种海量数据清洗方法及装置
CN106776711A (zh) 一种基于深度学习的中文医学知识图谱构建方法
CN105205124B (zh) 一种基于随机特征子空间的半监督文本情感分类方法
CN106663125A (zh) 提问句生成装置以及计算机程序
CN110377696A (zh) 一种商品期货新闻舆情分析方法及系统
Olczyk Bibliometric approach to tracking the concept of international competitiveness
CN106815194A (zh) 模型训练方法及装置和关键词识别方法及装置
CN106815192A (zh) 模型训练方法及装置和语句情感识别方法及装置
CN105095444A (zh) 信息获取方法和装置
CN103823896A (zh) 一种学科特征值算法及基于其的项目评审专家推荐算法
CN103955451A (zh) 一种判别短文本情感倾向性的方法
CN106202481A (zh) 一种感知数据的评价方法和系统
CN105354327A (zh) 一种基于大数据分析的接口api推荐方法及系统
CN105786898B (zh) 一种领域本体的构建方法和装置
CN111709244A (zh) 一种用于矛盾纠纷事件因果关系识别的深度学习方法
CN107491536A (zh) 一种试题校验方法、试题校验装置及电子设备
CN105609116A (zh) 一种语音情感维度区域的自动识别方法
CN102915358B (zh) 导航网站实现方法和装置
Isljamovic et al. Predicting students’ academic performance using artificial neural network: a case study from faculty of organizational sciences
CN103020286B (zh) 基于排名网站的互联网排行榜抓取系统
Yuliansyah et al. Predicting students graduate on time using C4. 5 algorithm
CN114580418A (zh) 一种警察体能训练知识图谱系统

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
RJ01 Rejection of invention patent application after publication
RJ01 Rejection of invention patent application after publication

Application publication date: 20160831