一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

注释识别方法、装置、设备及计算机可读存储介质与流程

2022-06-11 22:11:32 来源:中国专利 TAG:


1.本技术涉及计算机编程技术领域,涉及但不限于一种注释识别方法、装置、设备及计算机可读存储介质。


背景技术:

2.软件代码通常由两部分组成:代码和注释。其中,代码为符合程序设计语言专门语法规范的字符串,可经编译、解释等工具转换,在计算机上执行,表达了软件的业务逻辑怎样实现的过程。注释为符合人类自然语言语法的字符串,一般存在于代码文件的头部、函数头部、程序块内部等,用于解释业务逻辑实现的思路、原因等,在程序执行过程中不起作用。
3.软件代码中注释的提取,对于分析软件开发过程质量、识别注释与代码实现的不一致、分析注释中的同一话题与多处代码的关系等应用具有重要价值,相关技术中的注释识别方法,针对不同的编程语言,需要设计不同的方案实现,不具备通用性,尤其对于采用大量不同编程语言开发的、存在动态升级变更的软件项目,识别能力不足,而且对于书写不规范的注释可能发生误判,导致注释识别准确率低。


技术实现要素:

4.有鉴于此,本技术提供一种注释识别方法、装置、设备及计算机可读存储介质,至少解决在无法预知具体编程语言时,注释识别准确率低的问题。
5.本技术实施例的技术方案是这样实现的:
6.本技术的至少一个实施例提供了一种注释识别方法,所述方法包括:
7.对获取的待识别的程序代码进行分割处理,得到至少一个文字行,所述程序代码包括代码和注释;
8.根据所述文字行的行首字符确定所述文字行的行开始符,并根据所述文字行的行末字符确定所述文字行的行结束符;
9.基于所述行开始符和所述行结束符,确定所述程序代码中的注释标识;
10.基于所述注释标识对所述程序代码进行注释识别,得到识别结果。
11.此外,根据本技术的至少一个实施例,所述对获取的待识别的程序代码进行分割处理,得到至少一个文字行,包括:
12.获取待识别的程序代码和预设的行结束标识;
13.根据所述行结束标识对所述程序代码进行分割处理,得到多个分割行;
14.从所述多个分割行中删除空白行,得到至少一个文字行,所述空白行为只包含空白字符的分割行。
15.此外,根据本技术的至少一个实施例,所述根据所述文字行的行首字符确定所述文字行的行开始符,包括:
16.提取各个文字行中的第一个非空白字符;
17.当确定当前文字行的第一个非空白字符不为英文字符时,将当前文字行的第一个
非空白字符确定为当前文字行的行开始符;
18.当确定当前文字行的第一个非空白字符为英文字符时,将空字符确定为当前文字行的行开始符。
19.此外,根据本技术的至少一个实施例,所述根据所述文字行的行末字符确定所述文字行的行结束符,包括:
20.提取各个文字行中的最后一个非空白字符;
21.当确定当前文字行的最后一个非空白字符不为英文字符、且不为中文字符时,将当前文字行的最后一个非空白字符确定为当前文字行的行结束符;
22.当确定当前文字行的最后一个非空白字符为英文字符或中文字符,且当前文字行存在行开始符时,将空字符确定为当前文字行的行结束符;
23.当确定当前文字行的最后一个非空白字符为英文字符或中文字符,且当前文字行不存在行开始符时,将当前文字行的下一个文字行的行结束符确定为当前文字行的行结束符。
24.此外,根据本技术的至少一个实施例,所述基于所述行开始符和所述行结束符,确定所述程序代码中的注释标识,包括:
25.基于所述文字行包括的字符,确定文字行中包括的目标分词的个数,所述目标分词的词性不为名词;
26.基于各个文字行的行开始符和目标分词的个数,确定注释开始标识,并基于各个文字行的行结束符和目标分词的个数,确定注释结束标识;
27.将所述注释开始标识和所述注释结束标识确定为注释标识。
28.此外,根据本技术的至少一个实施例,所述基于所述文字行包括的字符,确定所述文字行中包括的目标分词的个数之前,所述方法还包括:
29.按照预设划分规则对当前文字行中包括的字符进行分词处理,得到当前文字行的各个分词;
30.获取所述各个分词的词性。
31.此外,根据本技术的至少一个实施例,所述基于各个文字行的行开始符和目标分词的个数,确定注释开始标识,包括:
32.基于各个文字行的目标分词个数和各个文字行的行开始符,确定不为空字符的各个行开始符的总支持数,所述行开始符的总支持数为所述行开始符对应的各个文字行中包括的目标分词个数的总和;
33.确定各个行开始符对应的目标文字行的总行数,所述目标文字行为只包括名词分词的文字行;
34.计算所述不为空字符的各个行开始符的总支持数与对应的总行数的差值,得到不为空字符的各个行开始符的开始支持数;
35.将最大开始支持数对应的行开始符确定为注释开始标识。
36.此外,根据本技术的至少一个实施例,所述基于各个文字行的行结束符和目标分词的个数,确定注释结束标识,包括:
37.基于各个文字行的目标分词个数和各个文字行的行结束符,确定不为空字符的各个行结束符的总支持数,所述行结束符的总支持数为所述行结束符对应的各个文字行中包
括的目标分词个数的总和;
38.确定各个行结束符对应的目标文字行的总行数,所述目标文字行为只包括名词分词的文字行;
39.计算所述不为空字符的各个行结束符的总支持数与对应的总行数的差值,得到不为空字符的各个行结束符的结束支持数;
40.将最大结束支持数对应的行结束符确定为注释结束标识。
41.此外,根据本技术的至少一个实施例,所述基于所述注释标识对所述程序代码进行注释识别,得到识别结果,包括:
42.将行开始符为所述注释开始标识的文字行添加至第一文字行集;
43.将行结束符为所述注释结束标识的文字行添加至第二文字行集;
44.将所述第一文字行集和所述第二文字行集的并集确定为识别得到的注释行。
45.此外,根据本技术的至少一个实施例,所述将所述第一文字行集和所述第二文字行集的并集确定为识别得到的注释行之后,所述方法还包括:
46.将所述程序代码中除所述注释行以外的文字行确定为识别得到的代码行。
47.本技术的至少一个实施例提供了一种注释识别装置,所述装置包括:
48.分割模块,用于对获取的待识别的程序代码进行分割处理,得到至少一个文字行,所述程序代码包括代码和注释;
49.第一确定模块,用于根据所述文字行的行首字符确定所述文字行的行开始符,并根据所述文字行的行末字符确定所述文字行的行结束符;
50.第二确定模块,用于基于所述行开始符和所述行结束符,确定所述程序代码中的注释标识;
51.识别模块,用于基于所述注释标识对所述程序代码进行注释识别,得到识别结果。
52.本技术的至少一个实施例提供了一种注释识别设备,包括:
53.处理器;以及
54.存储器,用于存储可在所述处理器上运行的计算机程序;
55.其中,所述计算机程序被处理器执行时实现上述注释识别方法的步骤。
56.本技术的至少一个实施例提供了一种计算机可读存储介质,存储有计算机可执行指令,所述计算机可执行指令配置为执行上述注释识别方法的步骤。
57.本技术实施例提供一种注释识别方法、装置、设备及计算机可读存储介质,所述方法包括:对获取的待识别的程序代码进行分割处理,得到至少一个文字行,所述程序代码包括代码和注释;根据所述文字行的行首字符确定所述文字行的行开始符,并根据所述文字行的行末字符确定所述文字行的行结束符;基于所述行开始符和所述行结束符,确定所述程序代码中的注释标识;基于所述注释标识对所述程序代码进行注释识别,得到识别结果。本技术能够在不预知具体编程语言的前提下,实现对程序代码中的注释进行识别,不依赖具体编程语言,具有通用性,能够提高对无法预知具体编程语言的注释识别的准确率。
附图说明
58.在附图(其不一定是按比例绘制的)中,相似的附图标记可在不同的视图中描述相似的部件。附图以示例而非限制的方式大体示出了本文中所讨论的各个实施例。
59.图1为本技术实施例提供的注释识别方法的一种实现流程示意图;
60.图2为包含代码和注释的程序代码;
61.图3为本技术实施例提供的注释识别方法的另一种实现流程示意图;
62.图4为本技术实施例提供的注释识别方法的再一种实现流程示意图;
63.图5为本技术实施例提供的注释识别装置的组成结构示意图;
64.图6为本技术实施例提供的注释识别设备的组成结构示意图。
具体实施方式
65.为了使本技术的目的、技术方案和优点更加清楚,下面将结合附图对本技术作进一步地详细描述,所描述的实施例不应视为对本技术的限制,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本技术保护的范围。
66.在以下的描述中,涉及到“一些实施例”,其描述了所有可能实施例的子集,但是可以理解,“一些实施例”可以是所有可能实施例的相同子集或不同子集,并且可以在不冲突的情况下相互结合。
67.在以下的描述中,所涉及的术语“第一\第二\第三”仅仅是区别类似的对象,不代表针对对象的特定排序,可以理解地,“第一\第二\第三”在允许的情况下可以互换特定的顺序或先后次序,以使这里描述的本技术实施例能够以除了在这里图示或描述的以外的顺序实施。
68.除非另有定义,本文所使用的所有的技术和科学术语与属于本技术的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述本技术实施例的目的,不是旨在限制本技术。
69.基于相关技术所存在的问题,本技术实施例提供一种注释识别方法,所述方法应用于注释识别设备。本技术实施例提供的方法可以通过计算机程序来实现,该计算机程序在执行的时候,完成本技术实施例提供的注释识别方法中各个步骤。在一些实施例中,该计算机程序可以注释识别设备中的处理器执行。图1为本技术实施例提供的注释识别方法的一种实现流程示意图,如图1所示,所述注释识别方法包括以下步骤:
70.步骤s101,对获取的待识别的程序代码进行分割处理,得到至少一个文字行。
71.本技术实施例中,所述注释识别设备可以是用户设备(user equipment,u e)、移动设备、终端、笔记本电脑、平板电脑、台式计算机等能够进行注释识别的设备。
72.获取到的待识别的程序代码包括代码和注释。代码为符合程序设计语言专门语法规范的字符串,可经编译、解释等工具转换,在计算机上执行,表达了软件的业务逻辑怎样实现的过程。注释为符合人类自然语言语法的字符串,一般存在于代码文件的头部、函数头部、程序块内部等,用于解释业务逻辑实现的思路、原因等,在程序执行过程中不起作用。图2为包含代码和注释的程序代码,参见图2,其中,文字行第9行至第15行为一段代码,文字行第5行至第8行为一段注释。
73.本技术实施例中,获取到的待识别的程序代码为文本文件。美国信息交换标准代码(ascii,american standard code for information interchange)的字符“\n”可用于判定单行文字的结束,基于此,利用字符“\n”对程序代码中不同行的文字进行分割,得到至少一个文字行。
74.举例说明,本技术实施例获取到的程序代码如下:
75.//this is a function
76.int add(int a,int b)
77.{int move=a b;
78.return move;}
79./*this is a single line comment*/
80./*
81.this
82.is
83.a
84.multiline
85.comments
86.*/
87.基于换行符“\n”分割得到的文字行如表1所示:
88.表1分割得到的文字行
89.//this is a functionint add(int a,int b){int move=a b;return move;}/*this is a single line comment*//*thisisamultilinecomments*/
90.在实际实现时,为方便存储起见,在分割的同时为分割得到的文字行进行编号,将文字行和该文字行对应的编号以列表的形式存储。列表的第i行元素记为《wl-i,ln(wl-i)》,其中,第i个变量wl-i中存储第i行文字行的内容,该文字行对应的行号存储在变量ln(wl-i)中。则得到有序列表wl=(《wl-1,ln(wl-1)》,

,《wl-n,ln(wl-n)》)
91.上述获取到的程序代码,分割编号得到的列表如下:
92.wl={《“//this is a function”,1》,《“int add(int a,int b)”,2》,《“{int move=a b;”,3》,《“return move;}”,4》,《“/*this is a single line comment*/”,5》,《“/*”,6》,《“this”,7》,《“is”,8》,《“a”,9》,《“multiline”,10》,《“comments”,11》,《“*/”,12》}
93.为了便于理解,以表格的形式对列表wl进行展示,列表wl如表2所示:
94.表2文字行的存储列表
[0095][0096][0097]
步骤s102,根据所述文字行的行首字符确定所述文字行的行开始符,并根据所述文字行的行末字符确定所述文字行的行结束符。
[0098]
ascii码使用指定的7位或8位二进制数组合来表示128或256种可能的字符。标准ascii码也叫基础ascii码,使用7位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0到9、标点符号,以及在美式英语中使用的特殊控制字符。其中:
[0099]
ascii码包括控制字符(或通信专用字符)和可显示字符,其中:
[0100]
0~31及127(共33个)是控制字符或通信专用字符,其余为可显示字符,如控制符:lf(换行)、cr(回车)、ff(换页)、del(删除)、bs(退格)、bel(响铃)等;通信专用字符:soh(文头)、eot(文尾)、ack(确认)等。ascii值为8、9、10和13分别为退格符、制表符、换行符和回车符,它们并没有特定的图形显示,但对文本显示存在不同的影响。
[0101]
32~126(共95个)是可显示字符,其中32是空格符,48~57为0到9十个阿拉伯数字。65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。
[0102]
在编程序时,一般选用符号作为注释的注释标识,不会将控制字符或通信专用字符、空格符、数字和英文字母作为注释标识,因此,行开始符号和行结束符号可以为ascii中除0~32、48~57、65~90、97~122、127以外的字符,即可以为33~47、58~64、91~96、123~126中的字符。
[0103]
当单行注释(即行注释)时,注释标记可以只有注释开始标识,但一般程序代码都支持多行注释(即段注释),因此,所述注释标识包括注释开始标识和注释结束标识,所述注释开始标识表征注释开始,所述注释结束标识表征注释结束,注释开始标识和注释结束标识之间的文字行均为注释。
[0104]
在标准的程序代码中,注释开始标识一般都在行首,基于此,根据当前文字行的行
首字符,确定当前文字行的行开始符,例如,将第1行文字行的行首字符“\”确定为第1行的行开始符;当当前文字行的行首字符为英文字符时,确定当前文字行的行开始符为null,即当前文字行不存在行开始符。
[0105]
在标准的程序代码中,注释结束标识一般都在行尾,基于此,根据当前文字行的行末字符,确定当前文字行的行结束符,例如,将第2行的行末字符“)”确定为第2行的行结束符;当当前文字行的行末字符为英文字符或中文字符时,此时,需要进一步根据后面文字行的行末字符确定当前文字行的行结束符。
[0106]
步骤s103,基于所述行开始符和所述行结束符,确定所述程序代码中的注释标识。
[0107]
各个文字行的行开始符可以不同,各个文字行的行结束符也可以不同,从多种不同的行开始符中,按照一定规则确定一个行开始符作为注释开始标识,从多种不同的行结束符中,按照一定规则确定一个行结束符作为注释结束标识。从而得到包括注释开始标识和注释结束标识的注释标识。
[0108]
仍以上述程序代码为例,例如,确定的注释开始标识为“/”,注释结束标识为“/”。其中,所述注释开始标识和所述注释结束标识可以相同,也可以不同。
[0109]
步骤s104,基于所述注释标识对所述程序代码进行注释识别,得到识别结果。
[0110]
根据步骤s103确定的注释开始标识,在程序代码中识别出注释的开始位置,根据注释结束标识,在程序代码中识别出注释的结束位置,开始位置和结束位置之间的程序代码即为该程序代码的注释部分,用于对代码部分进行解释说明。除了注释部分的其他部分,即为该程序代码的代码部分,该代码部分为程序代码实际运行的部分。
[0111]
例如,以注释开始标识为“/”,注释结束标识为“/”,识别得到的注释为:
[0112]
//this is a function
[0113]
/*this is a single line comment*/
[0114]
/*
[0115]
this
[0116]
is
[0117]a[0118]
multiline
[0119]
comments
[0120]
*/
[0121]
本技术实施例中注释识别方法自动执行,无需预知具体的编程语言,相比于手动识别,能够大大提高注释识别的准确率,并且能够提高识别效率。
[0122]
本技术实施例提供的注释识别方法,包括:对获取的待识别的程序代码进行分割处理,得到至少一个文字行,所述程序代码包括代码和注释;根据所述文字行的行首字符确定所述文字行的行开始符,并根据所述文字行的行末字符确定所述文字行的行结束符;基于所述行开始符和所述行结束符,确定所述程序代码中的注释标识;基于所述注释标识对所述程序代码进行注释识别,得到识别结果。本技术能够在不预知具体编程语言的前提下,实现对程序代码中的注释进行识别,不依赖具体编程语言,具有通用性,能够提高对无法预知具体编程语言的注释识别的准确率。
[0123]
在一些实施例中,上述步骤s101“对获取的待识别的程序代码进行分割处理,得到
至少一个文字行”,可以通过以下步骤来实现。
[0124]
步骤s1011,获取待识别的程序代码和预设的行结束标识。
[0125]
本技术实施例中,待识别的程序代码可以由用户输入至注释识别设备中,也可以由用户指定路径,由注释识别设备按照指定路径获取,还可以由注释识别设备基于开始识别指令,按照预设条件自动获取。
[0126]
本技术实施例中,可以按行对程序代码进行分割,预设的行结束标识可以为换行符“\n”。
[0127]
步骤s1012,根据所述行结束标识对所述程序代码进行分割处理,得到多个分割行。
[0128]
基于换行符“\n”,对获取到的待识别的程序代码按行分割方式进行分割处理,每次分割得到一个分割行,对整个程序代码进行分割处理,得到多个分割行。
[0129]
在实际实现时,可能存在编写代码不规范,将多行代码写在一行、未缩进等,或者保存为文本文件时可能出现格式不兼容的情况,因此,在执行步骤s1012之前,可以先对待识别的程序代码进行标准化处理,例如,编写代码时将{int move=a b;return move;}写在了一行,按照编码规范对其进行标准化处理,得到
[0130][0131]
经过标准化处理,能够使程序代码便于查看,增强可读性。
[0132]
步骤s1013,从所述多个分割行中删除空白行,得到至少一个文字行。
[0133]
所述空白行为只包含空白字符的分割行,即为空行。空白字符包括空格符、水平制表符“\t”、垂直制表符“\v”、回车符“\r”、换行符“\n”和换页符“\f”,空白字符在程序代码中占位,但却没有文字。空白行可以包括空格符、水平制表符“\t”、垂直制表符“\v”、回车符“\r”、换行符“\n”和换页符“\f”这些空白字符中的至少一种,除空白字符外,不包括其他字符。
[0134]
在一些实施例中,程序代码中可能将不同代码块之间使用空白行分隔,空白行不是代码行,但作为注释行也不具有任何实际意义。可对仅用于分隔、无实际含义的空白行进行删除。
[0135]
例如,程序代码中的一个片段如下:
[0136]
//this is a function
[0137]
int add(int a,int b)
[0138]
{int move=a b;
[0139]
return move;}
[0140]
按照换行符“\n”对上述程序片段按行进行分割,得到5个分割行,其中第2个分割行中仅包括空格符,其在文本中占位,但却没有文字,该第2行分割行即为空白行。删除第2个分割行,得到所有的非空白分割行:
[0141]
//this is a function
[0142]
int add(int a,int b)
[0143]
{int move=a b;
[0144]
return move;}
[0145]
对空白行进行删除,不将空白行存储在wl列表中,不仅能够节省存储空间,而且能够减少识别的行数,提高识别效率。
[0146]
在一些实施例中,图1所示实施例中步骤s102中的“根据所述文字行的行首字符确定所述文字行的行开始符”,可以通过下述步骤来实现。
[0147]
步骤s1021,提取各个文字行中的第一个非空白字符。
[0148]
步骤s1022,确定当前文字行的第一个非空白字符是否为英文字符。
[0149]
当确定当前文字行的第一个非空白字符不为英文字符时,表明该第一个非空白字符可能为注释开始符号,当前文字行可能为注释,此时,进入步骤s1023;当确定当前文字行的第一个非空白字符为英文字符时,表明当前文字行为代码,进入步骤s1024。
[0150]
步骤s1023,将当前文字行的第一个非空白字符确定为当前文字行的行开始符。
[0151]
步骤s1024,将空字符确定为当前文字行的行开始符。
[0152]
在一些实施例中,图1所示实施例中步骤s102中的“根据所述文字行的行末字符确定所述文字行的行结束符”,可以通过下述步骤来实现。
[0153]
步骤s1025,提取各个文字行中的最后一个非空白字符。
[0154]
步骤s1026,确定当前文字行的最后一个非空白字符是否为英文字符,以及是否为中文字符。
[0155]
当确定当前文字行的最后一个非空白字符不为英文字符、且不为中文字符时,表明该最后一个非空白字符可能为注释结束符号,当前文字行可能为注释,此时,进入步骤s1027;当确定当前文字行的最后一个非空白字符为英文字符或者为中文字符,且当前文字行存在行开始符时,表明当前文字行可能为注释,但是否为注释由行开始符确定,此时将当前文字行的行结束符设置为空字符,进入步骤s1028;当确定当前文字行的最后一个非空白字符为英文字符或者为中文字符,且当前文字行不存在行开始符时,表明当前文字行为多行注释的中间行,此时,进入步骤s1029。
[0156]
步骤s1027,将当前文字行的最后一个非空白字符确定为当前文字行的行结束符。
[0157]
步骤s1028,将空字符确定为当前文字行的行结束符。
[0158]
步骤s1029,将当前文字行的下一个文字行的行结束符确定为当前文字行的行结束符。
[0159]
以上述程序代码为例,根据各个文字行的行首字符确定各个文字行的行开始符,记为sc,根据各个文字行的行末字符确定各个文字行的行结束符,记为ec,得到的结果如表3所示:
[0160]
表3文字行的行开始符和行结束符
[0161][0162]
需要说明的是,在表3中,将空字符表示为null。
[0163]
在一些实施例中,图1所示实施例中步骤s103“基于所述行开始符和所述行结束符,确定所述程序代码中的注释标识”,可以通过下述步骤s1031至步骤s1036来实现。
[0164]
步骤s1031,按照预设划分规则对当前文字行中包括的字符进行分词处理,得到当前文字行的各个分词。
[0165]
步骤s1032,获取所述各个分词的词性。
[0166]
在实际实现时,可根据预先构建的领域知识图谱(kg,knowledge graph)和领域动作模型集(ag,action model gather),和文本分词软件进行分词处理。可基于文本词性标注软件和基于斯坦福大学开源自然语言处理工具实现的词性标注结果,来确定各个分词的词性。上述程序代码分词结果及各个分词的词性,如表4所示。
[0167]
表4各个文字行的各个分词及各个分词的词性
[0168][0169]
步骤s1033,基于所述文字行包括的字符,确定所述文字行中包括的目标分词的个数。
[0170]
其中,所述目标分词的词性不为名词。
[0171]
例如,第1个文字行的非名词词性的分词包括this,is和a这三个,则目标分词为this,is和a;该行的目标分词的个数为3。又如,第4行文字行的非名词词性的分词不存在,即不存在目标分词;该行的目标分词的个数为0个。
[0172]
步骤s1034,基于各个文字行的行开始符和目标分词的个数,确定注释开始标识。
[0173]
步骤s1035,基于各个文字行的行结束符和目标分词的个数,确定注释结束标识。
[0174]
由于程序代码中可能存在33~47、58~64、91~96、123~126中多个字符,因此确定的行开始符、行结束符均可能为多种。本技术实施例中,分别计算每种行开始符、行结束符的支持数,将多个行开始符中支持数最大的行开始符作为注释开始标识,将多个行结束符中支持数最大的行结束符作为注释结束标识。
[0175]
步骤s1036,将所述注释开始标识和所述注释结束标识确定为注释标识。
[0176]
本技术实施例中,在不预知具体编程语言的前提下,通过获取各个文字行的行开始符号和行结束符号,基于行开始符号和行结束符号的支持数确定注释标识,能够实现不依赖编程语言的注释识别,具有通用性,能够提高对不预知具体编程语言的注释识别的准确率。
[0177]
在一些实施例中,上述步骤s1034“基于各个文字行的行开始符和目标分词的个数,确定注释开始标识”可以由以下步骤实现:
[0178]
步骤s10341,基于各个文字行的目标分词个数和各个文字行的行开始符,确定不
为空字符的各个行开始符的总支持数。
[0179]
首先,确定各个行开始符在各个文字行的支持数,然后将同一个行开始符在各个文字行的各个支持数相加求和,得到各个行开始符的总支持数。即所述行开始符的总支持数为所述行开始符对应的各个文字行中包括的目标分词个数的总和。
[0180]
各个行开始符在各个行的支持数 support(cs)如表5所示。
[0181]
表5各个行开始符和各个行结束符在各个行的支持数
[0182][0183][0184]
表5中, support(cs)表示各个行开始符在各个行的支持数, support(ce)表示各个行结束符在各个行的支持数。
[0185]
参见表5,第1个文字行的目标分词的个数为3,其行开始符为

