一种面向K12编程的Python程序代码快速搜索方法技术

技术编号:22000024 阅读:31 留言:0更新日期:2019-08-31 05:20
本发明专利技术为解决K12编程面临的快速查找相似代码、通过阅读代码进行编程学习的特殊问题,提供了一种字符串、Token串和语法树相结合的Python代码快速搜索技术,通过对用户查询代码和库中代码进行词法分析和语法分析,将字面(字符串级)、词法和语法特征相结合,计算查询代码与库中代码的相关度,据此产生检索的排序结果。本发明专利技术首先利用Python词法分析器和语法分析器,将用户查询和库中代码转化成Token序列和语法树,从中提取特征,构建后缀树索引和倒排索引,以提高检索速度。用于排序的打分函数融合了基于向量空间模型的语法树相似度、Token词袋相似度、Token串相似度和字面(字符串)相似度,融合的权重基于用户对检索结果的反馈自动学习得到。

A Fast Search Method for Python Program Code Oriented to K12 Programming

【技术实现步骤摘要】
一种面向K12编程的Python程序代码快速搜索方法
本专利技术属于计算机
,具体是一种面向K12编程的Python程序代码快速搜索技术。
技术介绍
随着互联网时代的发展,越来越多的人开始接触计算机技术,越来越多的人开始接受计算机基础教育,其中就包括计算机编程技术,为解决K12编程面临的快速查找相似代码、通过阅读代码进行编程学习的特殊问题,目前已有的代码检索技术大多基于字符级别的相似度匹配,忽略了代码本身的结构信息以及变量名、函数名带来的影响,故能够对代码进行高效准确的检索是一个亟待解决的研究问题。本专利技术为解决K12编程面临的快速查找相似代码、通过阅读代码进行编程学习的特殊问题,提供了一种字符串、Token串和语法树相结合的Python代码快速搜索技术,通过对用户查询代码和库中代码进行词法分析和语法分析,将字面(字符串级)、词法和语法特征相结合,计算查询代码与库中代码的相关度,据此产生检索的排序结果。
技术实现思路
为解决K12编程面临的快速查找相似代码、通过阅读代码进行编程学习的特殊问题,提供了一种代码相似度计算方法,该方法结合了三个层面的代码相似度,即字符串级别的精确匹配、Token串级别的相似度匹配、代码语法树级别的相似度匹配。为提升查询效率,需定期更新数据库里已有代码的索引,每次更新由以下几个预处理步骤得到代码的特征并依据特征构建索引:步骤1:考虑字符串级别的精确匹配,对原始代码仅做简单的预处理,得到由代码原始字符构成的字符串。步骤2:考虑Token串级别的相似性匹配,对代码进行词法分析,得到原始代码对应的Token字符串。步骤3:考虑语法树级别的相似性匹配,对代码进行语法分析,得到每段代码对应的语法树,再对语法树进行特征提取,得到每个语法树对应的特征串。步骤4:将代码原始字符串、Token字符串、语法树特征字符串结合起来,使用ElasticSearch构建索引。所述步骤1考虑字符串级别的精确匹配,对原始代码仅做简单的预处理,得到由代码原始字符构成的字符串。该步直接对源代码进行预处理,然后进行字符串的精确匹配即可。预处理过程忽略代码中的注释语句,具体做法如下:将代码中的所有字符,根据人工定义的“符号替换词典”进行替换,并加上“punc_”前缀,所有字母组成的单词加上“char_”前缀,然后用空格隔开组成一个长字符串。将查询代码和数据库中代码转换之后的字符串进行精确匹配,相同则返回,不同则不返回。所述步骤2考虑Token串级别的相似性匹配,对代码进行词法分析,得到原始代码对应的Token字符串。该步重要的是对代码进行词法分析。词法分析(lexicalanalysis)是计算机科学中将字符序列转换为标记(token)序列的过程,对源代码进行词法分析,旨在忽略代码中变量名、数值大小这类区别。进行词法分析的程序或者函数叫作词法分析器(lexicalanalyzer,简称lexer)。使用Python内置的词法分析器,直接使用指令:python3-mtokenize-e(+filename)对源代码进行词法分析,其中filename为代码文件所在路径。然后对词法分析结果进行如下处理:(1)首先同样是将代码中的所有字符,根据人工定义的“符号替换词典”进行替换,并加上“punc_”前缀;(2)然后将代码中的关键字统一加上“key_”前缀;(3)然后将词法分析中得到的Token标识符替换为较短的唯一标识符(根据“Token替换词典”,目的是使得最终得到的字符串长度较小,例如词法分析将代码中的所有变量名标记为“NAME”,用“AO”缩写来进行表示);(4)最后,将查询代码和数据库中代码转换之后的字符串进行精确匹配,相同则返回,不同则不返回。所述步骤3考虑语法树级别的相似性匹配,对代码进行语法分析,得到每段代码对应的语法树,再对语法树进行特征提取,得到每个语法树对应的特征串。语法分析器基于特定语言的语法,将Token序列(由词法分析器生成)转换成一个抽象语法树。抽象语法树(AbstractSyntaxTree,AST),或简称语法树(Syntaxtree),是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。之所以说语法是“抽象”的,是因为这里的语法并不会表示出真实语法中出现的每个细节。比如,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现。在进行语法分析得到语法树之后,采用如下步骤进行语法树的特征提取,将树的表达转化成为一个字符序列:(1)先将语法树转换成二叉树,采用左孩子右兄弟的转换方法。(2)然后对二叉树的所有叶结点进行结点填充,使得每个叶节点都拥有其左孩子和右孩子结点,填充结点的值统一为任意值。(3)取出转换之后二叉树中的每个两层子树,当做一个特征,将该两层子树结构中的三个结点值用下划线“_”连接起来,作为最终树的字符串表达中的一项。(4)将该语法树中的所有特征项用空格隔开,作为最终的树的字符串表达。所以,进一步将判断两段代码的相似性,转化为判断语法树的相似性,最后转化为判断两个字符序列之间的相似性。所述步骤4考虑将代码原始字符串、Token字符串、语法树特征字符串结合起来,使用ElasticSearch构建索引。即数据库中的所有代码,都存在以上三种解析方式的索引。实际使用过程中,传来一个查询query,对该查询执行三种解析,得到三种不同的查询串,再用每一种查询串进行ElasticSearch的查询,然后将三种查询串搜索的结果进行合并,采取的合并策略是:(1)原始字符串精确匹配的结果,优先级最高,排在最前面;(2)词法分析的Token串查询的结果,优先级次之,依次排在后面;(3)语法树的匹配结果,排在字符串结果和词法分析结果的后面。在合并的过程中,进行去重,即字符串精确匹配的结果,可能也在词法分析串搜索中也会出现,则去除词法分析中的这些返回结果。该搜索结合方式在查询较短代码时,返回的结果中通常是很多精确匹配的结果,以及词法分析串匹配的结果;而针对查询的代码较长时,精确匹配的结果往往很少,此时返回的应该大部分是语法结构的匹配结果。附图说明图1为本专利技术的流程示意图。图2为样例代码及其对应的抽象语法树。图3为抽象语法树对应的二叉树。具体实施方式本专利技术为解决K12编程面临的快速查找相似代码、通过阅读代码进行编程学习的特殊问题,提供了一种字符串、Token串和语法树相结合的Python代码快速搜索技术,通过对用户查询代码和库中代码进行词法分析和语法分析,将字面(字符串级)、词法和语法特征相结合,计算查询代码与库中代码的相关度,据此产生检索的排序结果,整体流程如图1所示。为解决K12编程面临的快速查找相似代码、通过阅读代码进行编程学习的特殊问题,提供了一种代码相似度计算方法,该方法结合了三个层面的代码相似度,即字符串级别的精确匹配、Token串级别的相似度匹配、代码语法树级别的相似度匹配。为提升查询效率,需定期更新数据库里已有代码的索引,每次更新由以下几个预处理步骤得到代码的特征并依据特征构建索引:步骤1:考虑字符串级别的精确匹配,对原始代码仅做简单的预处理,得到由代码原始字符构成的字符串。步骤2:考虑Token串级别的相似性匹配,对代码进行词法本文档来自技高网...

