【技术实现步骤摘要】
基于两阶段模型对易混淆类别进行分类的方法
[0001]本专利技术涉及软件工程领域相关分类任务的易混淆分类问题,具体涉及一种基于两阶段模型对易混淆类别进行分类的方法
。
技术介绍
[0002]分类任务是计算机领域的一个研究热点,涵盖了计算机视觉
、
语音识别
、
自然语言处理等多个领域
。
在软件工程领域,分类任务同样非常普遍,例如脆弱性检测
、
软件需求分类
、
代码作者归属和算法分类等
。
随着深度神经网络和数据挖掘等技术的快速发展,自动化分类方法在软件工程领域得到了广泛的应用
。
例如,基于
LSTM(
见文献“Longshort
‑
term memory”,
1997
,长短期记忆
)
和
BERT(
见文献“Bert:Pre
‑
training of deepbidirectional transformers for language understanding”,
2018
,
Bert
:用于语言理解的深度双向转换预训练模型
)
等深度学习模型的分类方法,利用深度神经网络强大的表征能力和学习能力,能够更好地处理复杂的软件工程数据,挖掘出更深层次的特征和模式,从而实现更准确的分类
。
[0003]自动化分类方法的应用使得软件工
【技术保护点】
【技术特征摘要】
1.
一种基于两阶段模型对易混淆类别进行分类的方法,其特征在于包括以下步骤:第一步,构建两阶段分类系统;两阶段分类系统由预处理模块
、
第一阶段分类模块
、
易混淆类别识别模块
、
边界样本筛选模块
、
第二阶段分类模块构成;预处理模块与第一阶段分类模块
、
第二阶段分类模块相连;训练时,读取第一训练集
T
或第二训练集
RR
,
T
=
{T1,T2,
···
T
m
,
···
,T
M
}
,其中
T
m
表示
T
中的第
m
条文本序列,
1≤m≤M
,
M
为
T
中的文本总数,中的文本总数,表示
T
m
的第
i
个词,
I
为
T
m
中词的总数;
RR
=
{R1,R2,
···
R
n
,
···
,R
N
}
,其中
R
n
表示
RR
中的第
n
条源代码序列,
1≤n≤N
,
N
为
RR
中的源代码总数;的源代码总数;表示
R
n
的第
i
个词,
1≤i≤I
;预处理模块利用词嵌入方法将训练集中每个词映射为词级别编码,得到训练集的词级别编码序列集合,预处理模块将训练集的词级别编码序列集合发送给第二阶段分类模块;当对用户输入的文本或源代码进行分类时,预处理模块接收用户输入的文本或源代码序列
X
,
X
=
{x1,x2,...,x
j
,...,x
J
}
,其中
x
j
表示
X
中的第
j
个词,
1≤j≤J
,
J
为
X
中的词个数,利用词嵌入方法将每个词映射为词级别编码,得到用户词级别编码序列集合
G(X)
,
G(X)
=
{G(x1),G(x2),...,G(x
j
),...,G(x
J
)}
,其中
G(x
j
)
表示
x
j
经过词嵌入方法映射后的词级别编码,预处理模块将
G(X)
发送给第一阶段分类模块
、
第二阶段分类模块;当需要获取易混淆类别二元组时,预处理模块读取测试集,利用词嵌入方法将测试集中每个词映射为词级别编码,得到测试集的词级别编码序列集合,预处理模块将测试集的词级别编码序列集合发送给第一阶段分类模块;第一阶段分类模块与预处理模块
、
易混淆类别识别模块
、
边界样本筛选模块相连,接收用户输入的类别表,类别表由类别名称和类别下标两个域组成;第一阶段分类模块从预处理模块接收测试集词级别编码序列集合和
G(X)
,对测试集词级别编码序列集合进行分类,得到混淆矩阵,将混淆矩阵和类别表发送给易混淆类别识别模块;第一阶段分类模块对
G(X)
进行分类,得到
X
对应用户输入的类别表中每个类别的概率集合
P
,
P
=
{p1,p2,...,p
u
,...,p
U
}
,其中
p
u
表示第一阶段分类模块预测
G(X)
属于下标
u
对应类别的概率,取最高概率对应的类别作为
X
的类别
cat1,把
P
和
cat1发送给边界样本筛选模块;易混淆类别识别模块与第一阶段分类模块
、
边界样本筛选模块相连,从第一阶段分类模块接收类别表和混淆矩阵,对混淆矩阵中所有非对角线上的数值由小到大进行排列,得到第三四分位数
Q3
,通过
Q3
计算得到判断易混淆类别的阈值,将混淆矩阵中所有非对角线元素与易混淆类别阈值进行比较,得到易混淆类别二元组序列,将易混淆类别二元组序列和类别表发送给边界样本筛选模块;边界样本筛选模块与第一阶段分类模块
、
易混淆类别识别模块
、
第二阶段分类模块相连,从第一阶段分类模块接收
P
和
cat1,从易混淆类别识别模块接收易混淆类别二元组序列和类别表,设定再分类阈值为
ω
,将类别
cat1与易混淆类别二元组序列进行比较,若类别
cat1不属于易混淆类别二元组序列中某个二元组中的类别,则取
cat1作为
X
的类别;若类别
cat1属于易混淆类别二元组序列中某个二元组中的类别,则计算概率插值
Δ
p
;若
Δ
p>
ω
,取类别
cat1作为
X
的类别;若
Δ
p<
ω
,则将需要对
X
进行再分类的信号
flag
置为1,将
flag
发送给第二阶段分类模块;第二阶段分类模块由前馈神经网络层和线性分类层构成;前馈神经网络层与预处理模
块
、
线性分类层
、
边界样本筛选模块相连;训练时,前馈神经网络层从预处理模块接收训练集词级别编码序列集合,对训练集词级别编码序列集合中的每一条词级别编码进行非线性映射,得到训练集词级别编码序列集合非线性映射后的表示
Attn
,将
Attn
发送到线性分类层;当对用户输入的文本或源代码进行分类时,前馈神经网络层从边界样本筛选模块接收
flag
,从预处理模块接收
G(X)
,若信号
flag
值为1,对
G(X)
进行非线性映射,得到
G(X)
非线性映射后的表示
Attn'
,将
Attn'
发送给线性分类层;线性分类层与前馈神经网络层相连,训练时,线性分类层从前馈神经网络层接收
Attn
,对
Attn
进行线性映射,得到第一预测向量即
logits
,对
logits
进行
Softmax
操作,得到训练集中每个样本对应类别表中每个类别的概率集合
P'
,
P'
=
{p'1,p'2,...,p'
u
,...,p'
U
}
,其中
p'
u
表示第二阶段分类模型预测
T
m
属于下标
u
对应类别的概率,取最高概率对应的类别作为训练集中每个样本的类别
cat2,采用交叉损失熵函数计算损失
Loss
进行反向传播来更新模型参数;当对用户输入的文本或源代码进行分类时,线性分类层从前馈神经网络层接收
Attn'
,对
Attn'
进行线性映射,得到第二预测向量
logits'
,对
logits'
进行
Softmax
操作,得到
G(X)
对应类别表中每个类别的第二概率集合
PP'
,
PP'
=
{pp'1,pp'2,...,pp'
u
,...,pp'
U
}
,其中
pp'
u
表示第二阶段分类模型预测
X
属于下标
u
对应类别的概率,取最高概率对应的类别作为
X
的类别
cat2'
,把类别
cat2'
输出;第二步,准备训练两阶段分类系统的数据集,方法是:
2.1
采用
Polarity
数据集中的文本数据构建软件工程情感分类任务的第一训练集
、
第一测试集;将
Polarity
数据集中的
AA
条样本放到第一训练集,
BB
条样本放到第一测试集;
Polarity
数据集的每条样本包含一条文本和其对应的实际标签;第一训练集中的文本集合构成第一训练集集合
T
,第一训练集中的实际标签序列集合构成第一训练集实际标签序列集合
T
#
;令
T
=
{T1,T2,
···
T
m
,
···
,T
M
}
,其中
T
m
表示
T
中的第
m
条文本序列,其中
1≤m≤M
,
M
为
T
中的文本总数;中的文本总数;表示
T
m
的第
i
个词,
1≤i≤I
;第一测试集中的文本集合构成第一测试集集合
V
,
V
=
{V1,V2,
···
V
r
,
···
,V
R
}
,其中
V
r
表示
V
中的第
r
条文本,其中
1≤r≤R
,
R
为
V
中的文本总数,其中表示
V
r
中的第
q
个词,
1≤q≤Q
,
Q
为
V
r
中的词个数;第一测试集样本中的实际标签序列集合构成第一测试集实际标签序列集合
V
#
;
AA
和
BB
为正整数;
2.2
采用
MSR
数据集中的源代码数据构建软件工程情感分类任务的第二训练集
、
第二测试集;将
MSR
数据集中的
CC
条样本第二放到训练集,
DD
条样本放到第二测试集;
MSR
数据集的每条样本包含一条源代码和其对应的实际标签;第二训练集中的源代码集合构成第二训练集集合
RR
,第二训练集中的实际标签序列集合构成第二训练集实际标签序列集合
RR
#
;令
RR
=
{R1,R2,
···
R
n
,
···
,R
N
}
,其中
R
n
表示
RR
中的第
n
条源代码序列,
1≤n≤N
,
N
为
RR
中的源代码总数;源代码总数;表示
R
n
的第
i
个词;第二测试集中的源代码集合构成第二测试集集合
S
,
S
=
{S1,S2,
···
S
o
,
···
,S
O
}
,其中
S
o
表示
S
中的第
o
条文本,其中
1≤o≤O
,
O
为
S
中的源代码总数,中的源代码总数,其中表示
S
o
中的第
qq
个词,
1≤qq≤QQ
,
QQ
为
S
o
中的词个数;第二测试集样本中的实际标签序列集合构成第二测试集实际标签序列集合
S
#
;
CC
和
DD
为正整数;
第三步,若需要对文本数据进行分类,转第四步;若需要对源代码数据进行分类,转第五步;第四步,预处理模块使用预处理方法,将
T
中的文本数据映射为第一训练集词级别编码序列集合
G(T)
,将
V
中的文本数据映射为第一测试集词级别编码序列集合
G(V)
,方法是:
4.1
采用词级别映射方法将
T
中的
M
条文本数据映射为
G(T)
,方法是:
4.1.1
令变量
m
=1;
4.1.2
读取
T
中的第
m
条文本
T
m
,
采用词级别编码方法对
T
m
的中进行词映射,得到
T
m
的词级别编码序列
G(T
m
)
,方法是:
4.1.2.1
令变量
i
=1;
4.1.2.2
将
T
m
中的第
i
个词映射为词级别编码
4.1.2.3
令
i
=
i+1
,如果
i≤I
,转
4.1.2.2
;如果
i>I
,说明
T
m
中的
I
个词都已经映射为了词级别编码,得到
T
中第
m
条文本数据的词级别编码序列条文本数据的词级别编码序列条文本数据的词级别编码序列表示
T
m
的第
i
个词,转
4.1.3
;
4.1.3
令
m
=
m+1
,如果
m≤M
,转
4.1.2
;如果
m>M
,说明
T
的
M
个文本数据都已经映射为词级别编码序列,得到
G(T)
,
G(T)
=
{G(T1),G(T2),...,G(T
m
),...,G(T
M
)}
,
G(T
m
)
表示
T
中第
m
条文本数据的词级别编码序列;
4.2
采用
4.1
所述词级别映射方法将
V
中的
R
条文本数据映射为第一测试集词级别编码集合
G(V)
;
4.3
将
G(T)
发送给第二阶段分类模块,将
G(V)
发送给第一阶段分类模块,转第六步;第五步,预处理模块采用第四步所述预处理方法,将
RR
中的源代码数据映射为第二训练集词级别编码序列集合
G(RR)
,将
S
中的源代码数据映射为第二测试集词级别编码序列集合
G(S)
,将
G(RR)
发送给第二阶段分类模块,将
G(S)
发送给第一阶段分类模块,转第七步;第六步,第一阶段分类模块接收用户输入的类别表,从预处理模块接收
G(V)
,采用分类方法对
G(V)
进行分类,获得第一混淆矩阵
CM
,方法是:
6.1
第一阶段分类模块接收用户输入的类别表,从预处理模块接收
G(V)
;类别表由类别名称和类别下标两个域组成,
U
是类别表中类别名称的总数;
6.2
第一阶段分类模块对
G(V)
进行分类,得到类别集合
pred
;
6.3
第一阶段分类模块使用
confusion_matrix
函数获得第一混淆矩阵
CM
,
CM
=
{p
11
,p
12
,...p
uu'
,...,p
UU
,}
,其中
p
uu'
表示第一阶段分类模块将下标
u
对应的类别预测为下标
u'
对应的类别的概率,
1≤u≤U
,
1≤u'≤U
;
6.4
第一阶段分类模块将
CM
和类别表发送给易混淆类别识别模块,转第八步;第七步,第一阶段分类模块接收用户输入的类别表,从预处理模块接收
G(S)
,使用第六步所述分类方法对
G(S)
进行分类,获得第二混淆矩阵
CM'
,将
CM'
和类别表发送给易混淆类别识别模块,转第九步;第八步,易混淆类别识别模块采用识别方法,使用第一混淆矩阵
CM
获得第一易混淆类别二元组序列
L
,方法为:
8.1
初始化第一易混淆类别二元组序列
L
为空;
8.2
对第一混淆矩阵
CM
中所有非对角线上的数值由小到大进行排列;
8.3
计算排列后
CM
的第三四分位数
Q3
;
8.4
令易混淆类别阈值
δ
=
2Q3
;
8.5
令变量
u
=1;
8.6
令变量
u'
=1;
8.7
比较
p
uu'
和
δ
;若
p
uu'
>
δ
,则下标
u
对应的类别和下标
u'
对应的类别是一组易混淆类别二元组,将二元组
(u
对应的类别
,u'
对应的类别
)
加入
L
;
8.8
令
u'
=
u'+1
,如果
u'≤U
,转
8.7
;如果
u'>U
,说明
CM
中的一行已经遍历完成,转
8.9
;
8.9
令
u
=
...
【专利技术属性】
技术研发人员:李姗姗,李佳颖,姜志杰,张元良,董威,陈立前,汪昌健,马迎伟,方寸谛,李星沛,
申请(专利权)人:中国人民解放军国防科技大学,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。