文本分類textCNN模型理解

藉助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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章