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(錯誤答案)
同時返回3個mask,用於標識數據集語句除去 < a > 后的真實的長度
6. LSTM Model
proj_size=100
初始化LSTM的參數
project_size=100
tparams={}
grad_params=[]
隨機生成ndimndim的矩陣W,對其進行SVD分解得到 u,s,v,返回floatX的u,維度100100
初始化W,維度為100400
W_t=W
tparam[‘lstm_W’]=W_t
初始化U,維度為100400,U_T=U,tparam[‘lstm_U’]=W_t
初始化b,b的維度為4001,初始化為0,b_t=b,tparam[‘lstm_b’]=b_t
grad_params=[W_t, U_t,b_t]
返回tparam和grad_params
返回后的分別賦值給tparam和self.params
初始化CNN的參數
filter_sizes=[1,2,3,5]
num_filters=500
proj_size=100
tparam={lstm_U, lstm_w, lstm_b} 之前lstm初始化時賦好的值
self.params=lstm賦好的self.params
對於filter_sizes中的每一個元素(以2為例):
filter_shape=(num_filters,1,filter_size,proj_size)=(500,1,2,100)
fan_in=filter_shape[1:]的乘積=200
fan_out=filter_shape[0]np.prod(filter_shape[2:]) 500filter_shapefilter_sizeproj_size=100000
W_bound=
W初始化為最低值為-w_bound,最大值為w_bound,size=filter_shape
=tparams[‘cnn_w_2’]=W
初始化b為5001維的向量
=tparams[‘cnn_b_2’]=b
grand_params+=[W,b]
最終返回tparams和grad_params 各含有11個元素
lookup_table=word_embedding
tparams[‘lookup_table’]=lookup_table
input1, input2, input3分別是問題,正確答案,錯誤答案
這一函數首先將input的訓練集轉成詞向量模式的
將input的矩陣reshape成(sequence_len,batch_size, embedding_size)(100,256,100)的input_x
state_below就是input
nsteps=訓練數據的sequence_len
n_samples=訓練數據的batch_size
input=input*lstm_W+lstm_b
通過scan做lstm的相關步驟
得到的輸出在輸入CNN中,抽取特征,計算問題,正確答案,錯誤答案的相似度,余下的與QACNN類同