Page 293 - 《软件学报》2025年第7期
P. 293

3214                                                       软件学报  2025  年第  36  卷第  7  期


                 组合. 表  1  中  API 的方法名为  getDeviceID, 被拆分为  get、Device 和  ID  这  3  个单词, 使用‘$’符号进行分割. 此外,
                 在类名和方法名中有一些单词全部由大写字母组成, 这些单词是缩略符, 例如                        SQL、URL、ID    等, 需要对缩略符
                 进行额外识别.

                 3.2   API 句子生成
                    完成特征提取后, 需要将        API 的特征转换为反应其语义相似性的编码. 然而              API 的特征数量不一致问题给语
                 义信息提取造成困难. 例如一些          API 的方法名可以拆成      5  个单词, 而另一些    API 的方法名只能拆成       3  个单词; 一
                 些  API 执行时需要申请权限, 而另一些         API 在执行时不需要权限. 因此需要设计一种编码方式, 即能全面概括
                 API 特征的语义信息, 又能将特征数量不一致的             API 全部映射到固定大小的特征向量. 为解决上述问题, 本文设计
                 一种  API 句子的生成规则, 根据该规则生成          API 句子对  API 的特征进行概括.
                    根据特征数量不同, 将       API 的特征划分为共有特征和差异特征. 共有特征包括方法名、类名和包, 每个                        API
                 都有且仅有一个方法名, 类名和包.
                    共有特征对应的      API 句子生成规则为:
                    method method_name from class class_name from package package
                    差异特征包括权限、异常、参数和返回值. 每类特征分别对应两种情况: 特征数量为                            0  和特征数量至少为     1.
                 以权限特征为例, 分别对应        API 执行时不需要权限和至少需要一种权限. 差异特征对应的                 API 句子生成规则如表      2

                 所示.

                                               表 2 差异部分     API 句子生成规则

                       特征类别                  特征数量为0                           特征数量至少为1
                       Permission          use none permission          use peremission_1 permission_2, …
                       Parameter            use none parameter       use parameter parameter_1 parameter_2, …
                       Exception           throw none exception         throw excepthion_1 exception_2, …
                        Return                return none                    return return_value

                    API 句子生成的伪代码如算法         1  所示. 输入为  API X  的特征, 输出为  API X  对应的  API 句子  S. 第  1  行生成共有
                 特征对应的部分      API 句子; 第  2–5  行调用算法  2, 生成差异特征对应的部分         API 句子; 第  6  行将  API 句子中所有
                 的大写字母替换为小写; 第        7  行将  API 句子中所有的‘$’、‘_’和‘.’替换为空格.

                 算法  1. API 句子生成算法.
                 输入: API X  的特征, 包括: Method_name: 方法名, Class_name: 类名, Package: 包, Permission: 权限, Exception: 异常,
                 Parameter: 参数, Return: 返回值;
                 输出: S: API X  对应的  API 句子.

                 1. S = “method” + Method_name + “from class” + Class_name + “from package” + Package
                 2. S = S + Algorithm2(Permission, “use none permission”, “use permission”)
                 3. S = S + Algorithm2(Exception, “throw none exception”, “throw exception”)
                 4. S = S + Algorithm2(Parameter, “use none parameter”, “use parameter”)
                 5. S = S + Algorithm2(Return, “return none”, “return”)
                 6. replace all uppercase in S by lowercase
                 7. replace all ‘$’, ‘_’, and ‘.’ in S By ‘ ’
                 8. return S

                    单个差异特征对应的部分          API 句子生成算法如算法       2  所示. 算法  2  在算法  1  的第  2–5  行被调用, 输入是某一
                 类差异特征    Features 和对应的  API 句子生成规则     S 0 和  S 1 , 输出是单个差异特征生成的部分     API 句子  S part . 算法  2
   288   289   290   291   292   293   294   295   296   297   298