文章商品分類之數據標註

前言

之前有些過一篇文本分類的文章,從技術層面來描述了包括傳統NLP技術、深度學習相關的文本分類技術,很有幸做了一個關於文本分類的項目,對這塊有進一步的認識。 項目的基本需求是對資訊文章按照語義進行分類。例如ifanr.com/906951中描述的

描述的小米手機相關的新聞,需要將文章分類為手機-手機通訊,然後結合文章相關tag詞做相關產品的廣告露出,僅僅依靠tag詞『小米』可能不太準確,會推薦出糧食相關的『小米』內容,如小米之類的糧食相關的商品。

如果能得到資訊可插入商品的分類,能進一步通過商品類別來濾除tag詞的一些badcase,在業務相關的廣告露出上,結合商品類目、資訊文章相關tag詞,還有一些業務規則,更加合理、準確地露出文章相關的商品。 商品分類主要包括兩塊內容:是否可插入商品分類器、可插入商品文章的商品分類,以下所有的內容都是從這兩塊去闡述數據標註中做的一些相關的工作。

數據 雜 亂 差

機器學習類方法,數據為重,數據是機器學習方法、尤其是深度學習方法的魂,是演算法能達到性能的上限,所以有效的訓練數據是模型準確性保證的關鍵,而商品分類器的數據相對於資訊分類還是比較麻煩的,資訊分類的數據可以在爬蟲的時候爬取新聞文章相對應的類別信息,所以這部分比較容易,而商品分類麻煩就在於文章數據如何拿到對應的標籤,要想比較合理地收集訓練數據集,單純的收集文章數據,靠人工標註是不靠譜的,無論是在量上還是數據準確上都是很難的,商品分類數據的收集主要有三個方面的問題:

  • 雜,商品分類體系特別多,耳機類目有將近400個分類,覆蓋多種不同類目,從手機到洗護用品都有涉及,很難從商品層面上找到共性;
  • 亂,資訊分類數據在不同類目上分布極度不合理,先驗分布比例差異巨大,比例可能達到1000:1;
  • 差,資訊文章文本數據質量差,尤其是圖片類文章,文本文字少,很難得到語義信息。

數據標註的三個層次

第一個層次:看山是山,看水是水

最開始,在未完全了解數據的前提下,按往前經驗,直接標註數據,標註內容主要包括:是否適合插入商品數據,若適合插入商品,則對應文章的類目,包括0級類目、1級類目、2級類目;每一條記錄的標註難度很高,需要完全閱讀文章,理解文章內容,再判斷是否可插入商品,插入何種商品,一條記錄從閱讀到最後記錄內容,可能需要2分鐘以上的內容,這種標註耗時太大,並且由於先驗分布的極不均勻,最後標註拿到的數據類別分布也極不均勻,且也存在相關的難點:

  1. 文章池文章數目覆蓋時間比較短,提取出的訓練樣本的多樣性很少,比如在標註過程,我們發現文章中戰狼相關的內容太多,很明顯是由於前段時間文章太多了,抽樣出來的文章覆蓋太窄,解決方法在於增大文章池文章覆蓋時間,從原先前很短時間內的文章池,替代為一年多以上的文章,然後從中隨機抽樣出指定數量的文章數,保證在一定數量的前提下,訓練數據的多樣性,不至於標註數據中大部分都是戰狼的badcase;
  2. 文章可插入商品的標註,對於標註人員其實還是比較難的,而且前後矛盾比較大,前後衝突也比較多,必須從一定層面上給一些相關信息進行參考,並且由於正負樣本中,負樣本數量太多,很多標註結果在商品多分類的數據收集上不起作用,我們在前期在濾除矛盾數據後,拿到足夠數量的比較合理的可插入商品數據,訓練一個初始的二類分類器,並且給定需要標註的數據的可插入商品的得分,在統計各個不同類目的標註情況的得分分布;
  3. 解決負樣本數量太多的問題,一個方法是濾除比較低的二類分類器得分,把0.4得分以下的文章濾除,減少不可插入商品的標註量,大大減少標註人員的工作量,另一個方法是按照資訊類別過濾掉一些根本不可能插入商品的文章的分類,如政治等等,只對可能存在標註情況的類目進行標註;

二類分類器的標註可以在第一個層次解決,完成一定量的標註後,因為得分還有類目的限制,正樣本相對負樣本比較多,這裡我們再講不可能插入商品的類目樣本隨機抽取若干樣本數量,加入到訓練集中,訓練好二類分類器後,準確率和召回率達到將近90%+, 但是由於標註數據是從類目抽取和人工標註,是人就可能出錯,很多是否可插入商品的樣本不同標註人員的標註結果都不同,演算法的準確率和召回率只能在一定程度說明結果。因此,及早引入測試人員對分類器性能進行測試,在這種情況下,顯得尤為重要。

第二個層次:看山不是山,看水不是水

