分類任務
其實工程上對於文本分類的需求還是挺多的,主要可以分為下面兩類,並對每類給了兩個例子。
二分類
色情新聞分類 這是一個非平衡數據集的二分類問題,因為色情新聞數是遠小於非色情新聞數的。
判斷是否醫療Query 這個就關系到搜索變現了,還記得莆田系”事件嗎?這個分類是很值錢的。
多分類
商品自動分類 每天商家都在上新,對這些新商品應該放到“服裝“類目還是”數碼“類目,人工搞肯定不划算了。
Query領域分類 這個是為了對准領域知識庫,做更炫更”智能“的所謂“框計算”。
算法流程
數據標注
分類是有監督的學習,所以必然是需要標注數據的。剛開始肯定是需要找一些人,比如說運營同事提供手工標注一些數據的。有了這批種子數據,我們可以先訓練一個分類器,用這個分類器做分類,后面的工作其實就相對輕松一點,可以使用一些半監督的方法來持續擴充標記數據集,並對其中不確信的部分再做人工標注。這種半人工半自動的方法,既大大減少了標記的工作量,又能快速擴大標記數據集。
特征抽取
分類是基於特征的,拿到數據后怎么抽取具有區分度的特征是關鍵的一步。我們使用的特征主要是基於Bag Of Word, 具體步驟如下:
1. 分詞:jieba足夠好了,主要還是對詞庫的維護。
2. N-gram:用到tri-gram就可以了。
3. term位置:主要是對query分類有用。
4. 特征權重:對短文本IDF夠了,對長文本TF-IDF。
特征選擇
詞有很多,是不是每個都作為特征呢?不是,要去除不具區分性的特征以及會對分類起反作用的特征。特征選擇條件如下:
1. 詞頻數限制: 在總的corpus里面出現次數小於一定閾值的要刪掉
2. 停用詞:停用詞除了像”的“這樣的通用的爛大街的詞之外,每種應用場景需要維護自己的停用詞表。比如說”三星“在商品分類上絕不是停用詞,但在色情新聞分類上可以是停用詞
3. feature filter: 對相對平衡的樣本集,可以直接使用信息增益比(information gain ratio, IGR)來做。對不平衡的樣本集(如色情新聞分類)用IGR就不合適了,可以用基於odds ratio的filter:
這邊的smoothing可以用基於Expected Likelihood Estimation(ELE)的。用好這兩個,感覺特征選擇就差不多了。
分類器
首先說明一點的是,在淺層機器學習系統(相對於具有特征學習能力的深度學習而言),feature engineering往往比分類器選擇更重要。在文本分類這個問題上, 我的實驗結果是判別模型比較靠譜,下面兩個結果差不多,可以任選一個使用。我自己在做BoW特征文本相關的任務時習慣選擇Max Entropy。
1. SVM
2. Max Entropy
對於經典的垃圾郵件分類問題使用的Naive Bayes,結果並沒有上述兩種判別模型好。
還有一些人使用了基於決策樹的方法,但是在這種特征向量比較稀疏的情況,不知道效果如何,沒有試過。
訓練與評估
在訓練分類器時,我們采用10-fold交叉驗證的方法,以防止單一驗證集有偏。
評估指標是很平常的召回率、准確率、F1 score;對多分類還可以用confusion matrix。
坑
分詞
分詞從實用主義的角度來講,主要在於維護詞典。HMM還是CRF對最終結果的貢獻並不如詞典的貢獻可見。另外針對應用場景,可能還需要自己額外做一些事情。比如說針對手機機型作一些基於正則的分詞來把小米4變成一個詞,而不是小米 4。這種分詞粒度上的小trick是根據你的應用場景定的。
特征重要度
除了TF-IDF之外,根據應用場景的不同,有不同的特征重要度的要求。如Query會給名詞和專有名詞加大的權重,而色情新聞識別中形容詞和名詞同等重要。
有偏訓練集
分類器的假設是樣本數是大致均勻分布的,如果一類比其他類數據量大得過分,分類器很容易把其他類的數據推到大的類上去,以換取平均誤差最小。這種情況下,我們的做法就是嘗試不同的樣本比例進行訓練並在測試集上測試,選擇結果最好的那個比例。
另外一個比較常用的方法就是設置meta cost,也就是為cost設置權重,比如說色情判成非色情損失就乘10。
這兩種方式的最終目的是一樣的,操作起來第一種更好些。
模型大小優化
有的時候模型大小有要求,比如說模型會推送給設備耗流量和設備內存, 比如說即使在雲端整個系統也有內存要求,希望你優化。這時候主要有兩個方法:
a. 特征選擇。 加大特征選擇的強度,比如說原來選Top 1000的,現在選Top 500,這個可類比為主成分分析,會降低模型的指標數據,所以是有損的。
b. 精簡模型。 可以刪除一些最終模型中的權重特別小或者為0的特征,再基於剩下來的特征重新訓練個新模型。這個其實是feature warping。還可以使用正則化方法,加大正則化系數。
One More Thing…
term 擴展
這個尤其是對query,有的query特別短導致召回低。這個時候可以通過term擴展給他更多的同義,近義,共現詞,增加召回。term擴展主要是基於下面要說的這類特征。
Distributed Representation
我們上面使用的特征向量是每個term或者term組合在向量中占一個坑的形式,這種方法能取得不錯的結果。當它有一個致命弱點是它其實只是記住了一些詞的組合關系,並不能真正表示這個詞。一個例子就是”月亮“和”月球“這兩個向量的距離其實跟”月亮“和”貓“的距離是一樣的,這並不符合實際情況。為了使文本分類能夠處理這種情況,需要distributed representation。主要有兩類:
a. 基於主題模型的: pLSA, LDA等
b. 基於DNN的:word2vec等