/’,则行开始符

/’在第1行的支持数为3;确定行开始符

/’在各个行的支持数,得到在第5行的支持数为3,在第6行的支持数为0。从而得到行开始符

/’的总支持数support(

/’)=3 3 0=6。
[0186]
对每个行开始符确定其总支持数,得到行开始符

{’的总支持数support(

{’)=0 0=0;行开始符

*’的支持数support(

*’)=0。
[0187]
步骤s10342,确定各个行开始符对应的目标文字行的总行数。
[0188]
这里,所述目标文字行为只包括名词分词的文字行。
[0189]
例如,第1行中包括非名词词性的分词,则该行不是目标文字行。第3行中所有分词的词性均为名词,确定第3行为目标文字行。由表5得到,目标文字行为第3、4、10、11行。其中,第3行为行开始符

{’的目标文字行,第4、10、11行的行开始符不存在。
[0190]
行开始符

/’的目标文字行不存在,则行开始符

/’对应的目标文字行的总行数为0。行开始符

{’的目标文字行为第3行,则行开始符

{’对应的目标文字行的总行数为1。行开始符

*’的目标文字行不存在,则行开始符

*’对应的目标文字行的总行数为0。
[0191]
步骤s10343,计算所述不为空字符的各个行开始符的总支持数与对应的总行数的差值,得到不为空字符的各个行开始符的开始支持数。
[0192]
将各个行开始符的总支持数与对应的总行数作差,得到不为空字符的各个行开始符的开始支持数。
[0193]
例如,行开始符

/’的总支持数与对应的总行数作差,得到行开始符

/’的开始支持数sup(

/’)=6-0=6;行开始符

{’的开始支持数sup(

{’)=0-1=-1;行开始符

*’的开始支持数sup(

*’)=0-0=0。
[0194]
步骤s10344,将最大开始支持数对应的行开始符确定为注释开始标识。
[0195]
在行开始符

/’、

{’和

*’中,开始支持数最大的行开始符为

/’,则确定注释开始标识为

/’。
[0196]
在一些实施例中,上述步骤s1035“基于各个文字行的行开始符和目标分词的个数,确定注释开始标识”可以由以下步骤实现:
[0197]
步骤s10351,基于各个文字行的目标分词个数和各个文字行的行结束符,确定不为空字符的各个行结束符的总支持数。
[0198]
首先,确定各个行结束符在各个文字行的支持数,然后将同一个行结束符在各个文字行的各个支持数相加求和,得到各个行结束符的总支持数。即所述行结束符的总支持数为所述行结束符对应的各个文字行中包括的目标分词个数的总和。
[0199]
各个行结束符在各个行的支持数 support(ce)如表5所示。
[0200]
参见表5,第1个文字行的目标分词的个数为3,其行结束符为null(即空字符)。确定行结束符

/’在各个行的支持数,得到在第5行的支持数为3在第7、8、9行的支持数均为1,在第10、11、12行的支持数均为0,从而得到行结束符

/’的总支持数support(

/’)=3 1 1 1 0 0 0=6。
[0201]
对每个行结束符确定其总支持数,得到行结束符

)’的总支持数support(

)’)=1;行结束符

;’的支持数support(

;’)=0;行结束符

}’的支持数support(

}’)=0;行结束符

*’的支持数support(

*’)=0。
[0202]
步骤s10352,确定各个行结束符对应的目标文字行的总行数。
[0203]
这里,所述目标文字行为只包括名词分词的文字行。
[0204]
例如,第1行中包括非名词词性的分词,则该行不是目标文字行。第3行中所有分词的词性均为名词,确定第3行为目标文字行。由表5得到,目标文字行为第3、4、10、11行。其中,第3行为行结束符

;’的目标文字行,第4行为行结束符

}’的目标文字行,第10、11行均为行结束符

/’的目标文字行。
[0205]
行结束符

/’对应的目标文字行的总行数为2。行结束符

)’对应的目标文字行的
总行数为0。行结束符

;’对应的目标文字行的总行数为1。行结束符

}’对应的目标文字行的总行数为1。行结束符

*’对应的目标文字行的总行数为0。
[0206]
步骤s10353,计算所述不为空字符的各个行结束符的总支持数与对应的总行数的差值,得到不为空字符的各个行结束符的结束支持数。
[0207]
将各个行结束符的总支持数与对应的总行数作差,得到不为空字符的各个行结束符的结束支持数。
[0208]
例如,行结束符

/’的总支持数与对应的总行数作差,得到行结束符

/’的结束支持数sup(

/’)=6-2=4;行结束符

)’的结束支持数sup(

)’)=1-0=1;行结束符