商品類目分類,在第一個層次中儘管有標註,但是其實有效數據太少,如果能夠重新做一遍這個項目,我會將是否可插入商品的分類和商品類目分類作為兩個分開的任務來進行標註。這裡給各位小夥伴提醒一下,在標註任務的相關工作上,盡量能把複雜的任務拆分為簡單的任務,將任務細化到標註人員只標註yes或者no的程度,標註人員尤其是外包,由於各個階層、各方面專業的人都有,越是複雜的問題上,對問題的理解越不一致。在和標註團隊合作一段時間後,更深地了解這其中的問題,很有意思。

**如何分解問題?**從兩個方面來處理:

  • 和業務團隊溝通,將原先將近400個分類的分類問題,按照類目業務的重要性,將分類類別按重要性標註為0、1、2,選取其中最重要的率先進行標註;
  • 將原先標註的標註各個類目的問題,分解為對樣本對應類目來標註是否正確, 具體解放方法是,在第一層次的基礎上,我們收穫了一批對應商品類目的樣本數量,樣本數量沒有達到能直接上線的程度。但是,我們可以通過已有的訓練數據,去訓練一個合適的分類器,然後去文章池子去過一遍,然後按照類別進行分析, 綜合考慮準確性、召回率的前提下,對每一個類別分配合理的閾值,當maxprob為某個類別且類別概率大於該類別閾值時,則露出來給標註人員來標註,判斷該文章被分配到類目是否合適。

第二層次在一定程度上能夠較快地收集到一批數據,但是由於本身樣本的多樣性還有先驗分布概率差異太大,這樣去對待標註問題,其實是很難的,能存在的問題就是標註20w數據可能在31類其中某個類別只有100不到,這種靠人工標註明顯不可靠,因為數據分布差異性太大,最後分類器的指標也很難讓人信服。

第三個層次:看山還是山,看水還是水

考慮到第二個層次遺留的問題,我們很難通過標註人員來幫助我們來完成這種問題,這裡我們回溯到前面,從頭開始考慮數據標註:

  • 是否可以通過自動化的手段,例如前面提到的資訊文章分類的手段,從爬蟲拿到對應的分類信息,這樣的數據質量,不僅高,而且無需標註成本。很不幸,很難直接拿到這樣的數據;
  • 如果直接提取自動化手段不靠譜,那麼我們是否可以通過一些文本提取的手段,來提取一些類別的關鍵詞,濾除不合適的類別的關鍵詞,然後用關鍵詞去過濾文章池子,這樣可以快速地得到對應類別的文章列表。

想到這個方法之後,我們直接從兩個方向上去獲取類別和關鍵詞的映射序列:

  1. 按之前商品title分類器,對商品title分詞,然後分類,得到分類和詞的映射,按count與類別詞總count數和tfidf權重去過濾關鍵詞;
  2. 即使按1的手段,我們過濾了一部分數據後,我們發現在很多類目上,還有很多tag詞,如母嬰-洗護用品下面,媽媽這次詞無論詞頻還是tfidf權重都很高,但是用媽媽去召回母嬰-洗護用品下的文章時,會有很大的問題,因為媽媽這詞召回出來的文章在其他很多類目都有,所以我們應該排除這部分詞,這部分工作說簡單也不簡單,說費時費力還真是麻煩,所以我們這兒用外包同學來幫忙做這部分詞的清理,通過召迴文章去看對應的詞是否僅在該類目出現;

通過上面之後,我們可以得到31分類下大概20w左右的數據,訓練好商品分類器後,我們觀察分類器在大部分類目下都達到0.8+的準確率,但是在有些類目下確實有問題,但是由於直接對20w數據來進行重新標註工作量太大,耗時太多,根本不可行,更好的一種方式,是通過對測試樣本分類,通過測試人員檢查是否有badcase,我們測試人員發現一些娛樂明星相關的新聞,經常會被分到糧油調味的問題,很奇怪,按常識應該不會,但是就是發現了,分析了一輪應該是數據有問題,後來我們發現我們在濾除關鍵詞時,將糯米留在了糧油調味的類目下,而楊冪和劉愷威的小孩,小名就叫『糯米』,而娛樂明星相關的新聞,在原先的樣本池子就很多,因此污染了糧油調味這一類目的訓練數據,所以我們只需要讓外包同學幫忙重新濾除下糧油調味這個類目的數據即可,工作量大大降低,通過這種以結果(badcase)為導向的處理方式,對於標註人員只需要檢查某個類目下數據是否屬於這個類目即可,而對於演算法工程師,我們能更加清楚地知道這類badcase的由來、可解決的方式、分類器在這類數據上的表現等等,而對於業務團隊就更加開心了,能夠切實看到分類器的效果、還有badcase,還能追著演算法工程師去解決,何樂而不為呢?

總結

稍微總結下,因為之前實際項目經驗的不足,在最開始的時候,我們作為演算法從業人員,把工作重點都集中在演算法、模型這塊,其實轉過頭來,這樣是不對的,數據才是整個項目中80%應該關注的內容,數據好,演算法才好,調嘛嘛優。

推薦閱讀:

《數據科學中的R語言》之字元串處理入門
數據科學家的自我修養
機器學習入門必備的13張「小抄」(附下載)
edX課程預告:To Be a Data Scientist

TAG:深度学习DeepLearning | 文本分类 | 数据科学 |