【NLP】基于信息检索的从需求到代码的追踪
基于信息检索的需求到代码追踪的生成方法,其原理是利用IR方法计算软件制品之间的相似度,以此自动生成制品之间的追踪关系。
信息检索(Information Retrieval)技术简称为IR技术,《信息检索导论》一书中提出了信息检索的定义:“信息检索就是从一个大的资料集合中寻找能够满足某个特定信息需要的资料的过程。”利用IR的方法进行追踪链的创建是基于文本之间单词的相似性,这些单词包含于需求文档和代码文档中,如果两个软件制品具有较高的相似性,则可以认为它们构成一条候选链。一般来说,使用IR方法创建追踪链的过程包含以下几个关键步骤:
- 文档解析,单词提取和预处理;
- 使用IR方法计算相似度;
- 生成候选链的排序列表;
- 结果处理。
文本预处理
IR方法在创建追踪链的过程中,使用不同的粒度从文本软件制品中提取和表示信息,具体取决于软件制品的类型。一般来说,需求文档使用用例进行解析,代码文档使用类或方法来解析。常见的文本预处理工具包括Apache的Lucene。通常使用的预处理步骤如下:
- 文本规范化:删除非文本标记,统一大小写。
- 拆分标识符:将短语或句子拆分成由两个或多个单词。如果不分割标识符,则IR技术可能错过概念的出现。大多数现有自动软件分析工具使用基于编码约定自然语言信息,例如驼峰式大小写和非字母字符(例如,“_”和数字)。
- 移除停用词:制品中通常包含对捕获制品内容的语义无用的常用单词(如介词、副词)。可以使用停用词功能或停用词列表来丢弃这些词。
计算相似度
IR基本模型
- 概率模型(Probabilistic Model,PM):通过计算一个文档属于“相关”或者“不相关”的概率来为文档排序,从而计算文档之间相似度。
- 向量空间模型(Vector-Space Model,VSM):使用奇异值分解(SVD)的方法来获取文本的主题,从而提取出单词与单词或文档与文档之间潜在的语义结构,并在表示词和文档关系时利用这种潜在的语义结构。
- 潜在语义索引(Latent Semantic Indexing,LSI或Latent Semantic Analysis,LSA):将制品中的单词抽象表示为术语向量,通过计算向量之间的相似度来分析文档之间的相似程度,而两个向量之间的角度的余弦值计算作相似度的数值。
余弦公式计算相似度:
sim(D,Q) = (D∙Q) / (|D|∙|Q|)
向量空间模型
我们把从文档中提取的术语存储在一个m*n矩阵中,并称之为词频/文档(term-by-document)矩阵,其中m是文档中出现的所有的唯一的术语的数量,n是文档的数量。向量的计算涉及到以下三个因素:
- 术语频率(term frequency,tf值):该因素描述的是一个术语在一个文档中出现的次数;
- 文档频率(document frequency,df值):它指的是针对某一术语,在整个数据集中有多少个文档包含这个术语;
- 逆文档频率(inverse document frequency,idf值):df计算简单,但是并不能很好地指示文档内容,基于df的加权方法称为逆文档频率idf。
tf-idf值的计算:
tf-idf(i,j) = tf(i,j) * idf(i)
将文档向量化并形成词频/文档矩阵,需要给文档中的每个术语赋一个实数值,这个实数值,就是tf-idf值。tf-idf(term frequency-inverse document frequency)的值就是术语频率和文档频率的乘积。
语义信息
语义信息的存在会影响追踪的准确性,对于需求文档之类的描述性文档,可酌情分析其中的同义词、多义词、段落结构的影响。对于代码文档,编程语言、代码结构信息是需要重点考虑的,Scitools发行的Understand是该领域的有效工具。
生成候选链
根据计算所得的相似度,可以得到一个需求-代码链的相似度列表。
结果处理
为了便于结果的度量分析,需要按照一定的方法对该列表进行过滤。通常我们选用的过滤方法包括以下两种:
- cut-point法:根据相似度从大到小排序,选择前n个或前m%最相关的追踪链;
- 阈值法:给定一个阈值x,选择相似度大于x的全部追踪链。
结果度量
IR方法的评价指标主要有以下两种:
- 精确率(Precision,又称查准率):计算的是所有“成功检索的追踪链数(TP)”占所有“被检索到的追踪链数(TP+FP)”的比例,衡量了算法的查准的能力。
- 召回率(Recall,又称查全率):计算的是所有“成功检索的追踪链数(TP)”占所有“参考追踪链数(TP+FN)”的比例,衡量了算法的查全的能力。
- 聚合度量F-measure,代表二者的综合评价,以获得它们之间的平衡,F1-Measure则是精确率和召回率的调和均值。