cnn 文本分類
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 文本分類