1. 程式人生 > >cnn 文本分類

cnn 文本分類

初始 技術 榜上 無效 指正 get 評價標準 ictclas 實驗室

1 引言

1.1 隊伍簡介

隊伍名“讀機器學習日報長大的”,三位成員分別是“凡人哥”、“雨辰醬”和“yuye2311”,均來自蘇州大學自然語言處理實驗室。

1.2 任務簡介

2017年4月17號AI100發布了為期一個月的文本分類練習賽,數據集由文因互聯提供,要求參賽者根據所提供的脫敏後的企業文本數據,篩選並判定該企業所屬的類別,評價標準為Acc。其中,文本數據的內容,是對企業的經營範圍和主營業務等基本信息的描述。數據文件描述如下圖所示。
技術分享
抱(沖)著(著)學(獎)習(品)交(去)流(的)的心態,和實驗室的另外兩個小夥伴組隊參加了這次練習賽,在線上的最終得分是0.869。
特別說明:排行榜上我們的得分是0.871,但由於使用了中文Wikipedia訓練詞向量,屬於外部數據,該分數無效,在沒有使用任何外部數據的情況下我們的得分為0.869。

2 方法

任務很容易理解,就是給定一段企業文本數據,要求分類器判定該企業所屬的類別。簡單地分析了一下語料,如下例所示:
> 公司是經批準依法從事融資性擔保業務的金融機構,主營業務為融資性擔保業務,包括貸款擔保、農民工工資擔保、票據承兌擔保等業務。

可以看出,基本上一些關鍵詞(如“金融”、“貸款”等)就可以確定該公司的類別,並不需要一個較長的上下文的理解,出於這樣的考慮,我們選擇CNNs作為本次任務的模型。

2.1 分詞 & 詞性標註

分詞和詞性標註工具我們比較了結巴分詞和中科院的NLPIR,在實驗中發現中科院的分詞系統表現較好,處理後的文本如下所示。
> 公司/n 是/vshi 經/p 批準/v 依法/d 從事/vi 融資/vi 性/ng 擔保/vn 業務/n 的/ude1 金融/n 機構/n ,/wd 主營業務/n 為/p 融資/vn 性/n 擔保/vn 業務/n ,/wd 包括/v 貸款/n 擔保/vn 、/wn 農民工/n 工資/n 擔保/vn 、/wn 票據/n 承兌/vn 擔保/vn 等/udeng 業務/n 。/wj “/wyz

2.2 模型

我們采用的模型是簡單的CNNs,包括輸入層,Look-up tables,卷積層,池化層和輸出層,其中Look-up table包括詞和詞性,模型結構如下圖所示。
技術分享

2.2.1 輸入層

對於詞向量的訓練,由於任務規定不能使用外部數據,所以我們直接利用練習賽提供的7000余條句子訓練詞向量,工具是gensim,使用skip-gram模型,詞向量的維度設置為256,並過濾掉頻次低於3的詞,最終訓練出詞向量的詞表size為8616。
而對於詞性向量我們使用隨機的方式初始化,維度為64,詞性表的size為96。

2.2.2 卷積層 & 池化層

卷積操作可以編碼句子的局部特征,卷積核對句子卷積所得到的向量稱為feature map,在實驗中我們設置卷積數量為1000,窗口大小為3。
接著是池化層,使用的是常用的max pooling,提取出feature map中最重要的信息。

2.2.3 Softmax層

最後是模型的輸出層,為了防止模型的過擬合,我們在全連接層之前加了一個dropout機制,同時對全連接層權值給予一個L2正則化的懲罰項,梯度更新法則選用Adam。

2.2.4 一些想法

我們在以上模型的基礎上又嘗試了以下一些簡單的方法,不過在實驗中並沒有效果,由於時間關系也沒有去深入分析,這裏列出來供大家參考:

  • 過采樣。統計語料可以發現,類別的分布並不平衡,我們希望通過采樣增加一些少數類別實例的數量,采樣方式只是簡單地增加少數類別實例的數量。
  • 提取關鍵句子。觀察語料可以發現,企業基本信息的描述中很多都帶有“主營業務”、“主要”、“致力於”等關鍵詞,通過這些關鍵詞可以過濾掉一些無關的句子,一方面可以減少輸入的噪音,另一方面可以提升模型的效率。

3 實驗

實驗中,我們抽取訓練數據的80%作為訓練集,20%作為開發集,用開發集上Acc最高的模型去標記測試數據。這裏我們簡單地做了一個融合:每次取不同的20%的數據作為開發集,剩余的數據作為訓練集,這樣共得到5組結果,最後將這5組結果進行投票融合,線上表現可以得到0點幾個點的提升。

4 總結(附源碼)

任務本身比較簡單,也沒有花太長時間去做,這裏只是簡單地做了個總結,希望和大家共同學習探討。最後,附上源碼,希望大家批評指正。

cnn 文本分類