概述
自然語言分類是指按照預先定義的主題類別剑鞍,為文檔集合中的每個文檔確定一個類別弟晚。本文將介紹一個限定類別的自然語言分類器的原理和實現(xiàn)芥炭。采用Python作為編程語言晴股,采用樸素貝葉斯作為分類器调榄,使用jieba進行分詞踊赠,并使用scikit-learn實現(xiàn)分類器。
訓練數(shù)據(jù)來自于鳳凰網(wǎng)每庆,最終交叉驗證的平均準確率是0.927筐带。
一、訓練數(shù)據(jù)獲取
中文自然語言分類現(xiàn)成可用的有搜狗自然語言分類語料庫缤灵、北京大學建立的人民日報語料庫伦籍、清華大學建立的現(xiàn)代漢語語料庫等蓝晒。由于語言在使用過程中會不斷演進,具有一定的時效性帖鸦,我們最終決定自己開發(fā)爬蟲爬取訓練數(shù)據(jù)芝薇。經(jīng)過綜合考慮,我們最終將目標選定為鳳凰網(wǎng)作儿。
我們選取鳳凰網(wǎng)移動版開展數(shù)據(jù)獲取工作洛二,地址為http://i.ifeng.com/ 如圖1所示。移動版的頁面布局簡單清晰攻锰,但由于文章列表采用了下拉刷新的動態(tài)更新策略晾嘶,直接解析頁面源碼效率太低,最終決定直接調(diào)用網(wǎng)頁api獲取口注。比如獲取十條鳳凰“軍事”的內(nèi)容变擒,訪問http://imil.ifeng.com/20_2/data.shtml 返回結果如圖2左。最終獲取到4784條新聞寝志,都保存到MySQL數(shù)據(jù)庫,具體數(shù)據(jù)如圖2右策添。從中看出材部,軍事類的文章相對偏少,體育類的文章偏多唯竹。
二乐导、樸素貝葉斯介紹
1.貝葉斯定理
貝葉斯定理是關于隨機事件 A 和 B 的條件概率:
其中,P(A)是A的先驗概率浸颓,之所以稱為“先驗”是因為它不考慮任何B方面的因素物臂。P(A|B)是已知B發(fā)生后A的條件概率,也由于得自B的取值而被稱作A 的后驗概率产上。P(B|A)是已知A發(fā)生后B的條件概率棵磷,也由于得自A的取值而被稱作B的后驗概率。P(B)是B的先驗概率晋涣,也稱作標淮化常量(normalizing constant)仪媒。按這些術語,貝葉斯定理可表述為:
后驗概率 = (相似度 * 先驗概率)/標淮化常量
2****.貝葉斯概率觀
一般學院派的概率觀可以稱作頻率主義谢鹊。一個事件算吩,如果重復獨立地執(zhí)行多次,把發(fā)生的次數(shù)除以執(zhí)行的次數(shù)佃扼,就得到一個頻率偎巢。比如說拋硬幣,拋了10000次兼耀,有4976次正面向上压昼,頻率就是0.4976挎扰。然后如果執(zhí)行的次數(shù)很多很多,頻率會趨向于一個固定的值巢音,就是這個事件的概率遵倦。理論基礎是中心極限定理。
貝葉斯概率觀與此很不同官撼。主觀貝葉斯主義認為梧躺,概率就是個人對某個事件發(fā)生可能性的一個估計。如果對一個事件你一無所知傲绣,那么你可以隨便猜一個概率掠哥。但因為是估計,如果有新的信息秃诵,那就必須根據(jù)新信息對概率進行修正续搀。這樣的話,隨著經(jīng)歷越來越多菠净,對概率的估計也會越來越符合“實際情況”禁舷。
3.樸素貝葉斯分類器
分類器基本原理:
對一個多維的輸入向量x,根據(jù)貝葉斯公式毅往,有:
條件獨立性假設:
放到自然語言分類器的應用中理解牵咙,就是在給定文本的類別的條件下,文本中出現(xiàn)的詞的概率是相互獨立的攀唯。樸素貝葉斯之所以“樸素”洁桌,就是因為條件獨立性假設是一個較強的假設。于是:
從自然語言分類的角度上說侯嘀,一個文本屬于哪個類另凌,要計算所有類別的先驗概率和所有詞在相應類別下的后驗概率,再一起乘起來戒幔,哪個類別對應的值最大吠谢,就歸為哪類。
三溪食、分類器實現(xiàn)
1.數(shù)據(jù)預處理
文本放到分類器中分類囊卜,必須先將文本數(shù)據(jù)向量化,因為scikit-learn的分類器大多輸入的數(shù)據(jù)類型都是numpy數(shù)組和類似的類型错沃。這一步可以通過scikit-learn中特征抽取模塊feature_extraction中text.CountVectorizer栅组、text.TfidfVectorizer和text.HashingVectorizer實現(xiàn)。
另外,在向量化之前割去,還有一步是十分必要的窟却。上述的方法是針對英文設計實現(xiàn)的,因此接收的數(shù)據(jù)類型也是默認通過空格的截斷獲取分詞結果呻逆。因此要講中文向量化夸赫,必須要先分詞。這一步我們通過jieba實現(xiàn)咖城。最后的輸入文本類似圖3這樣的格式茬腿。CountVectorize的轉換結果如圖4,向量的每個值代表一個詞出現(xiàn)的個數(shù)酒繁。HashingVectorizer的轉換結果如圖5滓彰。TfidfVectorizer的轉換結果如圖6,這里我們設置參數(shù)use_idf=False州袒,即只使用tf,但并不等同于CountVectorize弓候,而是相當于個數(shù)+歸一化郎哭。
2.調(diào)參
確定了模型之后,可以直接使用Scikit-learn中的GridSearchCV來尋找最佳超參數(shù)菇存。
另外一個提高準確率的技巧是刪除停用詞夸研。之前分詞的過程中使用的是通用的中文停用詞,比如“這”依鸥,“那”等沒有實際語義的詞亥至。但是這里對于文章的分類來說還有一些高頻出現(xiàn)但是對主題沒有影響的詞,即便他們本身是有語義的贱迟。比如“時間”姐扮、“圖”等。
3.組合
組合技術即通過聚集多個分類器的預測來提高分類準確率衣吠。常用的組合分類器方法:
1)裝袋(bagging):根據(jù)均勻概率分布從數(shù)據(jù)集中重復抽樣(有放回)茶敏,每個自助樣本集和原數(shù)據(jù)集一樣大,每個自助樣本集含有原數(shù)據(jù)集大約63%的數(shù)據(jù)缚俏。訓練k個分類器惊搏,測試樣本被指派到得票最高的類贮乳。
2)提升(boosting):通過給樣本設置不同的權值,每輪迭代調(diào)整權值恬惯。不同的提升算法之間的差別向拆,一般是(1)如何更新樣本的權值;(2)如何組合每個分類器的預測酪耳。其中在Adaboost中浓恳,樣本權值是增加那些被錯誤分類的樣本的權值,分類器C_i的重要性依賴于它的錯誤率葡兑。
這里使用BaggingClassifier對原分類器進行裝袋組合奖蔓,準確率有所提升。
四讹堤、分類器評估
使用scikit-learn提供的classification_report獲得分類報告如圖8吆鹤。使用condusion_matrix獲得分類混淆矩陣如圖9。交叉驗證的結果如圖10洲守∫晌瘢可見,取得了較理想的分類表現(xiàn)梗醇。圖11是部分分類結果缸逃。
關注微信公眾號“IBM數(shù)據(jù)科學家”右蹦,喜歡我們就訂閱吧!