Page 73 - 《软件学报》2026年第2期
P. 73
552 软件学报 2026 年第 37 卷第 2 期
链接, 然后根据词之间的共现关系构造网络, 得到无向有权边. 最后, TextRank 对节点权重进行倒序排序, 并按照
重要程度依次获取核心名词.
关键变异位置的选择方法见算法 2. 在对测试输入进行变异时, 本文首先使用 TextRank 算法从原始测试输入
中提取核心名词 (第 3 行), 然后运用 Phrase-BERT (简称 PBERT) 模型 [43] 将提取的关键词转化为向量表示 (第
4 行). PBERT 模型通过对比学习方法 [44] 对 BERT 模型 [45] 进行微调, 使其更适合于短语嵌入任务. 相比于原始的
BERT 模型, PBERT 模型在短语层面的语义表示方面表现更为准确 [40,46] . QALT 使用 PBERT 将候选名词词组转换
为向量形式 (第 8 行), 并计算与核心名词集合的平均余弦相似度 (第 9 行). 最后, QALT 选择其中相似度最高的名
词词组 (第 10–13 行) 作为最终的变异名词词组. 基于该名词词组, QALT 将其输入生成模型并生成描述性语句, 进
而对原始测试输入进行变异构造全新的测试输入. 需要注意的是, 在提取候选名词词组时, 需要注意当前选择的蜕
变关系: 蜕变关系为 ERQ 时, 从测试输入的问题中提取名词词组 (第 5 行); 蜕变关系为 ERC 时, 从测试输入所选
择的上下文变异位置中提取名词词组 (第 6 行); 蜕变关系为 ERQC 时, 分别执行上述操作.
算法 2. 关键名词词组选择方法.
输入: p: 上下文中选定的变异位置; q: 原始测试输入的问题; c: 原始测试输入的上下文; MR: 选定的蜕变关系;
输出: p 或 q 中最适合变异的名词词组 n*.
1. max := −∞;
2. n* := ∅;
3. keywords_list = TextRank(c); //keywords_list 为包含所有核心名词的列表
4. keywords_vector = phrase_embedding(keywords_list);
5. if MR == ERO then noun_phrase_list = segment_noun_phrase(q);
6. else if MR == ERC then noun_phrase_list = segment_noun_phrase(p);
7. foreach n in noun_phrase_list do
8. n_vector = phrase_embedding(n);
9. sim_score = phrase_similarity(keywords_vector, n_vector);
10. if sim_score > max then
11. max = sim_score;
12. n* = n
13. end
14. end
15. return n*
4.4 基于依存句法分析的选择策略
由于 QALT 合成的测试输入和原始测试输入的语法结构可能存在不一致, 从而进一步导致生成句子不合法.
具体来说, QALT 在生成测试输入的过程中会用描述性语句替换原始测试输入中的名词词组, 这种做法在某些情
况下会破坏原有句子的语法结构, 从而引起变异后的测试输入的语义发生变化.
如图 4 所示, 原始问题“As a euphoric how is oxygen used in bars?”中名词词组“oxygen”被描述性语句“the most
abundant component of air” 代替. 该变异使得在原始问题中“used in bars”的修饰对象则从“component” (替换前为
“oxygen”) 变成了“air”. 此时句子语法结构发生变化, 使得变异后的测试输入与原始测试输入语义无法保持一致从
而导致误报. 为了提升生成测试输入的质量, QALT 利用依存句法分析技术对句子的语法结构进行解析, 结合选择
策略进一步降低测试输入的误报率, 从而提高所检测到缺陷的准确性.
如图 5 所示, 在应用选择策略时, QALT 首先生成 N 个 (本文中为 3) 候选的测试输入, 接着, QALT 将每个候
选测试输入拆分成变异部分结构与未变异部分结构两个不同部分, 并分别输入筛除模块与排序模块. 在每个模块

