zoukankan      html  css  js  c++  java
  • (QACNN)自然语言处理:智能问答 IBM 保险QA QACNN 实现笔记

    train集:
    包含若干条与保险相关的问题,每一组问题对为一行,示意如下:

    可分为四项,第三项为问题,第四项为答案:

    1.build_vocab
    统计训练集中出现的词,返回结果如下(一个包含3085个元素的dict,每个词作为一个key,value为这些词出现的顺序):
    2. load_word_embedding(vocab,embedding_size)
    vocab为第一步获取的词集,embedding_size=100
    load_vectors()
    获取预先训练好的保存在vectors.nobin中的词向量
    返回的vector中保存有22353个词的向量

    然后通过暴力匹配,获取vocab中每个词的词向量,存在embeddings中,embedding中的序数对应的是vacab中的key的value

    3. load_train_list
    获取保存在train中18540个问题与答案

    4. load_test_list
    获取保存在test.sample中的问题与答案,共10000条
    在测试集中,共有20个问题,每个问题包含若干个正确答案与错误答案,共500个答案,由每一行的第一个元素标识,为1时为正确答案,为0时为错误答案
    5.load_data(trainList,vocab,batch_size)
    batch_size=256
    encode_sent(vocab,string,size) 讲string中的词转换成vocab中所对应的的序号
    得到一个batch_size的train_1(问题),train_2(正确答案), train_3(错误答案)

    6. QACNN Model

    input1: 问题, input2:正向答案 input3:负向答案
    word_embeddings: load_word_embedding中获取的3085个词的词向量
    讲输入的内容为词序号的训练数据转换成词向量
    将input拓展成4维的向量:(数量,1,每一句的词数量(此处统一为100),词向量的size)
    设置filter,filter_sizes=[2,3,5]
    对于每一个filter_size:
    filter_shape=(num_filters,1,filter_size,embedding_size)=(500,1,2,100) (以第一个为例,下同理)
    image_shape=(batch_size,1,sequence_len,embedding_size)=(256,1,100,100)
    fan_in=filter_sizeembedding_size
    fan_out=num_filters
    fan_in
    W_bound=0.00774
    W初始化为最大值为W_bound,最小值为-w_bound,size为filter_shape=(500,1,2,100)的向量
    偏置b初始化为[500,]的向量
    卷积
    对于问题input_x1:
    1) (256,1,100,100)卷(500,1,2,100)
    2) 然后最大池化,池化下采样后为(sequence_len-filter_size+1,1)=(99,1),也就是(256,500,99,1)
    3) 然后输入tanh中 得到pooled_active
    4)ouputs_1.append(pooled_active)

    对正向答案input_2与负向答案input_3做相同的操作,得到ouputs_2.append(pooled_active), output_3.append(pooled_active)
    self.params += [W,b]
    遍历完filter_sizes中的3个元素后,得到各包含3个元素的ouputs_1,ouputs_2,ouputs_3,self.params

    总共的filter数量为num_filter_total=500*3=1500
    self.dbg_x1=input_x1
    self.dbg_outputs_1=outputs_1[0].shape
    将每个句子表示为(256,1500)的向量
    使用dropout
    计算问题与正向答案,问题与负向答案的cos夹角 cos12, cos13
    计算损失函数得到cost
    计算准确率

    计算梯度
    更新
    epoch到一定数量时,validation
    validation
    加载test数据集得到问题,正向答案,负向答案 x1, x2, x3

    __validation_model__输入问题,正向答案,负向答案,以及学习率,输出cos12, cos13
    排序每一个问题中的cos12,根据分数最高的判断算法的正确性,如果排名最高的正确答案,则算法判断正确,否则,算法判断错误

    总结:

    该算法通过CNN学习得到一个模型,模型提取得到问题,正确答案,错误答案的相关特征,这些特征使得问题与正确答案相似,与错误答案不想似,最终从答案库中寻找到正确答案。





  • 相关阅读:
    [转] 你不知道的JavaScript和CSS交互的方法
    threejs学习笔记(9)
    把Mongodb配置成windows服务
    mongodb的一些基本操作
    DuiLib事件分析(一)——鼠标事件响应
    DuiLib学习bug整理——某些png不能显示
    DuiLib学习笔记5——标题栏不能正常隐藏问题
    DuiLib学习笔记4——布局
    DuiLib学习笔记3——颜色探究
    DuiLib学习笔记2——写一个简单的程序
  • 原文地址:https://www.cnblogs.com/combfish/p/6474298.html
Copyright © 2011-2022 走看看