【技术保护点】
1.一种面向K12编程的Python程序代码快速搜索方法,其特征在于包括以下步骤:步骤1,基于字符串级别的精确匹配,对原始代码预处理,得到由代码原始字符构成的字符串;步骤2:基于Token串级别的相似性匹配,对代码进行词法分析,得到原始代码对应的Token字符串;步骤3:基于语法树级别的相似性匹配,对代码进行语法分析,得到每段代码对应的语法树,再对语法树进行特征提取,得到每个语法树对应的特征串;步骤4:将代码原始字符串、Token字符串、语法树特征字符串结合起来,使用ElasticSearch构建索引。

【技术特征摘要】
1.一种面向K12编程的Python程序代码快速搜索方法,其特征在于包括以下步骤:步骤1,基于字符串级别的精确匹配,对原始代码预处理,得到由代码原始字符构成的字符串;步骤2:基于Token串级别的相似性匹配,对代码进行词法分析,得到原始代码对应的Token字符串;步骤3:基于语法树级别的相似性匹配,对代码进行语法分析,得到每段代码对应的语法树,再对语法树进行特征提取,得到每个语法树对应的特征串;步骤4:将代码原始字符串、Token字符串、语法树特征字符串结合起来,使用ElasticSearch构建索引。2.基于权利要求1所述的搜索方法,其特征在于:所述步骤1中的基于字符串级别的精确匹配,对原始代码预处理,得到由代码原始字符构成的字符串,具体为:该步直接对源代码进行一定的预处理,然后进行字符串的精确匹配即可;预处理过程中忽略了代码中的注释语句,具体做法如下,将代码中的所有字符,根据人工定义的“符号替换词典”进行替换,并加上“punc_”前缀,所有字母组成的单词加上“char_”前缀,然后用空格隔开组成一个长字符串;将查询代码和数据库中代码转换之后的字符串进行精确匹配,相同则返回,不同则不返回。3.基于权利要求1所述的搜索方法,其特征在于:所述步骤2中的基于Token串级别的相似性匹配,对代码进行词法分析,得到原始代码对应的Token字符串,具体为:该步重要的是对代码进行词法分析,旨在忽略代码中变量名、数值大小这类区别,使用Python内置的词法分析器,直接使用指令:python3-mtokenize-e(+filename)对源代码进行词法分析,其中filename为代码文件所在路径;然后对词法分析结果进行如下处理:(1)首先将代码中的所有字符,根据人工定义的“符号替换词典”进行替换,并加上“punc_”前缀,然后将代码中的关键字统一加上“key_”前缀;(2)然后将词法分析中得到的Token标识符根据“Token替换词典”替换为较短的唯一标识符;(3)最后,将查询代码和数据库中代码转换之后的字符...

【专利技术属性】
技术研发人员:不公告发明人
申请(专利权)人:中森云链成都科技有限责任公司
类型:发明
国别省市:四川,51

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1