藉助kaggle比賽 https://www.kaggle.com/c/jigsaw-unintended-bias-in-toxicity-classification/overview 做些文本分類的總結
此次介紹文本分類領域經典模型textCNN,因爲結構簡單,效果好,提供keras和tensorflow代碼供學習
相關論文:https://arxiv.org/abs/1408.5882
相關細節
1. 數據預處理部分:比賽是多分類問題,需要判斷文本中的評論是否是有毒評論(即帶有髒話、歧視性的字詞),主要步驟如下
-- 分詞:對於英文文本分類也需要分詞,去掉一些停用詞,大寫轉小寫,去掉無意義的符號,去掉一些高頻低頻詞,中文也如此
-- 建立詞典以及單詞索引:建立詞典就是統計文本中出現多少了單詞,然後爲每個單詞編碼一個唯一的索引號,便於查找。如果對以上詞典建立單詞索引,結果如下圖示意:
-- 將訓練文本用單詞索引好表示,對於不同長度的文本,一般都是通過觀察文本長度分佈來設置合適的最大長度,例如本賽題設置爲250,不足的要補全,多餘的要剔除,只保留最高頻的詞索引。keras中相關的接口函數爲Tokenizer、pad_sequences等
2. TextCNN結構
TextCNN的結構比較簡單,輸入數據首先通過一個embedding layer,得到輸入語句的embedding表示,然後通過一個convolution layer,提取語句的特徵,最後通過一個fully connected layer得到最終的輸出,整個模型的結構如下圖:
注意上圖,傳統圖像處理中的卷積核一般都是正方形的,比如(3,3),然後在整張image上沿寬和高進行卷積操作。但是nlp中的"image"是詞矩陣,比如n個words,每個word用200維的vector表示的話,這個”image”就是n*200的矩陣,卷積核只在高度上已經滑動,在寬度上和word vector的維度一致(=200),也就是說每次窗口滑動過的位置都是完整的單詞,不會將幾個單詞的一部分“vector”進行卷積,這也保證了word作爲語言中最小粒度的合理性。
由於卷積核和word embedding的寬度一致,一個卷積覈對於一個sentence,卷積後得到的結果是一個vector, shape=(sentence_len - filter_window + 1, 1),那麼,在max-pooling後得到的就是一個Scalar。所以,這點也是和圖像卷積的不同之處,需要注意一下
正是由於max-pooling後只是得到一個scalar,在nlp中,會實施多個filter_window_size(比如3,4,5個words的寬度分別作爲卷積的窗口大小),每個window_size又有num_filters個(比如64個)卷積核。一個卷積核得到的只是一個scalar太孤單了,智慧的人們就將相同window_size卷積出來的num_filter個scalar組合在一起,組成這個window_size下的feature_vector。
最後再將所有window_size下的feature_vector也組合成一個single vector,作爲最後一層softmax的輸入。
(重要的事情說三遍:一個卷積覈對於一個句子,convolution後得到的是一個vector;max-pooling後,得到的是一個scalar。)
3. 模型參數:
a. 構建模型的基本參數:
filter windows:[3,4,5]
filter maps:100 for each filter window
dropout rate:0.5
l2 constraint:3
randomly select:10% of training data as dev set(early stopping)
word2vec(google news) as initial input, dim = 300
sentence of length: n, padding where necessary
number of target classes
dataset size
vocabulary size
b. 訓練模型參數設置
batch size: 50
shuffuled mini batch
optimizer:Adam、SGD、Adadelta and so on...
Test method: standard train/test split ot CV
c. Dropout注意事項:正則是解決過擬合的問題,在最後一層softmax的時候是full-connected layer,因此容易產生過擬合。
策略就是在:
在訓練階段,對max-pooling layer的輸出實行一些dropout,以概率p激活,激活的部分傳遞給softmax層。
在測試階段,w已經學好了,但是不能直接用於unseen sentences,要乘以p之後再用,這個階段沒有dropout了全部輸出給softmax層。
d. Embedding Layer
# Embedding layer
with tf.device('/cpu:0'),tf.name_scope("embedding"):
w = tf.Variable(
tf.random_uniform([vocab_size,embedding_size],-1.0,1.0),name='w')
self.embedded_chars = tf.nn.embedding_lookup(w,self.input_x)
self.embedded_chars_expanded = tf.expand_dims(self.embedded_chars, -1)
其他模型細節可以參考本文末尾的鏈接
參考鏈接:
1. textCNN細節解釋:https://blog.csdn.net/accumulate_zhang/article/details/78504637
2. textCNN訓練預測版本:https://blog.csdn.net/u012762419/article/details/79561441
3. github tensorflow base版本:https://github.com/dennybritz/cnn-text-classification-tf/blob/master/text_cnn.py
4. 完整tensorflow 版本:https://github.com/brightmart/text_classification/tree/master/a02_TextCNN