一种基于LDA主题建模的软件可理解性确定方法及系统

文档序号:27391098发布日期:2021-11-15 22:18阅读:215来源:国知局
一种基于LDA主题建模的软件可理解性确定方法及系统
一种基于lda主题建模的软件可理解性确定方法及系统
技术领域
1.本发明涉及计算机软件处理领域,特别是涉及一种基于lda主题建模的软件可理解性确定方法及系统。


背景技术:

2.计算机软件与硬件相比,软件的一个特点是软件没有硬件或硬件所使用的材料具有的硬性物理规律,然而这也往往带来了一个问题:软件质量标准的统一与评价落实到真实工作中不到位,落实不严格。在国际通用的软件质量评价(如iso/iec定义的square)的准则中,虽然详细规定了软件质量的具体要求,但是就如naohiko tsuda等人所提的那样,这些准则十分笼统且抽象,往往不适合直接真实应用于开发实践中,或者根据其进行设计的要求准则不能准确的反应其思想。
3.软件的质量评价往往包括了代码可读性,软件的可维护性,软件的执行效率,软件缺陷存在效率等多个方面的评价指标。而我们单单看软件代码的可读性方面,其主要是代码规范程度和程序员的个人素养体现,经验丰富的软件开发工程师往往遵循业界既定的要求,比如命名规范,注释清晰具体且全面等等。这些无一不是软件质量中的软件可读性的体现,同时清晰易懂的代码函数变量名、详细准确的代码注释,也是软件可维护性的要求之一。并且,类、函数(或者方法)、变量的命名在软件从业者的思想中有如下共识:命名要与实际代表的意义相一致,即见名知意。
4.因此,面对此种情形,本方法提出了一种基于lda主题建模的软件类代码可理解性的评估方法,使用主题建模方法对面向对象的软件类进行建模分析,使用wordnet相似度计算算法来衡量一个类的名称与建模结果的相近程度,以此来衡量一个类代码的可理解性程度。


技术实现要素:

5.本发明的目的是提供一种基于lda主题建模的软件可理解性确定方法及系统,能够确定软件整体的可理解性。
6.为实现上述目的,本发明提供了如下方案:
7.一种基于lda主题建模的软件可理解性确定方法,所述方法包括:
8.获取待测软件的源代码;
9.对所述源代码进行静态扫描,分析软件中类以及类中的各函数和变量;
10.获取类所包含的函数和变量,并将所述函数和所述变量一一对应;
11.对所述类以及所述类所属的函数和变量进行数据清洗,得到映射好的词袋;
12.基于所述映射好的词袋进行主题建模,得到每个类对应的主题词;
13.衡量主题词与类的相似程度;
14.基于所述主题词与类的相似程度确定每个类文件的可理解性;
15.基于所述每个类文件的可理解性确定整个软件的可理解性。
16.可选的,所述方法在步骤“基于所述映射好的词袋进行主题建模,得到每个类对应的主题词”之后,步骤“衡量主题词与类的相似程度”之前,还包括:
17.对主题词进行优化,选取最优主题词。
18.可选的,所述衡量主题词与类的相似程度具体包括:
19.遍历类名称列表中的单词,记为class word;
20.遍历主题词列表中的词,记为topic word;
21.采用word net相似度计算方法计算所述class word和所述topic word的相似度;
22.遍历主题词列表中的下一个词,重复前一步骤,直到主题词列表中的词遍历完毕;
23.选取与class word相似度最高的topic word作为最终匹配词;
24.遍历类名称列表中的下一个单词,重复上述步骤,直到类名称列表中的所有单词遍历完毕。
25.可选的,所述分析软件中类以及类中的各函数和变量具体采用静态代码分析工具分析软件中类以及类中的各函数和变量。
26.可选的,对所述类以及所述类所属的函数和变量进行数据清洗,得到映射好的词袋具体包括:
27.对所述类以及所述类所属的函数和变量进行分词处理;
28.对分词处理后的类以及所述类所属的函数和变量进行停用词处理;
29.对停用词处理后的类以及所述类所属的函数和变量进行词性还原和词干提取;
30.将词性还原和词干提取后的类以及所述类所属的函数和变量,根据类和它的内部元素的从属关系,一一对应地将每个类映射为一个个词袋。
31.可选的,对所述类以及所述类所属的函数和变量进行分词处理具体是基于驼峰规则、下划线规则以及贪婪算法进行分词处理。
32.可选的,所述对停用词处理后的类以及所述类所属的函数和变量进行词性还原和词干提取具体是采用波特算法进行词性还原和词干提取。
33.可选的,基于所述映射好的词袋进行主题建模,得到每个类对应的主题词具体是采用lad算法进行主题建模。
34.可选的,所述基于所述每个类文件的可理解性确定整个软件的可理解性具体包括:
35.对每个类文件的可理解性采用k

