项目实训(四)
根据队伍前面确立下的思路,最近一周我们通过代码实现,并取得了相关结果。
思路
思路图示
符号说明
Xt,At分别对应处理过的考生答案文本和标准答案文本;
X,A分别对应bert生成的句向量组成的矩阵;
αA_X对应X与A生成的互注意力向量;
AX是A与αA_X生成的考生答案的标准答案表示矩阵;
Vk是AX经过flatten处理;
S是Vk经过全连接神经网络NN之后生成的评分估计,是一个向量。
具体实现
数据预处理
1.将xlsx格式数据转为csv格式,用pandas读入:
df = pd.read_csv('路径',header=0,encoding='gbk',low_memory=False)
ans_list = df['answer'].tolist()
p_list = df['1p'].tolist()
2.处理噪音:
for i in range(0, 110):
if isinstance(ans_list[i], str) and ans_list[i] != '':
ansitem = ans_list[i].replace('<p>', '').replace('</p>', '') \
.replace('</P>', '').replace('<P>','').replace(' ', '')\
.replace('</>','').replace('<br>','').replace('<BR>','')\
.replace(' ','').replace('\n','')
if ansitem[-1] == '。':
ansitem = ansitem[0:-1]
生成X,A
1.安装使用bert,在这里我选择bert-as-server
2.使用简单的for循环,使用encode方法生成句向量
vectorA_list = []
for item in res:
t = bc.encode([item])
vectorA_list.append(t[0])
生成αA_X
要计算得出互注意力向量,需要先计算X与A的匹配系数,得到匹配系数矩阵。
1.匹配矩阵:计算考生答案的第i句话与标准答案第j句话匹配程度,我们让这两句话的句向量相乘,得到匹配系数mij,进而得到匹配矩阵M;
2.将M的行列分别进行归一化,并对行归一化进行期望计算,得到期望向量avg,将avg于列归一化得到的矩阵相乘,得到互注意力向量αA_X。
生成AX
αA_X与A叉乘即可得到
生成Vk
vk = Ax.flatten()
NN实现及评分细节(略)
见项目实训(五)
输出效果展示
参考文献
《基于知识点的专业文本可解释评阅研究》李东进