文本分类模型_文本分类模型之TextCNN
一、理論篇:
在我們的場景中,文本數據量比較大,因此直接采用深度學習模型來預測文本類目的多標簽,而TextCNN向來以速度快,準確率高著稱。TextCNN的核心思想是抓取文本的局部特征:通過不同的卷積核尺寸(確切的說是卷積核高度)來提取文本的N-gram信息,然后通過最大池化操作來突出各個卷積操作提取的最關鍵信息(頗有一番Attention的味道),拼接后通過全連接層對特征進行組合,最后通過交叉熵損失函數來訓練模型。
模型的第一層就是Embedding層,預訓練的詞嵌入可以利用其它語料庫得到更多的先驗知識,經過模型訓練后能夠抓住與當前任務最相關的文本特征。在我們的應用場景中,使用預訓練的Embedding比隨機初始化帶來的效果不是特別顯著。第二層為卷積層,CV中常見的卷積尺寸通常是正方形,而本文的卷積尺寸與之不同,本文的卷積寬度等于文本Embedding后的維度,保持不變,因為每個詞或字相當于一個最小的單元,不可進一步分割。而卷積核的高度可以自定義,在向下滑動的過程中,通過定義不同的窗口來提取不同的特征向量,有點類似于N-gram過程。這樣不同的kernel可以獲取不同范圍內詞的關系,獲得的是縱向的差異信息,也就是在一個句子中不同范圍的詞出現會帶來什么信息。比如可以使用3,4,5個詞數分別作為卷積核的大小),每個卷積尺寸下又有多個相同的卷積核(原因是卷積神經網絡學習的是卷積核中的參數,每個filter都有自己的關注點,它們可以從同一個窗口學習相互之間互補的特征,這樣多個卷積核就能學習到不同的信息,比如可以設置size為3的filter有4個卷積核)。
第三層是最大池化層,即為從每個滑動窗口產生的特征向量中篩選出一個最大的特征,然后將這些特征拼接起來構成向量表示。也可以選用K-Max池化(選出每個特征向量中最大的K個特征),或者平均池化(將特征向量中的每一維取平均)等,達到的效果都是將不同長度的句子通過池化得到一個定長的向量表示。在短文本分類場景中,每條文本中都會有一些對分類無用的信息,而最大池化可以突出最重要的關鍵詞以幫助模型更容易找到對應的類目。
接下來的幾層就跟具體的任務相關了,一般都會拼接特征,在通過全連接層自由組合提取出來的特征實現分類。在損失函數上,二分類和多標簽分類可以采用基于Sigmoid函數的交叉熵損失函數binary_crossentropy,多分類任務可以采用基于Softmax的多類別交叉熵損失函數(categorical_crossentropy)。
二、代碼部分:
def textcnn(hyper_parameters):input = Input(shape=(hyper_parameters.max_len,))if hyper_parameters.embedding_matrix is None:embedding = Embedding(input_dim=hyper_parameters.vocab + 1,output_dim=hyper_parameters.emd_dim,input_length=hyper_parameters.MAX_LEN,trainable=True)(input)else: # 使用預訓練矩陣初始化Embeddingembedding = Embedding(input_dim=hyper_parameters.vocab + 1,output_dim=hyper_parameters.emd_dim,weights=[hyper_parameters.embedding_matrix],input_length=hyper_parameters.MAX_LEN,trainable=False)(input)convs = []for kernel_size in hyper_parameters.kernel_size:conv = Conv1D(hyper_parameters.conv_code, kernel_size,activation=hyper_parameters.relu)(embedding)pool = MaxPooling1D()(conv)convs.append(pool)concat = Concatenate()(convs)flattern = Flatten()(concat)dropout = Dropout(hyper_parameters.dropout)(flattern)output = Dense(hyper_parameters.classes, activation=hyper_parameters.sigmoid)(dropout)model = Model(input, output)model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])return model在Embedding部分,如果有條件可以使用自己預訓練的文本信息來初始化Embedding矩陣,效果可能會比隨機初始化Embedding提升一點。
三、幾點思考:
1.TextCNN能用于文本分類的主要原因是什么?
除了預訓練文本外,TextCNN通過利用不同的卷積核尺寸并行提取文本的信息(類似N-gram),并通過最大池化來突出最重要的關鍵詞來實現分類。
2.TextCNN的缺點:
2.1. TextCNN的卷積和池化操作會丟失文本序列中的詞匯順序和位置信息等內容,但也可利用這一點來增強文本,例如白色旅游鞋,可以添加旅游鞋白色數據等,分詞后白色和旅游鞋位置就可以互換來豐富語料 。
2.2. 在長文本使用TextCNN效果可能沒有在短文本中效果好(具體還需要實踐確認),原因同上,因此可以嘗試使用Top k池化替代最大池化提取更多的文本信息。
https://arxiv.org/pdf/1408.5882.pdf?arxiv.org小占同學:深入TextCNN(一)詳述CNN及TextCNN原理?zhuanlan.zhihu.com總結
以上是生活随笔為你收集整理的文本分类模型_文本分类模型之TextCNN的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: haproxy负载均衡_基于mycat+
- 下一篇: insert 语句_CTF从入门到提升(