CN112051986B - 基于开源知识的代码搜索推荐装置及方法 - Google Patents
基于开源知识的代码搜索推荐装置及方法 Download PDFInfo
- Publication number
- CN112051986B CN112051986B CN202010872148.XA CN202010872148A CN112051986B CN 112051986 B CN112051986 B CN 112051986B CN 202010872148 A CN202010872148 A CN 202010872148A CN 112051986 B CN112051986 B CN 112051986B
- Authority
- CN
- China
- Prior art keywords
- code
- code segment
- feature
- text
- segment
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/30—Information retrieval; Database structures therefor; File system structures therefor of unstructured textual data
- G06F16/31—Indexing; Data structures therefor; Storage structures
- G06F16/316—Indexing structures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/30—Information retrieval; Database structures therefor; File system structures therefor of unstructured textual data
- G06F16/33—Querying
- G06F16/3331—Query processing
- G06F16/3332—Query translation
- G06F16/3335—Syntactic pre-processing, e.g. stopword elimination, stemming
-
- 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/951—Indexing; Web crawling techniques
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F18/00—Pattern recognition
- G06F18/20—Analysing
- G06F18/22—Matching criteria, e.g. proximity measures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/20—Natural language analysis
- G06F40/279—Recognition of textual entities
- G06F40/289—Phrasal analysis, e.g. finite state techniques or chunking
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/30—Semantic analysis
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Computational Linguistics (AREA)
- Software Systems (AREA)
- Artificial Intelligence (AREA)
- Health & Medical Sciences (AREA)
- Audiology, Speech & Language Pathology (AREA)
- General Health & Medical Sciences (AREA)
- Evolutionary Computation (AREA)
- Evolutionary Biology (AREA)
- Computer Vision & Pattern Recognition (AREA)
- Bioinformatics & Computational Biology (AREA)
- Bioinformatics & Cheminformatics (AREA)
- Life Sciences & Earth Sciences (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开一种基于开源知识的代码搜索推荐装置及方法。本发明的装置包括代码片段生成模块、代码特征提取模块、文本预处理模块和代码搜索模块。本发明的方法的步骤为:生成代码片段库;提取代码片段文本特征;生成代码片段主题特征;生成代码片段结构特征;生成代码片段开发特征;建立搜索索引;查询语句文本预处理;代码特征与查询语句相似度计算;根据综合得分完成推荐。本发明利用开源知识构建代码特征度量体系,多角度提取代码片段特征,并利用相似度计算、加权计算方式获取代码片段的综合评分并完成代码搜索推荐,完善了代码度量角度,提高了代码搜索推荐的准确性。
Description
技术领域
本发明属于软件工程技术领域,更进一步涉及智能化软件研发和人工智能、数据挖掘等技术领域的一种基于开源知识的代码搜索推荐装置及方法。本发明适用于高效开发高质量软件的工程开发任务中,完成对海量开源社区中知识的分析、运用,实现对代码片段的准确度量,精确搜索,提升代码搜索推荐结果的准确性。
背景技术
随着软件规模日益庞大、功能日趋复杂,软件代码本身更加庞大、复杂且充斥着可变性。同时,当代软件的持续构造、可成长性等特征,也亟需开发者高效地完成优质代码以应对不断变化的新需求。而通过代码搜索实现代码重用是提高软件开发效率的一种重要方式。通常代码搜索技术是通过挖掘代码特征信息,建立索引与查询文本匹配从而获得满足特定约束的代码。基于开源知识代码搜索推荐一方面通过挖掘开源代码的社区特点与软件开发人员的代码重用需求,提取开源代码的社区知识,实现代码特征的扩充和提取,并建立索引并形成候选代码资源库,另一方面通过权衡查询文本与代码特征文本间的相似度对候选代码片段排序,将排名靠前的片段推荐给软件开发人员。
北京创新乐知信息技术有限公司在其申请的专利文献“一种代码搜索方法和系统”(公开号:CN106294786A,申请号:CN201610665959.6,申请日:2016年08月12日)中提供一种代码搜索方法和系统。该专利申请所公开方法的步骤包括:基于用户输入的搜索词对代码进行一次搜索;对通过一次搜索得到的结果集根据相关性、代码质量、查询意图、用户反馈中的一个或多个进行二次排序;将经过二次排序的所述结果集作为搜索结果返回给所述用户。根据本发明的实施例,可以有效的提高代码搜索的效果,为开发者提供最符合需要、最优质的代码搜索结果。但是,该方法存在的不足之处是:虽然考虑了用户的查询意图、代码质量等方面的因素,但是通过利用传统的“单纯地将软件代码视为纯文本”的思想而进行单一的相似匹配来实现代码搜索,没有充分考虑代码本身的特征与特性,从而造成代码度量深度的欠缺而引发搜索结果的不准确。该专利申请所公开的系统包括:用于基于用户输入的搜索词对代码进行一次搜索的搜索模块;用于对通过一次搜索得到的结果集根据相关性、代码质量、查询意图、用户反馈中的一个或多个进行二次排序的排序模块;用于将经过二次排序的所述结果集作为搜索结果返回给所述用户的返回模块。
南京大学在其申请的专利文献“一种基于约束求解的代码搜索方法”(公开号:CN107992324A,申请号:CN201711405834.0,申请日:2017年12月22日)中公开了一种基于约束求解的代码搜索方法,该方法具体步骤为:步骤一、从开源社区中获取开源项目;步骤二、使用JPF和JDT分析源代码,将其转化为SSA格式;步骤三、使用JDT分析SSA格式的代码,将其转化为约束;步骤四、将源代码与生成的约束一一对应,构建代码#约束库;步骤五、构建代码搜索系统,帮助用户搜索代码。该方法的主要特点是基于约束求解的方法解决代码搜索问题,并对循环语句和类成员变量进行了处理,弥补了现有方法中源代码分析的不足,并且大大提高了代码搜索的准确率,使得程序员在软件开发过程中可以搜索需要的代码,加以借鉴或复用,提高软件开发效率和质量。但是,该方法仍然存在的不足之处是:该方法虽然从开源社区中获取开源项目作为输入,但舍弃了开源社区中海量的代码知识,从而造成生成的约束不够全面的问题出现,进而导致查询词的不完全匹配以及搜索结果的不准确。
东南大学在其申请的专利文献“一种基于功能相似度匹配的代码搜索方法”(公开号:CN110716749A,申请号:CN201910828507.9,申请日:2019年09月03日)中公开了一种基于功能相似度匹配的代码搜索方法,针对输入是自然语言查询的情况,对代码库中的代码进行功能信息的挖掘,挖掘代码片段的功能注释与功能API这两个特征来度量代码片段和查询语句的功能相似度,结合代码片段的方法名和方法体两个特征,根据不同特征的重要性分配不同的权重,计算查询和与代码片段的总的相似度得分,按照得分高低排序,把搜索结果返回给用户。充分考虑并挖掘了源代码中包含的功能信息,并根据重要性分配权重,使得匹配精度更高。但是,该方法仍然存在的不足之处是:代码度量角度单一,即对代码的功能信息进行挖掘,只考虑代码片段的注释与功能API两个特征。同时在搜索过程中没有充分利用用户的查询意图等知识,导致代码搜索结果与查询词的不匹配。
综上所述,现有的代码搜索推荐方法尚且停留在“单纯地将软件代码视为纯文本”的思想层面,在进行代码特征的度量方面存在较多缺陷,并且在代码搜索过程中忽略了查询意图以及众多开源社区知识,难以达到辅助快速开发、精准搜索的目标。
发明内容
本发明的目的在于针对上述现有技术的不足,提供一种基于开源知识的代码搜索推荐装置及方法,以解决现有技术没有充分考虑代码本身的特征与特性,从而造成代码度量深度的欠缺、舍弃了开源社区中海量的代码知识,从而造成生成的约束不够全面的问题、代码度量角度单一且在搜索过程中没有充分利用用户的查询意图等知识的问题。
实现本发明目的的思路是:采集开源社区中开源代码及信息,进行处理后生成代码片段库,从文本特征、结构特征、主题特征、开发特征的四个维度分别对每个代码片段进行特征提取,并建立每个代码片段与其特征间的映射关系,生成代码片段-特征索引库,同时采用文本预处理方法对查询语句处理后作为代码搜索推荐的输入,通过计算代码片段的综合得分,完成代码片段的搜索排序及向查询用户推荐。
本发明的代码搜索推荐装置包括代码片段生成模块、代码特征提取模块、文本预处理模块和代码搜索模块四个模块,其中,
所述代码片段生成模块,用于将至少10万个开源项目按照每个项目中代码本身的属性为粒度切分代码,得到至少150万个代码片段组成代码片段库。
所述代码特征提取模块,用于利用抽象语法树AST,将每个代码片段中所有的文本信息以树状的形式表示,树上的每个节点表示代码片段中的一种特征类型,得到每个代码片段的所有文本特征,将所有代码片段的所有文本特征组成一个文本特征集;对每个代码片段的说明文档进行分析,得到该说明文档中的隐含语义结构,统计每个说明文档内字符出现的频率;利用基于划分的聚类方法,对每个隐含语义结构依次进行分类和降维处理,将分类后得到的主题属性和降维后得到的主题属性组成主题属性集;将与主题属性集中的每个主题关联性高的字符在该代码片段的说明文档中出现的频率作为该主题的概率,得到主题属性集的概率分布;遍历主题属性集中所有主题,将概率大于给定阈值的所有主题组成该代码片段的所有主题特征;所述给定阈值指的是使得到的所有主题能够准确描述该代码片段的主题属性的最小概率值;将所有代码片段的所有主题特征组成主题特征集;利用特征词选择算法,从每个代码片段的说明文档中挑选所有表征代码框架的词汇,组成该代码片段的框架特征词,将每个代码片段的特征词和该代码片段对应的行数组成该代码片段的结构特征;将所有代码片段的结构特征组成代码片段集;利用爬虫技术,爬取每个代码片段在开源社区中的使用率和维护日志;遍历维护日志中的每条日志,对含有修改操作的日志进行标注,计算被标注的日志条数占维护日志的比例,将该比例作为该代码片段的活跃度;将每个代码片段的使用率和活跃度组成该代码片段的开发特征;将所有代码片段的开发特征组成开发特征集;建立代码片段库中的每个代码片段与该代码片段的文本特征、主题特征、结构特征、开发特征间的映射关系,构建代码片段-特征索引库;将文本特征集、主题特征集、结构特征集、开发特征集组成特征集合。
所述文本预处理模块,用于利用驼峰分词法,根据长词串的语义内容对用户输入的查询语句文本中的语义分词进行长词串进行分割,生成单词组;利用大小写分词算法,去除单词组中的停用词,生成短单词组;利用Porter Stemmer算法,提取单词组中的词干,生成词干组;利用Stanford Parser工具提取单词组中的动作单词,生成动作词组;将短单词组、词干组和动作词组组成查询语句的词项。
所述代码搜索模块,用于计算特征集合中每个代码片段的特征与查询语句的相似度;加权计算每个特征相似度、代码长度、代码活跃度、代码使用率得到每个代码片段综合得分;根据代码片段的综合评分将查询结果按照得分从高到低排序,向查询用户推荐排名靠前的代码片段。
本发明的代码搜索推荐方法的具体步骤包括如下:
(1)生成代码片段库:
代码片段生成模块将至少10万个开源项目按照每个项目中代码本身的属性为粒度切分代码,得到至少150万个代码片段组成代码片段库;
(2)提取每个代码片段的文本特征:
代码特征提取模块利用抽象语法树AST,将每个代码片段中所有的文本信息以树状的形式表示,树上的每个节点表示代码片段中的一种特征类型,得到每个代码片段的所有文本特征,将所有代码片段的所有文本特征组成一个文本特征集;
(3)利用非监督学习的方式生成每个代码片段的主题特征:
(3a)代码特征提取模块对每个代码片段的说明文档进行分析,得到该说明文档中的隐含语义结构,统计每个说明文档内字符出现的频率;
(3b)代码特征提取模块利用基于划分的聚类方法,对每个隐含语义结构依次进行分类和降维处理,将分类后得到的主题属性和降维后得到的主题属性组成主题属性集;
(3c)代码特征提取模块将与主题属性集中的每个主题关联性高的字符在该代码片段的说明文档中出现的频率作为该主题的概率,得到主题属性集的概率分布;
(3d)代码特征提取模块遍历主题属性集中所有主题,将概率大于给定阈值的所有主题组成该代码片段的所有主题特征;所述给定阈值指的是使得到的所有主题能够准确描述该代码片段的主题属性的最小概率值;
(3e)代码特征提取模块将所有代码片段的所有主题特征组成主题特征集;
(4)生成每个代码片段的结构特征:
代码特征提取模块利用特征词选择算法,从每个代码片段的说明文档中挑选所有表征代码框架的词汇,组成该代码片段的框架特征词,将每个代码片段的特征词和该代码片段对应的行数组成该代码片段的结构特征;将所有代码片段的结构特征组成代码片段集;
(5)生成每个代码片段的开发特征:
(5a)代码特征提取模块利用爬虫技术,爬取每个代码片段在开源社区中的使用率和维护日志;
(5b)代码特征提取模块遍历维护日志中的每条日志,对含有修改操作的日志进行标注,计算被标注的日志条数占维护日志的比例,将该比例作为该代码片段的活跃度;
(5d)代码特征提取模块将每个代码片段的使用率和活跃度组成该代码片段的开发特征;
(5e)代码特征提取模块将所有代码片段的开发特征组成开发特征集;
(6)建立搜索索引:
(6a)代码特征提取模块建立代码片段库中的每个代码片段与该代码片段的文本特征、主题特征、结构特征、开发特征间的映射关系,构建代码片段-特征索引库;
(6b)代码特征提取模块将步骤(2)、(3)(4)、(5)中得到的文本特征集、主题特征集、结构特征集、开发特征集组成特征集合;
(7)对查询语句文本进行预处理:
(7a)文本预处理模块利用驼峰分词法,根据长词串的语义内容对用户输入的查询语句文本中的语义分词进行长词串进行分割,生成单词组;
(7b)文本预处理模块利用大小写分词算法,去除单词组中的停用词,生成短单词组;
(7c)文本预处理模块利用Porter Stemmer算法,提取单词组中的词干,生成词干组;
(7d)文本预处理模块利用Stanford Parser工具提取单词组中的动作单词,生成动作词组;
(7e)文本预处理模块将短单词组、词干组和动作词组组成查询语句的词项;
(8)计算代码特征与查询语句的相似度、代码片段的综合得分完成推荐:
(8a)代码搜索模块利用基于BM25的文本相似度计算方法计算特征集合中每个代码片段的特征与查询语句的相似度;
(8b)代码搜索模块加权计算每个特征相似度、代码长度、代码活跃度、代码使用率得到每个代码片段综合得分;
(8c)代码搜索模块根据代码片段的综合评分将查询结果按照得分从高到低排序,向查询用户推荐排名靠前的代码片段。
本发明与现有技术相比具有如下优点:
第一,由于本发明的装置中的代码片段生成模块可以采集10万个开源社区中的开源项目源代码作为输入,能够将每个项目按照代码本身的结构、方法、功能属性为粒度切分代码,并采集了源代码在开源社区中活跃度、使用率、修改日志信息,克服了现有技术对于代码所在开源社区知识利用较少的问题。使得本发明在完成代码搜索的过程中更加符合用户的意图,提升了代码搜索推荐的准确性。
第二,由于本发明的方法中采用多种代码片段处理方法及查询语句预处理方法,从文本特征、主题特征、结构特征、开发特征四个方面对代码片段进行特征提取,扩充了代码度量的维度,同时采用了基于BM25的文本相似度计算方法计算代码片段的特征与查询语句的相似度,克服了现有技术代码特征度量不完全导致搜索不准确的问题。使得本发明对代码的度量更加完备、搜索结果更加准确。
附图说明
图1为本发明装置的方框图;
图2为本发明方法的流程图。
具体实施方式
下面结合附图对本发明做进一步的描述。
参照附图1,对本发明装置的结构做进一步的描述。
本发明的装置包括代码片段生成模块、代码特征提取模块、文本预处理模块和代码搜索模块四个模块。
所述代码片段生成模块,用于将至少10万个开源项目按照每个项目中代码本身的属性为粒度切分代码,得到至少150万个代码片段组成代码片段库。
所述代码特征提取模块,用于利用抽象语法树AST,将每个代码片段中所有的文本信息以树状的形式表示,树上的每个节点表示代码片段中的一种特征类型,得到每个代码片段的所有文本特征,将所有代码片段的所有文本特征组成一个文本特征集;对每个代码片段的说明文档进行分析,得到该说明文档中的隐含语义结构,统计每个说明文档内字符出现的频率;利用基于划分的聚类方法,对每个隐含语义结构依次进行分类和降维处理,将分类后得到的主题属性和降维后得到的主题属性组成主题属性集;将与主题属性集中的每个主题关联性高的字符在该代码片段的说明文档中出现的频率作为该主题的概率,得到主题属性集的概率分布;遍历主题属性集中所有主题,将概率大于给定阈值的所有主题组成该代码片段的所有主题特征;所述给定阈值指的是使得到的所有主题能够准确描述该代码片段的主题属性的最小概率值;将所有代码片段的所有主题特征组成主题特征集;利用特征词选择算法,从每个代码片段的说明文档中挑选所有表征代码框架的词汇,组成该代码片段的框架特征词,将每个代码片段的特征词和该代码片段对应的行数组成该代码片段的结构特征;将所有代码片段的结构特征组成代码片段集;利用爬虫技术,爬取每个代码片段在开源社区中的使用率和维护日志;遍历维护日志中的每条日志,对含有修改操作的日志进行标注,计算被标注的日志条数占维护日志的比例,将该比例作为该代码片段的活跃度;将每个代码片段的使用率和活跃度组成该代码片段的开发特征;将所有代码片段的开发特征组成开发特征集;建立代码片段库中的每个代码片段与该代码片段的文本特征、主题特征、结构特征、开发特征间的映射关系,构建代码片段-特征索引库;将文本特征集、主题特征集、结构特征集、开发特征集组成特征集合。
所述文本预处理模块,用于利用驼峰分词法,根据长词串的语义内容对用户输入的查询语句文本中的语义分词进行长词串进行分割,生成单词组;利用大小写分词算法,去除单词组中的停用词,生成短单词组;利用Porter Stemmer算法,提取单词组中的词干,生成词干组;利用Stanford Parser工具提取单词组中的动作单词,生成动作词组;将短单词组、词干组和动作词组组成查询语句的词项。
所述代码搜索模块,用于计算特征集合中每个代码片段的特征与查询语句的相似度;加权计算每个特征相似度、代码长度、代码活跃度、代码使用率得到每个代码片段综合得分;根据代码片段的综合评分将查询结果按照得分从高到低排序,向查询用户推荐排名靠前的代码片段。
参照附图2,对本发明方法的实现步骤做进一步的描述。
步骤1,生成代码片段库。
代码片段生成模块将至少10万个开源项目按照每个项目中代码本身的属性为粒度切分代码,得到至少150万个代码片段组成代码片段库。所述的代码本身的属性包括结构、方法、功能。
步骤2,提取每个代码片段的文本特征。
代码特征提取模块利用抽象语法树AST,将每个代码片段中所有的文本信息以树状的形式表示,树上的每个节点表示代码片段中的一种特征类型,得到每个代码片段的所有文本特征,将所有代码片段的所有文本特征组成一个文本特征集。
步骤3,利用非监督学习的方式生成每个代码片段的主题特征。
代码特征提取模块对每个代码片段的说明文档进行分析,得到该说明文档中的隐含语义结构,统计每个说明文档内字符出现的频率。
代码特征提取模块利用基于划分的聚类方法,对每个隐含语义结构依次进行分类和降维处理,将分类后得到的主题属性和降维后得到的主题属性组成主题属性集。
代码特征提取模块将与主题属性集中的每个主题关联性高的字符在该代码片段的说明文档中出现的频率作为该主题的概率,得到主题属性集的概率分布。
代码特征提取模块遍历主题属性集中所有主题,将概率大于给定阈值的所有主题组成该代码片段的所有主题特征;所述给定阈值指的是使得到的所有主题能够准确描述该代码片段的主题属性的最小概率值。
代码特征提取模块将所有代码片段的所有主题特征组成主题特征集。
步骤4,生成每个代码片段的结构特征。
代码特征提取模块利用特征词选择算法,从每个代码片段的说明文档中挑选所有表征代码框架的词汇,组成该代码片段的框架特征词,将每个代码片段的特征词和该代码片段对应的行数组成该代码片段的结构特征;将所有代码片段的结构特征组成代码片段集。
步骤5,生成每个代码片段的开发特征。
代码特征提取模块利用爬虫技术,爬取每个代码片段在开源社区中的使用率和维护日志。
代码特征提取模块遍历维护日志中的每条日志,对含有修改操作的日志进行标注,计算被标注的日志条数占维护日志的比例,将该比例作为该代码片段的活跃度;
代码特征提取模块将每个代码片段的使用率和活跃度组成该代码片段的开发特征。
代码特征提取模块将所有代码片段的开发特征组成开发特征集。
步骤6,建立搜索索引:
代码特征提取模块建立代码片段库中的每个代码片段与该代码片段的文本特征、主题特征、结构特征、开发特征间的映射关系,构建代码片段-特征索引库。
代码特征提取模块将步骤2、3、4、5中得到的文本特征集、主题特征集、结构特征集、开发特征集组成特征集合。
步骤7,对查询语句文本进行预处理。
文本预处理模块利用驼峰分词法,根据长词串的语义内容对用户输入的查询语句文本中的语义分词进行长词串进行分割,生成单词组。
文本预处理模块利用大小写分词算法,去除单词组中的停用词,生成短单词组。
文本预处理模块利用Porter Stemmer算法,提取单词组中的词干,生成词干组。
文本预处理模块利用Stanford Parser工具提取单词组中的动作单词,生成动作词组。
文本预处理模块将短单词组、词干组和动作词组组成查询语句的词项。
步骤8,计算代码特征与查询语句的相似度、代码片段的综合得分完成推荐。
利用下式,代码搜索模块利用基于BM25的文本相似度计算方法计算特征集合中每个代码片段的特征与查询语句的相似度:
其中,sim(·)表示相似度操作,Dn表示特征集合D中第n个代码片段的特征,q表示查询语句,ti表示查询语句中第i个词项,i=1,2,3,...,m,m表示查询语句的词项总数,∈表示属于符号,表示交集符号,IDF(·)表示计算逆文档频率操作,*表示相乘操作,tf(·)表示计算词项频率操作,Dn′表示特征集合D中第n个代码片段的特征词项的总数,avgdl表示特征集合中代码片段的特征词项的平均值,参数k1和b分别用于控制词项频率的范围和特征集合词项数。
利用下式,代码搜索模块加权计算每个特征相似度、代码长度、代码活跃度、代码使用率得到每个代码片段综合得分:
sj=e1×smj+e2×lj+e3×aj+e4×sej
其中,sj表示第j个代码片段的综合得分,e1表示取值为0.6权重,e2表示取值为0.1权重,e3表示取值为0.15权重,e4表示取值为0.15权重,smj表示第j个代码片段的特征相似度,lj表示第j个代码片段的代码长度,aj表示第j个代码片段的活跃度,sej表示第j个代码片段的使用率。
代码搜索模块根据代码片段的综合评分将查询结果按照得分从高到低排序,向查询用户推荐排名靠前的代码片段。
Claims (5)
1.一种基于开源社区特征的代码搜索推荐装置,包括代码片段生成模块、代码特征提取模块、文本预处理模块和代码搜索模块四个模块,其中,
所述代码片段生成模块,用于将至少10万个开源项目按照每个项目中代码本身的属性为粒度切分代码,得到至少150万个代码片段组成代码片段库;
所述代码特征提取模块,用于利用抽象语法树AST,将每个代码片段中所有的文本信息以树状的形式表示,树上的每个节点表示代码片段中的一种特征类型,得到每个代码片段的所有文本特征,将所有代码片段的所有文本特征组成一个文本特征集;对每个代码片段的说明文档进行分析,得到该说明文档中的隐含语义结构,统计每个说明文档内字符出现的频率;利用基于划分的聚类方法,对每个隐含语义结构依次进行分类和降维处理,将分类后得到的主题属性和降维后得到的主题属性组成主题属性集;将与主题属性集中的每个主题关联性高的字符在该代码片段的说明文档中出现的频率作为该主题的概率,得到主题属性集的概率分布;遍历主题属性集中所有主题,将概率大于给定阈值的所有主题组成该代码片段的所有主题特征;所述给定阈值指的是使得到的所有主题能够准确描述该代码片段的主题属性的最小概率值;将所有代码片段的所有主题特征组成主题特征集;利用特征词选择算法,从每个代码片段的说明文档中挑选所有表征代码框架的词汇,组成该代码片段的框架特征词,将每个代码片段的特征词和该代码片段对应的行数组成该代码片段的结构特征;将所有代码片段的结构特征组成代码片段集;利用爬虫技术,爬取每个代码片段在开源社区中的使用率和维护日志;遍历维护日志中的每条日志,对含有修改操作的日志进行标注,计算被标注的日志条数占维护日志的比例,将该比例作为该代码片段的活跃度;将每个代码片段的使用率和活跃度组成该代码片段的开发特征;将所有代码片段的开发特征组成开发特征集;建立代码片段库中的每个代码片段与该代码片段的文本特征、主题特征、结构特征、开发特征间的映射关系,构建代码片段-特征索引库;将文本特征集、主题特征集、结构特征集、开发特征集组成特征集合;
所述文本预处理模块,用于利用驼峰分词法,根据长词串的语义内容对用户输入的查询语句文本中的语义分词进行长词串进行分割,生成单词组;利用大小写分词算法,去除单词组中的停用词,生成短单词组;利用Porter Stemmer算法,提取单词组中的词干,生成词干组;利用Stanford Parser工具提取单词组中的动作单词,生成动作词组;将短单词组、词干组和动作词组组成查询语句的词项;
所述代码搜索模块,用于计算特征集合中每个代码片段的特征与查询语句的相似度;加权计算每个特征相似度、代码长度、代码活跃度、代码使用率得到每个代码片段综合得分;根据代码片段的综合评分将查询结果按照得分从高到低排序,向查询用户推荐排名靠前的代码片段。
2.根据权利要求1所述装置的一种基于开源社区特征的代码搜索推荐方法,其特征在于,针对开源代码原有的文本、主题、结构特征提取以外,增添开发特征来更加全面度量代码片段,并通过计算查询文本与代码特征文本间的相似度对候选代码片段排序,用于完成代码搜索;该方法的具体步骤包括如下:
(1)生成代码片段库:
代码片段生成模块将至少10万个开源项目按照每个项目中代码本身的属性为粒度切分代码,得到至少150万个代码片段组成代码片段库;
(2)提取每个代码片段的文本特征:
代码特征提取模块利用抽象语法树AST,将每个代码片段中所有的文本信息以树状的形式表示,树上的每个节点表示代码片段中的一种特征类型,得到每个代码片段的所有文本特征,将所有代码片段的所有文本特征组成一个文本特征集;
(3)利用非监督学习的方式生成每个代码片段的主题特征:
(3a)代码特征提取模块对每个代码片段的说明文档进行分析,得到该说明文档中的隐含语义结构,统计每个说明文档内字符出现的频率;
(3b)代码特征提取模块利用基于划分的聚类方法,对每个隐含语义结构依次进行分类和降维处理,将分类后得到的主题属性和降维后得到的主题属性组成主题属性集;
(3c)代码特征提取模块将与主题属性集中的每个主题关联性高的字符在该代码片段的说明文档中出现的频率作为该主题的概率,得到主题属性集的概率分布;
(3d)代码特征提取模块遍历主题属性集中所有主题,将概率大于给定阈值的所有主题组成该代码片段的所有主题特征;所述给定阈值指的是使得到的所有主题能够准确描述该代码片段的主题属性的最小概率值;
(3e)代码特征提取模块将所有代码片段的所有主题特征组成主题特征集;
(4)生成每个代码片段的结构特征:
代码特征提取模块利用特征词选择算法,从每个代码片段的说明文档中挑选所有表征代码框架的词汇,组成该代码片段的框架特征词,将每个代码片段的特征词和该代码片段对应的行数组成该代码片段的结构特征;将所有代码片段的结构特征组成代码片段集;
(5)生成每个代码片段的开发特征:
(5a)代码特征提取模块利用爬虫技术,爬取每个代码片段在开源社区中的使用率和维护日志;
(5b)代码特征提取模块遍历维护日志中的每条日志,对含有修改操作的日志进行标注,计算被标注的日志条数占维护日志的比例,将该比例作为该代码片段的活跃度;
(5d)代码特征提取模块将每个代码片段的使用率和活跃度组成该代码片段的开发特征;
(5e)代码特征提取模块将所有代码片段的开发特征组成开发特征集;
(6)建立搜索索引:
(6a)代码特征提取模块建立代码片段库中的每个代码片段与该代码片段的文本特征、主题特征、结构特征、开发特征间的映射关系,构建代码片段-特征索引库;
(6b)代码特征提取模块将步骤(2)、(3)(4)、(5)中得到的文本特征集、主题特征集、结构特征集、开发特征集组成特征集合;
(7)对查询语句文本进行预处理:
(7a)文本预处理模块利用驼峰分词法,根据长词串的语义内容对用户输入的查询语句文本中的语义分词进行长词串进行分割,生成单词组;
(7b)文本预处理模块利用大小写分词算法,去除单词组中的停用词,生成短单词组;
(7c)文本预处理模块利用Porter Stemmer算法,提取单词组中的词干,生成词干组;
(7d)文本预处理模块利用Stanford Parser工具提取单词组中的动作单词,生成动作词组;
(7e)文本预处理模块将短单词组、词干组和动作词组组成查询语句的词项;
(8)计算代码特征与查询语句的相似度、代码片段的综合得分完成推荐:
(8a)代码搜索模块利用基于BM25的文本相似度计算方法计算特征集合中每个代码片段的特征与查询语句的相似度;
(8b)代码搜索模块加权计算每个特征相似度、代码长度、代码活跃度、代码使用率得到每个代码片段综合得分;
(8c)代码搜索模块根据代码片段的综合评分将查询结果按照得分从高到低排序,向查询用户推荐排名靠前的代码片段。
3.根据权利要求2所述的基于开源社区特征的代码搜索推荐方法,其特征在于,步骤(1)中所述的代码本身的属性包括结构、方法、功能。
4.根据权利要求2所述的基于开源社区特征的代码搜索推荐方法,其特征在于,步骤(8a)中所述计算特征集合中每个代码片段的特征与查询语句的相似度是由下式得到的:
其中,sim(·)表示相似度操作,Dn表示特征集合D中第n个代码片段的特征,q表示查询语句,ti表示查询语句中第i个词项,i=1,2,3,...,m,m表示查询语句的词项总数,∈表示属于符号,∩表示交集符号,IDF(·)表示计算逆文档频率操作,*表示相乘操作,tf(·)表示计算词项频率操作,Dn′表示特征集合D中第n个代码片段的特征词项的总数,avgdl表示特征集合中代码片段的特征词项的平均值,参数k1和b分别用于控制词项频率的范围和特征集合词项数。
5.根据权利要求2所述的基于开源社区特征的代码搜索推荐方法,其特征在于,步骤(8b)中所述加权计算每个特征相似度、代码长度、代码活跃度、代码使用率得到每个代码片段综合得分是由下式得到的:
sj=e1×smj+e2×lj+e3×aj+e4×sej
其中,sj表示第j个代码片段的综合得分,e1表示取值为0.6权重,e2表示取值为0.1权重,e3表示取值为0.15权重,e4表示取值为0.15权重,smj表示第j个代码片段的特征相似度,lj表示第j个代码片段的代码长度,aj表示第j个代码片段的活跃度,sej表示第j个代码片段的使用率。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010872148.XA CN112051986B (zh) | 2020-08-26 | 2020-08-26 | 基于开源知识的代码搜索推荐装置及方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010872148.XA CN112051986B (zh) | 2020-08-26 | 2020-08-26 | 基于开源知识的代码搜索推荐装置及方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112051986A CN112051986A (zh) | 2020-12-08 |
CN112051986B true CN112051986B (zh) | 2021-07-27 |
Family
ID=73599375
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010872148.XA Active CN112051986B (zh) | 2020-08-26 | 2020-08-26 | 基于开源知识的代码搜索推荐装置及方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112051986B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113918734A (zh) * | 2021-10-22 | 2022-01-11 | 平安科技(深圳)有限公司 | 一种数据检索方法、装置、电子设备以及存储介质 |
CN113901177B (zh) * | 2021-10-27 | 2023-08-08 | 电子科技大学 | 一种基于多模态属性决策的代码搜索方法 |
CN114356301A (zh) * | 2022-01-13 | 2022-04-15 | 浙江大学 | 基于Eclipse插件的编程任务上下文自动构建方法及系统 |
CN116185379B (zh) * | 2022-11-17 | 2023-09-22 | 北京东方通科技股份有限公司 | 一种对代码托管平台进行优化的方法 |
CN116974619B (zh) * | 2023-09-22 | 2024-01-12 | 国网电商科技有限公司 | 一种软件物料清单库的构建方法、装置、设备及可读介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103927177A (zh) * | 2014-04-18 | 2014-07-16 | 扬州大学 | 基于LDA模型和PageRank算法建立特征接口有向图的方法 |
CN106407113A (zh) * | 2016-09-09 | 2017-02-15 | 扬州大学 | 一种基于Stack Overflow和commit库的bug定位方法 |
KR20170134191A (ko) * | 2016-05-26 | 2017-12-06 | 연세대학교 원주산학협력단 | 페이지랭크와 토픽 모델링을 이용한 소프트웨어 도메인 토픽 추출 시스템 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20190303141A1 (en) * | 2018-03-29 | 2019-10-03 | Elasticsearch B.V. | Syntax Based Source Code Search |
CN108717470B (zh) * | 2018-06-14 | 2020-10-23 | 南京航空航天大学 | 一种具有高准确度的代码片段推荐方法 |
CN110750240A (zh) * | 2019-08-28 | 2020-02-04 | 南京航空航天大学 | 一种基于序列到序列模型的代码片段推荐方法 |
-
2020
- 2020-08-26 CN CN202010872148.XA patent/CN112051986B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103927177A (zh) * | 2014-04-18 | 2014-07-16 | 扬州大学 | 基于LDA模型和PageRank算法建立特征接口有向图的方法 |
KR20170134191A (ko) * | 2016-05-26 | 2017-12-06 | 연세대학교 원주산학협력단 | 페이지랭크와 토픽 모델링을 이용한 소프트웨어 도메인 토픽 추출 시스템 |
CN106407113A (zh) * | 2016-09-09 | 2017-02-15 | 扬州大学 | 一种基于Stack Overflow和commit库的bug定位方法 |
Non-Patent Citations (1)
Title |
---|
"基于多特征权重分配的源代码搜索优化";李阵;《计算机软件技术》;20180310;第38卷(第3期);第812-817页 * |
Also Published As
Publication number | Publication date |
---|---|
CN112051986A (zh) | 2020-12-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112051986B (zh) | 基于开源知识的代码搜索推荐装置及方法 | |
CN109271529B (zh) | 西里尔蒙古文和传统蒙古文双文种知识图谱构建方法 | |
CN110298033B (zh) | 关键词语料标注训练提取系统 | |
CN106649260B (zh) | 基于评论文本挖掘的产品特征结构树构建方法 | |
CN110134946B (zh) | 一种针对复杂数据的机器阅读理解方法 | |
CN110298032A (zh) | 文本分类语料标注训练系统 | |
CN112307153B (zh) | 一种产业知识库自动构建方法、装置及存储介质 | |
CN101751455B (zh) | 采用人工智能技术自动产生标题的方法 | |
CN101645083B (zh) | 一种基于概念符号的文本领域的获取系统及方法 | |
CN112256939B (zh) | 一种针对化工领域的文本实体关系抽取方法 | |
CN112836509B (zh) | 一种专家系统知识库构建方法及系统 | |
CN111783394A (zh) | 事件抽取模型的训练方法、事件抽取方法和系统及设备 | |
CN108717433A (zh) | 一种面向程序设计领域问答系统的知识库构建方法及装置 | |
CN110175585B (zh) | 一种简答题自动批改系统及方法 | |
CN112307182B (zh) | 一种基于问答系统的伪相关反馈的扩展查询方法 | |
CN109145260A (zh) | 一种文本信息自动提取方法 | |
CN106407113A (zh) | 一种基于Stack Overflow和commit库的bug定位方法 | |
CN115759092A (zh) | 一种基于albert的网络威胁情报命名实体识别方法 | |
CN111460147A (zh) | 一种基于语义增强的标题短文本分类方法 | |
CN117574858A (zh) | 一种基于大语言模型的类案检索报告自动生成方法 | |
CN116108191A (zh) | 一种基于知识图谱的深度学习模型推荐方法 | |
CN113111645B (zh) | 一种媒体文本相似性检测方法 | |
CN114580557A (zh) | 基于语义分析的文献相似度确定方法及装置 | |
CN118446810A (zh) | 一种基于大语言模型的量化交易方法 | |
CN114169325B (zh) | 基于词向量表征的网页新词发现和解析方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |