廣告行業中那些趣事系列2:BERT實戰NLP文本分類任務(附github源碼)

微信公衆號:數據拾光者。願結交更多的小夥伴,一同走人生路。

摘要:上一篇廣告中那些趣事系列1:廣告統一興趣建模流程,我們瞭解瞭如何爲廣告主圈人羣以及如何刻畫用戶的興趣度。要想給用戶打標籤,我們需要構建數據源和標籤的關聯,也就是item-tag。針對數量較少的app數據源我們可以使用人工打標的方式來識別,但是對於news、用戶query等數量較多的數據源則需要通過機器學習模型來進行打標。實際項目中我們使用NLP中鼎鼎大名的BERT模型來進行文本分類。

通過本篇學習,小夥伴們可以迅速上手BERT模型用於文本分類任務。對數據挖掘、數據分析和自然語言處理感興趣的小夥伴可以多多關注。

目錄

01 爲什麼使用BERT模型做文本分類

02 項目背景

03 BERT模型實戰


01 爲什麼使用BERT模型做文本分類

最近幾年,google提出的BERT模型是NLP領域裏具有里程碑意義的大作。BERT模型有兩個典型的特點:效果非常好和通用性很強。

通俗的說就是能幹活,能幹很多活,而且活還幹得好。這是非常難能可貴的。想想以前,針對不同的NLP任務大家需要使用不同的模型去解決。但是現在使用BERT你能解決非常多NLP任務,而且效果還很好。

拿《天龍八部》裏面的喬峯和慕容復舉例可能有點生動。慕容復雖然看了各大門派的武功祕籍,但是還是打不過會降龍十八掌的喬峯。

本篇只是BERT小試牛刀,主要從實戰的角度講解使用BERT模型來做文本分類任務。這裏再打一個小小的廣告,廣告系列下一篇會從理論的角度講講使用典型的預訓練+fine tuning兩階段技術的BERT模型怎麼來的。講講NLP裏面word embedding的演化歷史。怎麼從word2vec到ELMO、GPT,再到最後的天之驕子BERT。

可以這麼說,BERT在模型創新角度並不是很大,但是它是近幾年NLP領域裏重大進展的集大成者。

從圖1中可以看出BERT在11個NLP任務裏面效果有全面的提升:

                                                                     圖 1 BERT效果圖


講了這麼多,就是因爲BERT效果好,所以我們選擇BERT來做文本分類任務。

 

02 項目背景

我們標籤團隊的一個主要任務是給用戶打上對應的興趣標籤,就是構建user-tag關聯。通過埋點我們可以獲取用戶操作手機的行爲,比如小A經常登錄一刀傳奇app,那麼我們就能得到user-item的關聯,item是用戶操作手機的數據源,app是item的一種。

現在我們興趣類目體系裏面有個標籤叫傳奇遊戲標籤,這個標籤代表一類對傳奇遊戲感興趣的人羣。當有一個對傳奇遊戲感興趣的廣告主想打廣告的時候就會選擇這個標籤,對應的就是對傳奇遊戲感興趣的一類人。

Item包括很多數據源,比如app、ad、news、query、微信小程序、site等等。之前說過因爲app數據量較少,所以通過人工標註的方式來給app打標,構建item-tag的關聯。

而針對news、用戶query這一類數目龐大的數據源,如果全部通過人工標註的方式則費時費力,並不是很好的選擇。所以一般是通過人工或者關鍵字匹配的方式標註一部分數據作爲訓練集,然後放入到機器學習模型中進行訓練,最後用訓練好的模型去預測新的數據,從而實現機器學習模型打標。

本篇使用NLP中的BERT模型來完成一個二分類器,來識別用戶操作的news或者query是不是屬於傳奇遊戲標籤,從而判斷用戶是不是對傳奇遊戲感興趣。

以下通過用戶query進行舉例。比如:

小A搜索了”成龍大哥代言的一刀傳奇好玩麼?”

小B搜索了”西紅柿炒雞蛋怎麼做?”

小C搜索了”伽羅出裝攻略”

小D搜索了”如何日入百萬?”

通過這四條搜索,我們人類可以很容易的識別小A的搜索和傳奇遊戲標籤有關,所以我們會給小A打上傳奇遊戲興趣標籤。而另外三個人則和傳奇遊戲無關,不會打上傳奇遊戲的標籤。

現在我們需要根據用戶的query,通過機器學習模型來判斷用戶是不是對傳奇遊戲標籤感興趣。這是項目背景。

通過圖2可以查看如何通過query給用戶打標:

                                                   圖 2 通過query給用戶打標

 

03 BERT模型實戰

通過BERT模型構建二分類器用於識別用戶query是否屬於傳奇遊戲標籤。

下面是項目github鏈接:NLP實戰BERT二分類任務。也歡迎小夥伴們多多fork,多多關注我。

