CN105912648A - 一种基于侧面信息的代码片段编程语言识别方法 - Google Patents
一种基于侧面信息的代码片段编程语言识别方法 Download PDFInfo
- 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
Links
- 238000000034 method Methods 0.000 title claims abstract description 66
- 239000013598 vector Substances 0.000 claims description 33
- 238000012549 training Methods 0.000 claims description 12
- 238000000605 extraction Methods 0.000 claims description 4
- 238000000354 decomposition reaction Methods 0.000 claims description 3
- 238000002474 experimental method Methods 0.000 abstract description 2
- 239000011159 matrix material Substances 0.000 description 17
- 239000010979 ruby Substances 0.000 description 15
- 229910001750 ruby Inorganic materials 0.000 description 15
- 239000012634 fragment Substances 0.000 description 8
- 238000012360 testing method Methods 0.000 description 6
- 230000006870 function Effects 0.000 description 3
- 238000013480 data collection Methods 0.000 description 2
- 238000010586 diagram Methods 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 238000011156 evaluation Methods 0.000 description 2
- 238000013459 approach Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000007423 decrease Effects 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 238000002372 labelling Methods 0.000 description 1
- 238000003058 natural language processing Methods 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 238000001303 quality assessment method Methods 0.000 description 1
- 238000013139 quantization Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/95—Retrieval from the web
- G06F16/953—Querying, e.g. by the use of web search engines
- G06F16/9535—Search customisation based on user profiles and personalisation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F18/00—Pattern recognition
- G06F18/20—Analysing
- G06F18/24—Classification techniques
- G06F18/241—Classification techniques relating to the classification model, e.g. parametric or non-parametric approaches
- G06F18/2415—Classification 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/24155—Bayesian 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),那么余弦距离
余弦距离的范围在[-1,1]之间,值越接近1,代表两个向量越接近;根据余弦距离从高到低排序,取前K个作为K-近邻集合;在K-近邻集合的基础上定义了计数向量,对任意第i个向量,有
其中,t代表标签的编号,Xj代表K-近邻集合中的向量,Yj(t)代表Xj对应的标签向量中标签t的值;
基于计数向量定义了标签概率值,公式如下,
其中T代表标签的总数,代表标签t属于新实例的概率事件,代表在新实例的K-近邻集合中恰好有Sr(t)个实例有标签t。
应用贝叶斯公式以及概率分解原则,得到
且
其中,而P(wt)的计算采用文本关键词抽取得到,其余各项通过最大后验估计计算得到;
利用以上的MATAR标签推荐技术对描述文本信息进行处理,然后进行标签推断补全,得到扩充之后的标签集合。
4.如权利要求1所述的基于侧面信息的代码片段编程语言识别方法,其特征在于,将标签集记作ST,编程语言类别集合记作SL;利用贝叶斯公式,推断代码c的编程语言L的概率为:
根据朴素贝叶斯假设,
采用最大后验概率估计,可以从训练数据得到P(L∈SL)和P(t∈ST|L∈SL);代入以上式子即可得到概率值,将概率值最大的编程语言作为最终的预测输出。
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)
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)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101281521A (zh) * | 2007-04-05 | 2008-10-08 | 中国科学院自动化研究所 | 一种基于多分类器融合的敏感网页过滤方法及*** |
-
2016
- 2016-04-08 CN CN201610218523.2A patent/CN105912648A/zh active Pending
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101281521A (zh) * | 2007-04-05 | 2008-10-08 | 中国科学院自动化研究所 | 一种基于多分类器融合的敏感网页过滤方法及*** |
Non-Patent Citations (2)
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)
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 |
---|---|---|
CN111444334B (zh) | 数据处理方法、文本识别方法、装置及计算机设备 | |
CN105912648A (zh) | 一种基于侧面信息的代码片段编程语言识别方法 | |
CN108363790A (zh) | 用于对评论进行评估的方法、装置、设备和存储介质 | |
CN105205124B (zh) | 一种基于随机特征子空间的半监督文本情感分类方法 | |
Olczyk | Bibliometric approach to tracking the concept of international competitiveness | |
CN106815194A (zh) | 模型训练方法及装置和关键词识别方法及装置 | |
CN104794212A (zh) | 基于用户评论文本的上下文情感分类方法及分类*** | |
CN106815192A (zh) | 模型训练方法及装置和语句情感识别方法及装置 | |
CN104408153A (zh) | 一种基于多粒度主题模型的短文本哈希学习方法 | |
CN105095444A (zh) | 信息获取方法和装置 | |
CN103823896A (zh) | 一种学科特征值算法及基于其的项目评审专家推荐算法 | |
CN103955451A (zh) | 一种判别短文本情感倾向性的方法 | |
CN113656805B (zh) | 一种面向多源漏洞信息的事件图谱自动构建方法及*** | |
CN110347701B (zh) | 一种面向实体检索查询的目标类型标识方法 | |
CN106202481A (zh) | 一种感知数据的评价方法和*** | |
CN112287197B (zh) | 动态记忆案件描述的涉案微博评论讽刺句检测方法 | |
CN105354327A (zh) | 一种基于大数据分析的接口api推荐方法及*** | |
CN111709244A (zh) | 一种用于矛盾纠纷事件因果关系识别的深度学习方法 | |
CN103544393B (zh) | 追踪儿童语言能力发展的方法 | |
CN105786898B (zh) | 一种领域本体的构建方法和装置 | |
CN103559199A (zh) | 网页信息抽取方法和装置 | |
CN107491536A (zh) | 一种试题校验方法、试题校验装置及电子设备 | |
CN102915358B (zh) | 导航网站实现方法和装置 | |
CN106202035A (zh) | 基于组合方法的越南语兼类词消歧方法 | |
US20070005541A1 (en) | Methods for Validation and Modeling of a Bayesian Network |
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 |