文本分类模型_文本分类模型之TextCNN
一、理論篇:
在我們的場景中,文本數(shù)據(jù)量比較大,因此直接采用深度學(xué)習(xí)模型來預(yù)測文本類目的多標(biāo)簽,而TextCNN向來以速度快,準(zhǔn)確率高著稱。TextCNN的核心思想是抓取文本的局部特征:通過不同的卷積核尺寸(確切的說是卷積核高度)來提取文本的N-gram信息,然后通過最大池化操作來突出各個卷積操作提取的最關(guān)鍵信息(頗有一番Attention的味道),拼接后通過全連接層對特征進(jìn)行組合,最后通過交叉熵?fù)p失函數(shù)來訓(xùn)練模型。
模型的第一層就是Embedding層,預(yù)訓(xùn)練的詞嵌入可以利用其它語料庫得到更多的先驗知識,經(jīng)過模型訓(xùn)練后能夠抓住與當(dāng)前任務(wù)最相關(guān)的文本特征。在我們的應(yīng)用場景中,使用預(yù)訓(xùn)練的Embedding比隨機(jī)初始化帶來的效果不是特別顯著。第二層為卷積層,CV中常見的卷積尺寸通常是正方形,而本文的卷積尺寸與之不同,本文的卷積寬度等于文本Embedding后的維度,保持不變,因為每個詞或字相當(dāng)于一個最小的單元,不可進(jìn)一步分割。而卷積核的高度可以自定義,在向下滑動的過程中,通過定義不同的窗口來提取不同的特征向量,有點類似于N-gram過程。這樣不同的kernel可以獲取不同范圍內(nèi)詞的關(guān)系,獲得的是縱向的差異信息,也就是在一個句子中不同范圍的詞出現(xiàn)會帶來什么信息。比如可以使用3,4,5個詞數(shù)分別作為卷積核的大小),每個卷積尺寸下又有多個相同的卷積核(原因是卷積神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)的是卷積核中的參數(shù),每個filter都有自己的關(guān)注點,它們可以從同一個窗口學(xué)習(xí)相互之間互補(bǔ)的特征,這樣多個卷積核就能學(xué)習(xí)到不同的信息,比如可以設(shè)置size為3的filter有4個卷積核)。
第三層是最大池化層,即為從每個滑動窗口產(chǎn)生的特征向量中篩選出一個最大的特征,然后將這些特征拼接起來構(gòu)成向量表示。也可以選用K-Max池化(選出每個特征向量中最大的K個特征),或者平均池化(將特征向量中的每一維取平均)等,達(dá)到的效果都是將不同長度的句子通過池化得到一個定長的向量表示。在短文本分類場景中,每條文本中都會有一些對分類無用的信息,而最大池化可以突出最重要的關(guān)鍵詞以幫助模型更容易找到對應(yīng)的類目。
接下來的幾層就跟具體的任務(wù)相關(guān)了,一般都會拼接特征,在通過全連接層自由組合提取出來的特征實現(xiàn)分類。在損失函數(shù)上,二分類和多標(biāo)簽分類可以采用基于Sigmoid函數(shù)的交叉熵?fù)p失函數(shù)binary_crossentropy,多分類任務(wù)可以采用基于Softmax的多類別交叉熵?fù)p失函數(shù)(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: # 使用預(yù)訓(xùn)練矩陣初始化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部分,如果有條件可以使用自己預(yù)訓(xùn)練的文本信息來初始化Embedding矩陣,效果可能會比隨機(jī)初始化Embedding提升一點。
三、幾點思考:
1.TextCNN能用于文本分類的主要原因是什么?
除了預(yù)訓(xùn)練文本外,TextCNN通過利用不同的卷積核尺寸并行提取文本的信息(類似N-gram),并通過最大池化來突出最重要的關(guān)鍵詞來實現(xiàn)分類。
2.TextCNN的缺點:
2.1. TextCNN的卷積和池化操作會丟失文本序列中的詞匯順序和位置信息等內(nèi)容,但也可利用這一點來增強(qiáng)文本,例如白色旅游鞋,可以添加旅游鞋白色數(shù)據(jù)等,分詞后白色和旅游鞋位置就可以互換來豐富語料 。
2.2. 在長文本使用TextCNN效果可能沒有在短文本中效果好(具體還需要實踐確認(rèn)),原因同上,因此可以嘗試使用Top k池化替代最大池化提取更多的文本信息。
https://arxiv.org/pdf/1408.5882.pdf?arxiv.org小占同學(xué):深入TextCNN(一)詳述CNN及TextCNN原理?zhuanlan.zhihu.com總結(jié)
以上是生活随笔為你收集整理的文本分类模型_文本分类模型之TextCNN的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: haproxy负载均衡_基于mycat+
- 下一篇: insert 语句_CTF从入门到提升(