項目目錄結構如下:

項目主要分成四個部分:

1. bert預訓練模型

這裏和大家明確一個基本概念,BERT是一個預訓練+fine tuning的兩階段模型。第一階段是預訓練,通過使用大量的無標註的文本從而學習到一些語言學相關的知識。而第二階段就直接對接上層應用,你希望完成什麼任務它就會不斷通過微調的方式變成你想要的樣子。

這裏還拿傳奇遊戲舉例。可以這麼簡單的理解,現在我們有個機器人小智。預訓練是這樣的過程,我們讓機器人小智同學先看很多很多文本資料。小智同學本身不知道看這些資料是要幹什麼,但是就是不斷的學習這些語言學知識。

而第二階段就是fine tuning階段,是我們明確希望小智同學做什麼任務的階段。如果我們希望小智同學來做中英翻譯任務,那麼我們希望輸入中文,小智同學翻譯爲英文。我們輸入“成龍大哥代言的一刀傳奇好玩麼?”小智同學就會翻譯成對應的英文。

對應到咱們的實際項目中,如果我們希望小智同學來做文本分類任務,判斷用戶搜索是不是應該標註爲傳奇遊戲標籤。我們希望輸入一段話,讓小智同學判斷這段話是不是對傳奇遊戲感興趣。如果我們輸入“成龍大哥代言的一刀傳奇好玩麼?”,小智同學就會輸出感興趣。

我們可以用BERT論文中兩階段圖來生動的描述這個例子。大家不需要關注模型內部,只需要明確BERT模型任務分成兩段,一個是預訓練pre-training,另一個是微調fine-tuning。

                                                      圖 3 BERT 預訓練+fine tuning兩階段

這是一個很簡單但很實用的例子,希望大家能對BERT這種兩階段訓練技術有一個非常淺顯的瞭解。廣告系列的下一面一篇我會和大家詳細探討下BERT的漫漫人生路。

而BERT預訓練模型目錄就是保存上面講的第一階段預訓練學習到的知識。因爲使用的無標註文本的不同,所以存在下面多個版本:

                                                                  圖 4 BERT預訓練多個版本

因爲我們實際項目主要是識別用戶中文搜索,所以選擇BERT-Base, Chinese:
BERT-Base, Chinese。下載完成之後解壓,將文件中的五個部分copy到工程中bert_model目錄下。

2. 訓練數據集

得到BERT預訓練模型之後,我們需要給模型提供一些訓練數據。這個對應到剛纔講的兩階段技術中的第二段fine tuning。通過預訓練階段小智學習到了很多語言學知識。但是機器人小智並不知道到底要他做什麼。而在第二階段fine tuning的時候我們需要告訴小智希望你做一個文本分類器,判斷用戶搜索的一段話到底能不能打上傳奇遊戲標籤。

如何告訴機器人小智一段話到底能不能打上傳奇遊戲標籤?我們需要訓練數據。訓練數據有兩個字段,第一個字段是ocr,也就是用戶搜索的一句話。第二個字段是label,代表這段話是不是屬於傳奇遊戲標籤。

我們通過訓練數據不斷強化機器人小智來識別一句話到底是不是傳奇遊戲標籤的能力。最終讓機器人小智變成一個分類器,一個能識別用戶搜索是不是應該打上傳奇遊戲標籤的分類器。

這裏小夥伴可能要問了,去哪裏獲取訓練數據呢?

目前項目中獲取訓練數據主要通過人工打標或者關鍵字匹配的方法。人工打標就是通過人眼來判定用戶搜索是不是能打上傳奇遊戲標籤。而我們訓練這個模型的最終目的也是爲了讓機器替代人。

關鍵字匹配是通過一些關鍵的詞來識別到底應不應該打上傳奇遊戲標籤。注意這裏需要選擇一些沒有歧義的詞來識別。如果你對傳奇遊戲非常瞭解,那麼你可能會選沙巴克、麻痹戒指、戰法道啥的能明確識別傳奇遊戲的關鍵詞。如果選擇的關鍵詞存在歧義,很容易使訓練預料不準,然後把模型帶偏。比如屠龍刀這個詞,雖然在傳奇遊戲裏面有件裝備叫屠龍刀,但是也容易把類似《倚天屠龍記》相關的內容誤認爲對傳奇遊戲感興趣。

這裏一定一定要注意,訓練預料是否準確直接決定模型的識別能力。針對query標註的時候,也一定選擇用戶有明確意圖的數據作爲正樣本。

本項目中通過csv文件來存儲這些訓練數據,表中有兩個字段,字段順序是ocr、label。將訓練數據集劃分成訓練集train.csv和測試集test.csv。訓練集train.csv主要用於模型訓練,測試集test.csv主要用來評估模型的分類能力。訓練集和測試集的比例一般爲7:3,可調。這裏有個小小的點需要注意,csv的格式要轉化成UTF-8-BOM的格式。

3. 模型代碼

模型開發語言主要使用python3,調用基於keras封裝的bert模型keras_bert相關api進行開發。

通常開發階段我們主要使用交互式jupyter notebook。開發完成後在服務器上運行或者最後上線都是整理成py腳本運行。

代碼主要分成三部分:

model_train.py:這是模型訓練代碼。整體而言,輸入的是訓練集,對應項目中的train.csv,輸出是一個訓練好的模型,對應項目中的XXX.hdf5。

model_validate.py:這是模型驗證代碼。因爲需要測試我們訓練好的模型效果如何,所以需要用測試集進行驗證。

訓練集和測試集是兩個完全不同的數據,可以用測試集來模擬模型上線之後的效果。測試集中的數據從未在訓練集上出現過。如果模型在測試集上效果還不錯,那麼就具備了上線的條件。

我們主要查看的指標有精度、召回率、auc和f1得分等等。整體而言,輸入的是測試集test.csv和模型XXX.hdf5,輸出的是模型的一系列效果指標。

model_predict.py:當我們完成整個模型的開發和優化工作後,就可以準備模型的上線工作了。一般我們會用目前已經標註的所有數據(包括訓練集train.csv和測試集test.csv)一起去訓練模型。然後用最終的這個模型去預測線上的用戶搜索。整體而言,輸入是用戶線上搜索數據和模型XXX.hdf5,輸出是對這些搜索數據的預測標籤。

模型驗證代碼和預測代碼非常相似,模型預測代碼本身就是模型驗證代碼的一部分。因爲我們進行模型驗證的流程是先用模型對測試集進行預測,然後對比測試集的標籤和預測結果,根據測試集的實際標籤和預測標籤來計算各項指標。

因爲平時工作較忙,所以代碼規範性略差,請見諒。目前團隊也在做code review,也希望今後完成的代碼更加簡潔易懂。共勉之!

4. 訓練完成得到的模型

這裏就是上面模型訓練代碼得到的模型,對應項目中是XXX.hdf5的文件。我們模型訓練的結果就是得到一個模型。最後上線的時候也是用這個訓練好的模型去預測用戶的query。

總結下,到這裏爲止,咱們就完成了使用BERT模型來識別用戶query是否應該標註爲傳奇遊戲標籤。整個項目的來龍去脈以及代碼也在文章中進行了詳細的講述。小夥伴們通過本項目可以實戰文本二分類任務了。你需要BERT模型去識別哪種二分類任務,給它對應的訓練數據就可以了。同樣的代碼,我們可以用來識別網絡輿論是否正向、女朋友是不是生氣了以及其他等等等等的分類任務。

通過對本模型進行簡單的改造,也能進行多分類任務。

本文並沒有從代碼層級詳細解釋具體的代碼作用,小夥伴們可以通過註釋瞭解一部分。後面有需要我會專門寫一篇代碼走讀,方便大家更好的使用keras_bert來做文本分類任務。

說點輕鬆的


我也是19年纔開始入NLP的坑。之前做數據挖掘,更多的是用傳統的機器學習模型比如xgboost去做一些分類或者回歸的任務。隨着深度學習大火,也開始慢慢接觸自然語言處理。雖然平時有很多工作,但還是抽取一切可利用的時間學習NLP的知識,實戰NLP的項目,將NLP應用到實際項目中。目前也算是入了門,並且可以在團隊中做NLP相關的工作。有點感慨,只要你願意開始,什麼時候都不算晚。加油吧,小夥伴們。越努力,越幸運!

總結和預告

本篇從實戰的角度使用BERT模型完成了一個文本理解的二分類任務。光會實戰而不懂理論是無法真正做到模型優化的。只有真正明白模型內部原理,你纔會明白模型本身擅長做什麼,才能更好的結合自身業務來優化模型。下一篇會從理論的角度講解下BERT模型是怎麼出現的。BERT是近幾年NLP里程碑的大作,也是NLP裏重大進展的集大成者。我們會從word2vec到ELMO、GPT再到最後的BERT,明白了這一步步的演化進程,大家對BERT也算有基本的瞭解。對於以後想從事NLP或者廣告行業的小夥伴也會幫助不少。

如果對廣告感興趣的小夥伴建議看看我廣告系列的第一篇文章:廣告中那些趣事系列1:廣告統一興趣建模流程。對於理解我們標籤團隊所做的事情和業務本身至關重要。再牛逼的技術也需要去支撐業務才有價值和意義。

喜歡本類型文章的小夥伴可以關注我的微信公衆號:數據拾光者。我會同步在知乎、頭條、簡書、csdn等平臺。也歡迎小夥伴多交流。如果有問題,可以在微信公衆號隨時Q我哈。

發佈了81 篇原創文章 · 獲贊 27 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章