means算法进行聚类划分,得到整个软件的可理解性。
36.本发明另外提供一种基于lda主题建模的软件可理解性确定系统,所述系统包括:
37.源代码获取模块,用于获取待测软件的源代码;
38.静态扫描模块,用于对所述源代码进行静态扫描,分析软件中类以及类中的各函数和变量;
39.函数及变量对应模块,用于获取类所包含的函数和变量,并将所述函数和所述变量一一对应;
40.数据清洗模块,用于对所述类以及所述类所属的函数和变量进行数据清洗,得到映射好的词袋;
41.主题建模模块,用于基于所述映射好的词袋进行主题建模,得到每个类对应的主
题词;
42.相似程度计算模块,用于衡量主题词与类的相似程度;
43.类文件的可理解性确定模块,用于基于所述主题词与类的相似程度确定每个类文件的可理解性;
44.软件的可理解性确定模块,用于基于所述每个类文件的可理解性确定整个软件的可理解性。
45.根据本发明提供的具体实施例,本发明公开了以下技术效果:
46.本发明中的方法首先通过获取类的函数(方法)、变量等能反应类所具有功能或者含义的代码片段等数据,确保取到了最能反应软件类功能含义的代码段,并在此阶段根据编程语言的特性和实验总结,自建了停用词列表,对数据进行了去除停用词等清洗处理,并将数据中的词映射为词袋,在此基础上,保证了主题建模结果的准确性,本发明完成了对代码的数据处理词干还原,词袋映射,主题建模,再到评估软件类的可理解性程度都是全自动完成,填补了没有方法具体地量化衡量一个软件类的可理解性程度这一空白。
附图说明
47.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
48.图1为本发明实施例基于lda主题建模的软件可理解性确定方法流程图;
49.图2为本发明实施例基于lda主题建模的软件可理解性确定方法框图;
50.图3为本发明实施例规则分词示意图;
51.图4为本发明实施例相似度计算结果示意图;
52.图5为本发明实施例聚类结果示意图;
53.图6为本发明实施例基于lda主题建模的软件可理解性确定系统结构示意图。
具体实施方式
54.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
55.本发明的目的是提供一种基于lda主题建模的软件可理解性确定方法及系统确定软件整体的可理解性。
56.为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。
57.如图1和图2所示,本发明提供基于lda主题建模的软件可理解性确定方法,包括如下步骤:
58.步骤101:获取待测软件的源代码。
59.具体的,是首先确定待评估软件(java语言编写)并获取其完整的软件源代码。
60.步骤102:对所述源代码进行静态扫描,分析软件中类以及类中的各函数和变量。
61.步骤103:获取类所包含的函数和变量,并将所述函数和所述变量一一对应。
62.具体的,对待评估软件源代码进行静态扫描,利用已有的静态代码分析工具分析软件中类以及类中的各函数(方法)、变量,获取类所包含的函数、变量,并将每个类与类内部元素一一对应起来。
63.步骤104:对所述类以及所述类所属的函数和变量进行数据清洗,得到映射好的词袋。
64.具体包含如下步骤:
65.s1041:在步骤103的基础上,在获取的类以及所属元素(函数或方法和变量)上,对类以及其所属的函数变量名等数据进行分词处理,分词主要用到了基于规则分词如驼峰规则和下划线规则,除此之外少部分还用到了贪婪算法来识别单词。由此,将上述一个类中的元素分词处理后,逐个加入一个列中,就获取了单词集合形式的类元素列表。基于规则分词如图3所示。
66.s1042:在步骤1041的基础上,进行去除停用词处理。首先根据java语言的特点,选择部分保留字如int等,再加上多次实验总结出的一些应该去除的词,如get等,组成一个停用词列表。因为一些与类主题无关的词也会被放入我们的数据中,这些词对主题建模的影响非常大,这些的词本身意义并不大,且与类的主题关联度比较小,因此将确定的停用词去除掉。
67.s1043:在步骤1042得到的去除过停用词的数据后,对数据进一步处理,这里的处理主要是进行词性还原和词干提取,此处主要用到了波特算法来完成这个步骤。进行词干提取和词性还原是十分必要及关键的一步,对主题建模结果具有十分大的影响力。
68.s1044:在步骤1043中,得到了软件所有的每个类以及类所属的函数(变量)、方法等数据,在此数据基础上,对数据进一步处理,将数据根据类与它的内部元素的从属关系,一一对应地将每个类映射为一个个词袋,即一篇类文本的所包含的函数等元素中的单词,放入对应的词袋中,不考虑其词法和语序的问题,即每个词语都是独立的。使用词袋模型,可以理解为将一个类元素列表映射为向量形式,表示单词在类中的出现频率,便于下一步建模使用。
69.步骤105:基于所述映射好的词袋进行主题建模,得到每个类对应的主题词。
70.在步骤104的基础上,使用映射好的词袋进行主题建模。主题建模部分本发明采用lda算法来完成,对于lda近似求解,本发明采用吉布斯采样法来近似求解。在lda建模过程中,超参数设计采用默认值0.02,而对于java语言编写的软件,对于主题词词组个数而言,采用三组主题词,最终选取最优的建模结果即最前一组的主题词作为建模的最终结果去计算相似度。在主题建模过程中的迭代次数,我们并未计算最优的迭代次数,因为每个类的最优迭代次数都是不确定的,需要根据类文本的具体内容和长度来定,因此,我们根据实验的结果,调整到迭代次数为2000次时,获得了适用于多次实验的最优迭代次数。模型将数据即步骤104中的映射好的词袋输入,根据设定的参数,建立的模型会选择最可能反应本文档的单词输出,即得到了主题词。我们再进行优化,选择最优的主题词,使结果更趋近于最优。
71.步骤106:衡量主题词与类的相似程度。
72.经过步骤105的主题建模处理,我们得到了每个类对应的主题词,我们在此处使用
单词相似度来衡量主题词与类名的相近程度。此处用的计算方法且wordnet单词相似度计算方法,它代表的是单词在词典树中的距离,计算的数值分布在0

1之间,越靠近1代表主题词与类名越相近,我们就认为此软件类的语义可理解程度是比较好,反之则较差。获得java软件类的可理解性具体指标的步骤如下:
73.s1061:遍历出类名称列表中的第一个单词,记为classword。
74.s1062:遍历主题词列表中的词,记为topicword。
75.s1063:使用wordnet相似度计算方法使得topicword与classword进行单词间的相似度计算。
76.s1064:遍历主题词列表中的词(替换topicword),重复前一步骤,直至主题词列表词遍历完毕。并选取与classword相似度最高的topicword作为最终匹配词。
77.s1065:再遍历出类名称列表中的下一个classword,从第1步开始,重复上述操作即可。
78.在此处,本发明体提出了两个具体衡量可理解性的指标,如下:
79.平均相似度:mean_similarity=similarity/n,其中similarity为n个单词与对应单词的相似度之和,n为为对应类名中单词的个数。
80.类名单词平均命中率:mean_number=number/n,其中,number为上述的相似度大于0.8的单词个数,n为类名中单词个数。
81.平均相似度分布如附图4所示。具体实验结果如表1所示,举例来说,对于“applicationmapping.java”这个类,我们经过前5个步骤得到的结果为[“applic”,“map”]。这与类名经过步骤4的词干提取后的结果是完全一致的,因此其评分为[1.0,1.0]。
[0082]
表1部分实验结果示例表
[0083]
类名平均相似度平均命中率containerbase1.01applicationcontext0.6250.5frameworklistener0.60.5applicationmapping1.01.0applicationhttpresponse0.7037030.66666asynccontextimpl0.7037030.66666namingcontextlistener0.750.66
[0084]
步骤107:基于所述主题词与类的相似程度确定每个类文件的可理解性。
[0085]
步骤108:基于所述每个类文件的可理解性确定整个软件的可理解性。
[0086]
经过步骤106的相似度计算,我们得到了软件所包含的每个类文件的可理解性程度,为了得到整体软件的可理解性程度,我们将这些得到的每个软件类的可理解性数值进行聚类划分,来判断软件整体可理解性的好坏。此处选择使用k

means算法来完成聚类,聚类的输入是一个软件中多个样本软件类经过步骤106计算得到的两个可理解性指标的数值,建立一个二维坐标,横轴为平均相似度,纵轴为平均命中个数。目前的簇个数需要手动指定,聚类算法会计算出最优的聚类情况,并得出每个簇的中心点所在,分好的类别中,类别(或者说簇)中心点坐标越接近(1.0,1.0),代表了此类别(簇)所包括的软件类的可理解越好。整体的评价则再此基础上,根据落在不同类别(簇)的软件类的个数的多少来判定整
体软件可理解性的好坏。如附图5所示,图中,左边为步骤106实验结果分布,经过步骤108聚类后,分为5类,越接近右上方向的类别(或者说簇)中的样本软件类的可理解性程度越高。
[0087]
图6为本发明实施例基于lda主题建模的软件可理解性确定系统结构示意图,如图6所示,所述系统包括:
[0088]
源代码获取模块201,用于获取待测软件的源代码;
[0089]
静态扫描模块202,用于对所述源代码进行静态扫描,分析软件中类以及类中的各函数和变量;
[0090]
函数及变量对应模块203,用于获取类所包含的函数和变量,并将所述函数和所述变量一一对应;
[0091]
数据清洗模块204,用于对所述类以及所述类所属的函数和变量进行数据清洗,得到映射好的词袋;
[0092]
主题建模模块205,用于基于所述映射好的词袋进行主题建模,得到每个类对应的主题词;
[0093]
相似程度计算模块206,用于衡量主题词与类的相似程度;
[0094]
类文件的可理解性确定模块207,用于基于所述主题词与类的相似程度确定每个类文件的可理解性;
[0095]
软件的可理解性确定模块208,用于基于所述每个类文件的可理解性确定整个软件的可理解性。
[0096]
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的系统而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
[0097]
本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处。综上所述,本说明书内容不应理解为对本发明的限制。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1