;’的结束支持数sup(

;’)=0-1=-1;行结束符

}’的结束支持数sup(

}’)=0-1=-1;行开始符

*’的结束支持数sup(

*’)=0-0=0。
[0209]
步骤s10354,将最大结束支持数对应的行结束符确定为注释结束标识。
[0210]
在行结束符

/’、

)’、

;’、

}’和

*’中,结束支持数最大的行结束符为

/’,则确定注释结束标识为

/’。
[0211]
在一些实施例中,图1所示实施例中步骤s104“基于所述注释标识对所述程序代码进行注释识别,得到识别结果”,可以通过以下步骤来实现:
[0212]
步骤s1041,将行开始符为所述注释开始标识的文字行添加至第一文字行集。
[0213]
将行开始符为

/’的文字行添加至集合wl1,得到:
[0214]
wl1={
[0215]
*/《“//this is a function”,1》,
[0216]
《“/*this is a single line comment*/”,5》,
[0217]
《“/*”,6》
[0218]
}。
[0219]
步骤s1042,将行结束符为所述注释结束标识的文字行添加至第二文字行集。
[0220]
将行结束符为

/’的文字行添加至集合wl2,得到:
[0221]
wl2={
[0222]
《“this”,7》,
[0223]
《“is”,8》,
[0224]
《“a”,9》,
[0225]
《“multiline”,10》,
[0226]
《“comments”,11》,
[0227]
《“*/”,12》
[0228]
}。
[0229]
步骤s1043,将所述第一文字行集和所述第二文字行集的并集确定为识别得到的注释行。
[0230]
这里,所述注释行即为采用本技术实施例提供的识别方法,对程序代码进行注释识别得到的注释识别结果,该注释识别结果为程序代码中包括的注释。
[0231]
获取wl1和wl2的并集,得到注释的识别结果wl-c为:
[0232]
wl-c={
[0233]
《“//this is a function”,1》,
[0234]
《“/*this is a single line comment*/”,5》,
[0235]
《“/*”,6》,
[0236]
《“this”,7》,
[0237]
《“is”,8》,
[0238]
《“a”,9》,
[0239]
《“multiline”,10》,
[0240]
《“comments”,11》,
[0241]
《“*/”,12》
[0242]
}。
[0243]
在一些实施例中,识别得到程序代码中的注释行之后,即可将程序代码中非注释行的文字行,确定为程序代码中的代码行,基于此,在上述步骤s1043之后,还可以包括:
[0244]
步骤s1044,将所述程序代码中除所述注释行以外的文字行确定为识别得到的代码行。
[0245]
这里,所述代码行也为采用本技术实施例提供的识别方法,对程序代码进行注释识别得到的代码识别结果,该代码识别结果为程序代码中包括的代码行。
[0246]
获取程序代码中除wl-c的文字行,得到代码的识别结果wl-p为:
[0247]
wl-p={
[0248]
《“int add(int a,int b)”,2》,
[0249]
《“{int move=a b;”,3》,
[0250]
《“return move;}”,4》
[0251]
}。
[0252]
本技术实施例提供的注释识别方法,能够在无法预知具体编程语言的前提下,识别得到程序代码中的注释、代码,具有通用性,能够提高对无法预知具体编程语言的注释识别的准确率。
[0253]
图3为本技术实施例提供的注释识别方法的另一种实现流程示意图,如图3所示,本技术实施例中所述注释识别方法包括以下步骤:
[0254]
步骤s301,获取待识别的程序代码和预设的行结束标识。
[0255]
这里,所述程序代码包括代码和注释。所述预设的行结束标识可以为换行符“\n”。
[0256]
步骤s302,根据所述行结束标识对所述程序代码进行分割处理,得到多个分割行。
[0257]
步骤s303,从所述多个分割行中删除空白行,得到至少一个文字行。
[0258]
其中,所述空白行为只包含空白字符的分割行。
[0259]
步骤s304,根据所述文字行的行首字符确定所述文字行的行开始符。
[0260]
在一些实施例中,步骤s304可以实现为:从第一个文字行开始,提取各个文字行中的第一个非空白字符;当确定当前文字行的第一个非空白字符不为英文字符时,将当前文字行的第一个非空白字符确定为当前文字行的行开始符;当确定当前文字行的第一个非空白字符为英文字符时,将空字符确定为当前文字行的行开始符。
[0261]
步骤s305,根据所述文字行的行末字符确定所述文字行的行结束符。
[0262]
在一些实施例中,步骤s305可以实现为:从最后一个文字行开始,逆序提取各个文字行中的最后一个非空白字符;当确定当前文字行的最后一个非空白字符不为英文字符、
且不为中文字符时,将当前文字行的最后一个非空白字符确定为当前文字行的行结束符;当确定当前文字行的最后一个非空白字符为英文字符或中文字符,且当前文字行存在行开始符时,将空字符确定为当前文字行的行结束符;当确定当前文字行的最后一个非空白字符为英文字符或中文字符,且当前文字行不存在行开始符时,将当前文字行的下一个文字行的行结束符确定为当前文字行的行结束符。
[0263]
步骤s306,按照预设划分规则对当前文字行中包括的字符进行分词处理,得到当前文字行的各个分词。
[0264]
步骤s307,获取所述各个分词的词性。
[0265]
步骤s308,基于所述文字行包括的字符,确定所述文字行中包括的目标分词的个数。
[0266]
其中,所述目标分词的词性不为名词。
[0267]
步骤s309,基于各个文字行的行开始符和目标分词的个数,确定注释开始标识。
[0268]
在一些实施例中,步骤s309可以实现为:基于各个文字行的目标分词个数和各个文字行的行开始符,确定不为空字符的各个行开始符的总支持数,所述行开始符的总支持数为所述行开始符对应的各个文字行中包括的目标分词个数的总和;确定各个行开始符对应的目标文字行的总行数,所述目标文字行为只包括名词分词的文字行;计算所述不为空字符的各个行开始符的总支持数与对应的总行数的差值,得到不为空字符的各个行开始符的开始支持数;将最大开始支持数对应的行开始符确定为注释开始标识。
[0269]
步骤s310,基于各个文字行的行结束符和目标分词的个数,确定注释结束标识。
[0270]
在一些实施例中,步骤s310可以实现为:基于各个文字行的目标分词个数和各个文字行的行结束符,确定不为空字符的各个行结束符的总支持数,所述行结束符的总支持数为所述行结束符对应的各个文字行中包括的目标分词个数的总和;确定各个行结束符对应的目标文字行的总行数,所述目标文字行为只包括名词分词的文字行;计算所述不为空字符的各个行结束符的总支持数与对应的总行数的差值,得到不为空字符的各个行结束符的结束支持数;将最大结束支持数对应的行结束符确定为注释结束标识。
[0271]
步骤s311,将所述注释开始标识和所述注释结束标识确定为注释标识。
[0272]
步骤s312,将行开始符为所述注释开始标识的文字行添加至第一文字行集。
[0273]
步骤s313,将行结束符为所述注释结束标识的文字行添加至第二文字行集。
[0274]
步骤s314,将所述第一文字行集和所述第二文字行集的并集确定为识别得到的注释行。
[0275]
这里,所述注释行即为采用本技术实施例提供的识别方法,对程序代码进行注释识别得到的注释识别结果,该注释识别结果为程序代码中包括的注释。
[0276]
步骤s315,将所述程序代码中除所述注释行以外的文字行确定为识别得到的代码行。
[0277]
这里,所述代码行也为采用本技术实施例提供的识别方法,对程序代码进行注释识别得到的代码识别结果,该代码识别结果为程序代码中包括的代码行。
[0278]
在一些实施例中,可仅获取程序中的注释时,执行至步骤s314即可结束;当需要获取程序中的代码时,执行步骤s315。
[0279]
本技术实施例提供的注释识别方法,能够在不预知具体编程语言的前提下,实现
对程序代码中的注释进行识别,不依赖具体编程语言,具有通用性,能够提高对无法预知具体编程语言的注释识别的准确率。
[0280]
下面,将说明本技术实施例在一个实际的应用场景中的示例性应用。
[0281]
软件代码通常由两部分组成:程序代码、程序注释。程序代码为符合程序设计语言专门语法规范的字符串,可经编译、解释等工具转换,在计算机上执行,表达了软件的业务逻辑怎样实现的过程。程序注释为符合人类自然语言语法的字符串,一般存在于代码文件的头部、函数头部、程序块内部等,用于解释业务逻辑实现的思路与原因,但在程序执行过程中不起作用。然而,程序注释的提取,对于分析软件开发过程质量、识别程序注释与程序实现的不一致、分析程序注释中的同一话题与多处程序代码的关系等应用具有重要价值,在学术研究和工程管理领域都有较多研究。现有的程序注释识别技术,主要包括如下两种方案。
[0282]
编程语言相关的程序注释识别方案:在已知待处理软件代码所采用的编程语言的前提下,根据该编程语言的语法规范,识别程序注释。此方案的优点在于,准确率可达100%;缺点在于,针对不同的编程语言需要设计不同的方案实现,对于新出现的编程语言,不具有处理能力,因而对于管理采用大量不同编程语言开发的、可能动态升级变更的软件项目,能力不足。
[0283]
基于程序注释字符特征的识别方案:为了设计具有通用能力的程序注释识别技术,特别是能够在开发者间电子邮件通信内容中区分程序代码和程序注释,支持在脱离编程开发软件的情况下识别程序注释,有多人提出了根据程序注释的符号特征,设计多种正则表达式识别单行注释、多行注释开始、多行注释结束。其主要技术缺点为:只能处理注释语法相类似的编程语言(如java和c的注释类似);技术通用性同样有局限。
[0284]
在相关技术中,现有技术方案的缺点主要概括如下:
[0285]
1)编程语言相关的程序注释识别方案,根据单一编程语言的语法特征,实现程序注释的识别,只能处理单一程序语言对应的程序注释。
[0286]
2)基于程序注释字符特征的识别方案,根据程序注释的字符特征设计正则表达式,针对程序注释语法相近的编程语言,只能处理少数几种编程语言的程序注释,而且对于书写不规范的注释可能发生误判。
[0287]
针对现有技术方案的不足,本技术实施例提出一种不依赖具体编程语言的程序注释识别技术方案,在无需预知编程语言的前提下,对软件代码中的程序注释进行识别,以支持程序注释的提取。主要解决的问题如下:
[0288]
1)针对不同编程语言的注释语法不同的问题,使用自然语言理解技术,自动化确定程序注释的开始符号和结束符号。
[0289]
2)基于程序注释的开始符号和结束符号,解决自动提取单行程序注释和多行程序注释的问题。
[0290]
本技术实施例提出的程序注释的一种通用识别方法,其核心思路为:将程序代码文件分割为带编号的文字行;对每个文字行进行自然语言分析、识别出包含自然语言语句的文字行;根据包含自然语言的文字行确定程序注释的开始符号和结束符号;识别所有文字行是否为程序注释。
[0291]
下面对本技术实施例中相关的术语进行解释:
[0292]
可显示字符:ascii表中可以显示为符号的字符,即从编号32的字符(空格)到编号126的字符(

~’)。
[0293]
文字行:程序代码中两个换行符之间的可显示字符组成的一行字符串。
[0294]
英文字母:a..z和a..z。
[0295]
空白行:除了空白字符之外,不包含其它可显示字符的文字行。
[0296]
行开始符号(对应上文中的行开始符):文字行的首个非空白字符,文字行w的行开始符号记为sc(w)。
[0297]
行结束符号(对应上文中的行结束符):文字行的最后一个非空白字符,文字行w的行结束符号记为ec(w)。
[0298]
行注释开始符号(对应上文中的注释开始标记):注释标记的开始符号,用于标记文字行为注释,文字行w的行注释开始符号记为cs(w)。
[0299]
行注释结束符号(对应上文中的注释结束标记):注释标记的结束符号,用于标记文字行为注释,文字行w的行注释结束符号记为ce(w)。
[0300]
图4为本技术实施例提供的注释识别方法的再一种实现流程示意图,如图4所示,本技术实施例提供的注释识别方法,包括以下步骤。
[0301]
步骤s401,程序代码的文字行分割。
[0302]
程序代码文件均为文本文件。根据ascii字符

\n’判定单行文字的结束,并从编号1开始追踪每个文字行的行号。输出代码文件包含的所有文字行数据,形成有序列表wl=(《wl-1,ln(wl-1)》,

,《wl-n,ln(wl-n)》),其中n为该文件中文字行的行数,列表wl的一个元素《wl-i,ln(wl-i)》表示为第“wl-i”行的文字由变量“wl-i”存储、行号由ln(wl-i)存储。删掉空白行(删除符号后不包含字符的行为空白行)。
[0303]
步骤s402,自然语言文字行筛选。
[0304]
本技术实施例中,步骤s402可以由以下步骤实现:
[0305]
步骤s4021,对列表wl每个元素《wl-i,ln(wl-i)》的行文字“wl-i”进行中英文分词,得到每个词和词性的对偶列表结果为pos(wl-i)={《w1,pos(w1)》,

,《wk,pos(wk)》},其中wi为一个(中/英)词、pos(wi)为对应的词性(名词、动词、形容词、副词、代词等)。
[0306]
步骤s4022,提取文字行的开始符号。
[0307]
从i=1递增开始对于每个文字行《wl-i,ln(wl-i)》,wl-i的行注释开始符号记为cs(wl-i);根据下述步骤1)、2)计算cs(wl-i)。
[0308]
1)cs(wl-i)=null,提取行“wl-i”中的第一个ascii可显示字符,如果此字符是非空白符号(即,非空格、非制表符\t)且非英文字母,将其作为该行的行首符号cs(wl-i)。
[0309]
2)初始化cs(wl-i)的行注释开始符号的支持度(对应上文中的总支持数)为support(cs(wl-i))为0。
[0310]
步骤s4023,提取文字行的结束符号。
[0311]
逆序(即i从大到小)考察列表wl中的wl-i。对于每个文字行《wl-i,ln(wl-i)》,初始化ce(wl-i)=null;根据下述步骤1),2)和3)计算ce(wl-i)。
[0312]
1)提取变量“wl-i”中结尾的非空白符号(即,非空格、非\t)且非英文字母作为该行的行结束符号ce(wl-i)。
[0313]
2)如果结束符号ce(wl-i)=null且开始符号cs(wl-i)≠null,则保持ce(wl-i)=
null并转3);否则t=i 1,如果ce(wl-t)≠null,则ce(wl-i)=ce(wl-t)。
[0314]
3)初始化ce(wl-i)的行注释结束符号的支持度为support(ce(wl-i))=0。
[0315]
步骤s4024,循环考察wl对应的pos(wl-i)={《w1,pos(w1)》,

,《wk,pos(wk)》},若pos(wl-i)中pos(wj)的词性值不为“名词”或“符号”,则更新支持度:
[0316]
support(cs(wl-i))=support(cs(wl-i)) 1;
[0317]
support(ce(wl-i))=support(ce(wl-i)) 1。
[0318]
步骤s4025,循环考察wl对应的pos(wl-i)={《w1,pos(w1)》,

,《wk,pos(wk)》},若pos(wl-i)中所有pos(wj)的词性值都为“名词”或“符号”,则更新支持度:
[0319]
support(cs(wl-i))=support(cs(wl-i))

