- follow: https://github.com/white127/insuranceQA-cnn-lstm
http://www.52nlp.cn/qa%E9%97%AE%E7%AD%94%E7%B3%BB%E7%BB%9F%E4%B8%AD%E7%9A%84%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E6%8A%80%E6%9C%AF%E5%AE%9E%E7%8E%B0
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_filtersfan_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學習得到一個模型,模型提取得到問題,正確答案,錯誤答案的相關特征,這些特征使得問題與正確答案相似,與錯誤答案不想似,最終從答案庫中尋找到正確答案。