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