1;
[0320]
support(ce(wl-i))=support(ce(wl-i))

1。
[0321]
步骤s403,程序注释符号(对应上文中的注释标记)确定。
[0322]
本技术实施例中,步骤s403可以由以下步骤实现:
[0323]
步骤s4031,初始化:程序注释开始符号集合cs={};程序注释结束符号集合ce={}。
[0324]
步骤s4032,如果行开始符号x在所有的行开始符号中,具有最大、正值支持度support(x),则将x加入cs。
[0325]
步骤s4033,如果行结束符号y具有最大、正值支持度support(y),则将y其加入ce。
[0326]
步骤s404,程序注释识别。
[0327]
本技术实施例中,步骤s404可以由以下步骤实现:
[0328]
步骤s4041,初始化注释行集合wl-c为空集:wl-c={}。
[0329]
步骤s4042,从前至后扫描输入代码文件中的每个行wl,如果经步骤s402确定的cs(wl)属于cs或者ce(wl)属于ce,则将wl的文字加入到wl-c。
[0330]
步骤s4043,将wl-c作为代码中的全部注释行输出。
[0331]
下面结合图4和具体实施例对本技术实施例作进一步详细说明。
[0332]
在使用前,需要已构建完成的领域知识图谱kg和领域动作模型集ag,需要准确率经过验证的文本分词软件和文本词性标注软件,还需要同义词词典。
[0333]
为了更好理解本发明,以下是一个具体的实施例,自然语言理解得分词与词性标注工具采用stanford nlp。
[0334]
示例的软件代码如下,其中左列为行号,右侧为源代码:
[0335][0336][0337]
经步骤s401,程序代码的文字行分割,得到:
[0338]
wl={
[0339]
《“//this is a function”,1》,
[0340]
《“int add(int a,int b)”,2》,
[0341]
《“{int move=a b;”,3》,
[0342]
《“return move;}”,4》,
[0343]
《“/*this is a single line comment*/”,5》,
[0344]
《“/*”,6》,
[0345]
《“this”,7》,
[0346]
《“is”,8》,
[0347]
《“a”,9》,
[0348]
《“multiline”,10》,
[0349]
《“comments”,11》,
[0350]
《“*/”,12》
[0351]
}。
[0352]
为便于理解,用表格对wl进行展示,列表wl如表6所示:
[0353]
表6文字行的存储列表wl
[0354][0355][0356]
经步骤s402,自然语言文字行筛选。
[0357]
经步骤s4021得到每个文字行中每个词的词性,如下表7的pos列所示(词性标注结果基于斯坦福大学开源自然语言处理工具实现https://github.com/stanfordnlp/stanza/)。
[0358]
表7各个文字行的各个分词及各个分词的词性
[0359][0360]
经步骤s4022,获取每行的行开始符号,得到结果如下表8所示的列“cs”和列“support(cs)”。
[0361]
表8各个文字行的行开始符号support(cs)
[0362]
[0363][0364]
经步骤s4023,获取每行的结束符号,如下表9,新增列ce、support(ce)。
[0365]
表9各个文字行的行开始符号support(cs)和行结束符号support(ce)
[0366]
[0367][0368]
经步骤s4024,更新support值,更新结果如表10所示。
[0369]
表10各个行开始符号和各个行结束符号在各个行的支持度
[0370]
[0371][0372]
得到各行开始符号的支持度:
[0373]

/’的支持度support(

/’)=3 3 0=6;
[0374]

{’的支持度support(

{’)=0;
[0375]

*’的支持度support(

*’)=0。
[0376]
得到各行结束符号的支持度:
[0377]

)’的支持度support(

)’)=1;
[0378]

;’的支持度support(

;’)=0;
[0379]

}’的支持度support(

;’)=0;
[0380]

/’的支持度support(

/’)=3 1 1 1 0 0 0=6;
[0381]

*’的支持度为support(

*’)=0。
[0382]
经步骤s4025,用支持度减少规则更新行开始符号和行结束符号的支持度。
[0383]
减少候选行开始符号的支持度:
[0384]

/’作为行开始符号的支持度无变化;
[0385]
根据行3,这个行使符号

}’的支持度减少:
[0386]
support(

}’)=0-1=-1;
[0387]

*’的支持度support(

*’)=0,无变化。
[0388]
减少候选行结束符号的支持度:
[0389]
根据行10和行11,使得

/’作为候选行结束符号的支持度减少为support(

/’)=6-1-1=4;
[0390]
候选结束符

)’的支持度support(

)’)=1,无变化;
[0391]
根据行3,减少候选结束符

;’的支持度support(

;’)=0-1=-1;
[0392]
根据行4,减少

}’的支持度support(

}’)=0-1=-1。
[0393]
经步骤s4032,

/’是所有候选的行开始符号具有最大支持度的符号,因而得出整个代码的行开始符号为cs={

/’}。
[0394]
经步骤s4033,得ce={

/’}。
[0395]
经步骤s4042,得到代码的所有注释行,如wl-c:
[0396]
wl-c={
[0397]
《“//this is a function”,1》,
[0398]
《“/*this is a single line comment*/”,5》,
[0399]
《“/*”,6》,
[0400]
《“this”,7》,
[0401]
《“is”,8》,
[0402]
《“a”,9》,
[0403]
《“multiline”,10》,
[0404]
《“comments”,11》,
[0405]
《“*/”,12》
[0406]
}。
[0407]
本技术实施例提供的注释识别方法,能够实现在不预知编程语言的前提下识别程序注释。根据软件代码中的文字行中每个词的自然语言词性的数量评估该行起始符号可能为程序注释开始符号的方法。根据软件代码中的文字行中每个词的自然语言词性的数量评估该行结束符号可能为程序注释结束符号的方法。根据某行文字包含全部为符号或名词的词,降低该行的开始符号和结束符号相应可成为注释行开始符号和结束符号可能性的策略。通过自然语言分析技术确定程序注释的开始符号与结束符号的方法。
[0408]
和现有的技术方案相比,本方法具有以下优点:现有的基于程序注释字符特征的识别方案,根据字符的模式特征识别程序注释,相对而言,本技术提出的方法根据词语的语法特征识别程序注释,更能利用好程序注释中存在的人类语言语法特征,从而提高识别准确率。
[0409]
基于前述的实施例,本技术实施例提供一种注释识别装置,该装置包括的各模块、以及各模块包括的各单元,可以通过计算机设备中的处理器来实现;当然也可通过具体的逻辑电路实现;在实施的过程中,处理器可以为中央处理器(cpu,central processing unit)、微处理器(mpu,microprocessor unit)、数字信号处理器(dsp,digital signal processing)或现场可编程门阵列(fpga,field programmable gate array)等。
[0410]
本技术实施例再提供一种注释识别装置,图5为本技术实施例提供的注释识别装置的组成结构示意图,如图5所示,所述注释识别装置500包括:
[0411]
分割模块501,用于对获取的待识别的程序代码进行分割处理,得到至少一个文字行,所述程序代码包括代码和注释;
[0412]
第一确定模块502,用于根据所述文字行的行首字符确定所述文字行的行开始符,并根据所述文字行的行末字符确定所述文字行的行结束符;
[0413]
第二确定模块503,用于基于所述行开始符和所述行结束符,确定所述程序代码中的注释标识;
[0414]
识别模块504,用于基于所述注释标识对所述程序代码进行注释识别,得到识别结果。
[0415]
在一些实施例中,所述分割模块501,可进一步包括:
[0416]
第一获取子模块,用于获取待识别的程序代码和预设的行结束标识;
[0417]
分割子模块,用于根据所述行结束标识对所述程序代码进行分割处理,得到多个分割行;
[0418]
删除子模块,用于从所述多个分割行中删除空白行,得到至少一个文字行,所述空白行为只包含空白字符的分割行。
[0419]
在一些实施例中,所述第一确定模块502,可进一步包括:
[0420]
第一提取子模块,用于提取各个文字行中的第一个非空白字符;
[0421]
第一确定子模块,用于当确定当前文字行的第一个非空白字符不为英文字符时,将当前文字行的第一个非空白字符确定为当前文字行的行开始符;
[0422]
第二确定子模块,用于当确定当前文字行的第一个非空白字符为英文字符时,将空字符确定为当前文字行的行开始符。
[0423]
在一些实施例中,所述第一确定模块502,可进一步包括:
[0424]
第二提取子模块,用于提取各个文字行中的最后一个非空白字符;
[0425]
第三确定子模块,用于当确定当前文字行的最后一个非空白字符不为英文字符、且不为中文字符时,将当前文字行的最后一个非空白字符确定为当前文字行的行结束符;
[0426]
第四确定子模块,用于当确定当前文字行的最后一个非空白字符为英文字符或中文字符,且当前文字行存在行开始符时,将空字符确定为当前文字行的行结束符;
[0427]
第五确定子模块,用于当确定当前文字行的最后一个非空白字符为英文字符或中文字符,且当前文字行不存在行开始符时,将当前文字行的下一个文字行的行结束符确定为当前文字行的行结束符。
[0428]
在一些实施例中,所述第二确定模块503,可进一步包括:
[0429]
第六确定子模块,用于基于所述文字行包括的字符,确定所述文字行中包括的目标分词的个数,所述目标分词的词性不为名词;
[0430]
第七确定子模块,用于基于各个文字行的行开始符和目标分词的个数,确定注释开始标识,并基于各个文字行的行结束符和目标分词的个数,确定注释结束标识;
[0431]
第八确定子模块,用于将所述注释开始标识和所述注释结束标识确定为注释标识。
[0432]
在一些实施例中,所述第二确定模块503,可进一步包括:
[0433]
分词子模块,用于按照预设划分规则对当前文字行中包括的字符进行分词处理,得到当前文字行的各个分词;
[0434]
第二获取子模块,用于获取所述各个分词的词性。
[0435]
在一些实施例中,所述第七确定子模块,可进一步包括:
[0436]
第一确定单元,用于基于各个文字行的目标分词个数和各个文字行的行开始符,确定不为空字符的各个行开始符的总支持数,所述行开始符的总支持数为所述行开始符对应的各个文字行中包括的目标分词个数的总和;
[0437]
第二确定单元,用于确定各个行开始符对应的目标文字行的总行数,所述目标文字行为只包括名词分词的文字行;
[0438]
第一计算单元,用于计算所述不为空字符的各个行开始符的总支持数与对应的总行数的差值,得到不为空字符的各个行开始符的开始支持数;
[0439]
第三确定单元,用于将最大开始支持数对应的行开始符确定为注释开始标识。
[0440]
在一些实施例中,所述第七确定子模块,可进一步包括:
[0441]
第四确定单元,用于基于各个文字行的目标分词个数和各个文字行的行结束符,确定不为空字符的各个行结束符的总支持数,所述行结束符的总支持数为所述行结束符对应的各个文字行中包括的目标分词个数的总和;
[0442]
第五确定单元,用于确定各个行结束符对应的目标文字行的总行数,所述目标文字行为只包括名词分词的文字行;
[0443]
第二计算单元,用于计算所述不为空字符的各个行结束符的总支持数与对应的总行数的差值,得到不为空字符的各个行结束符的结束支持数;
[0444]
第六确定单元,用于将最大结束支持数对应的行结束符确定为注释结束标识。
[0445]
在一些实施例中,所述识别模块504,可进一步包括:
[0446]
第一添加子模块,用于将行开始符为所述注释开始标识的文字行添加至第一文字行集;
[0447]
第二添加子模块,用于将行结束符为所述注释结束标识的文字行添加至第二文字行集;
[0448]
第九确定子模块,用于将所述第一文字行集和所述第二文字行集的并集确定为识别得到的注释行。
[0449]
在一些实施例中,所述识别模块504,可进一步包括:
[0450]
第十确定子模块,用于将所述程序代码中除所述注释行以外的文字行确定为识别得到的代码行。
[0451]
这里需要指出的是:以上注释识别装置实施例项的描述,与上述方法描述是类似的,具有同方法实施例相同的有益效果。对于本技术注释识别装置实施例中未披露的技术细节,本领域的技术人员请参照本技术方法实施例的描述而理解。
[0452]
需要说明的是,本技术实施例中,如果以软件功能模块的形式实现上述的注释识别方法,并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本技术实施例的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机、服务器、或者网络设备等)执行本技术各个实施例所述方法的全部或部分。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read only memory)、磁碟或者光盘等各种可以存储程序代码的介质。这样,本技术实施例不限制于任何特定的硬件和软件结合。
[0453]
相应地,本技术实施例提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述实施例中提供的注释识别方法中的步骤。
[0454]
本技术实施例提供一种注释识别设备,图6为本技术实施例提供的注释识别设备的组成结构示意图,根据图6示出的注释识别设备600的示例性结构,可以预见注释识别设备600的其他的示例性结构,因此这里所描述的结构不应视为限制,例如可以省略下文所描述的部分组件,或者,增设下文所未记载的组件以适应某些应用的特殊需求。
[0455]
图6所示的注释识别设备600包括:一个处理器601、至少一个通信总线602、用户接口603、至少一个外部通信接口604和存储器605。其中,通信总线602配置为实现这些组件之间的连接通信。其中,用户接口603可以包括显示屏,外部通信接口604可以包括标准的有线接口和无线接口。其中,所述处理器601配置为执行存储器中存储的注释识别方法的程序,以实现上述实施例提供的注释识别方法中的步骤。
[0456]
以上注释识别设备和存储介质实施例的描述,与上述方法实施例的描述是类似的,具有同方法实施例相似的有益效果。对于本技术注释识别设备和存储介质实施例中未披露的技术细节,请参照本技术方法实施例的描述而理解。
[0457]
应理解,说明书通篇中提到的“一个实施例”或“一实施例”意味着与实施例有关的
特定特征、结构或特性包括在本技术的至少一个实施例中。因此,在整个说明书各处出现的“在一个实施例中”或“在一实施例中”未必一定指相同的实施例。此外,这些特定的特征、结构或特性可以任意适合的方式结合在一个或多个实施例中。应理解,在本技术的各种实施例中,上述各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本技术实施例的实施过程构成任何限定。上述本技术实施例序号仅仅为了描述,不代表实施例的优劣。
[0458]
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。
[0459]
在本技术所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。以上所描述的设备实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,如:多个单元或组件可以结合,或可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,所显示或讨论的各组成部分相互之间的耦合、或直接耦合、或通信连接可以是通过一些接口,设备或单元的间接耦合或通信连接,可以是电性的、机械的或其它形式的。
[0460]
上述作为分离部件说明的单元可以是、或也可以不是物理上分开的,作为单元显示的部件可以是、或也可以不是物理单元;既可以位于一个地方,也可以分布到多个网络单元上;可以根据实际的需要选择其中的部分或全部单元来实现本实施例方案的目的。
[0461]
另外,在本技术各实施例中的各功能单元可以全部集成在一个处理单元中,也可以是各单元分别单独作为一个单元,也可以两个或两个以上单元集成在一个单元中;上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
[0462]
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:移动存储设备、rom、磁碟或者光盘等各种可以存储程序代码的介质。
[0463]
或者,本技术上述集成的单元如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本技术实施例的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台ac执行本技术各个实施例所述方法的全部或部分。而前述的存储介质包括:移动存储设备、rom、磁碟或者光盘等各种可以存储程序代码的介质。
[0464]
以上所述,仅为本技术的实施方式,但本技术的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本技术揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本技术的保护范围之内。因此,本技术的保护范围应以所述权利要求的保护范围为准。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献