8個步驟,上手解決90%的 NLP 問題
前言
如何利用機器學習來理解和利用文本?這是一份入門指南。
自然語言處理技術覆蓋領域極廣,重要的應用包括:
- 識識別不同的用戶/客戶群(例如預測流失率、生命周期、產品偏好)
- 準確檢測和提取用戶反饋(正面和負面評價、衣服尺寸之類的特定屬性)
- 根據用戶意圖將文本分類(例如區分普通問題和緊急求助)
如何利用機器學習來理解和利用文本?本文給出了八個具體步驟:
- 收集數據
- 清理數據
- 找到好的數據表示方法
- 為數據分類
- 檢查和解釋數據
- 計算語言結構
- 理解語義
- 使用端到端的方式訓練語法特徵
閱讀本文,你將了解到:
- 如何收集、準備和檢查數據
- 如何建立簡單模型,並在必要時建立深度學習模型
- 如何理解和解釋模型,確保你捕捉到信息而非噪音
1.數據收集
數據樣本
每個機器學習問題都始於數據,例如電子郵件、帖子或推文。文本信息常見來源包括:
- 產品評論(亞馬遜等網路商店中)
- 用戶自生產內容(推特、Facebook 帖子、Stack Overflow 問答)
- 故障排除(客戶請求、提供票據、聊天記錄)
數據集:社交媒體災難
本文使用由 CrowdFlower 提供的名為「社交媒體中的災難」的數據集。數據集整理者在推特上檢索了超過一萬條包含「著火」、「隔離」和「混亂」等關鍵詞的推文,然後檢查這些推文是否是指災難事件(排除用這些詞開玩笑、寫影評等情況)。
檢測出哪些推文和災難事件有關,排除玩笑、電影等實際上不相關的話題。這裡面的挑戰是,無論是否與災難相關,這些推文有著相同的檢索關鍵詞,所以必須使用更加微妙的區別來區分它們。
在本文後續部分,我們將把和災難有關的推文稱為「災難事件」,其他推文稱為「與災難無關的事件」
標籤
樣本數據中的推文都是人工標記過的,所以我們知道每條推文是屬於「災難事件」還是「與災難無關的事件」。正如 Richard Socher 在下圖推文中所說,相比於優化一個複雜的無監督方法,找到並標記足夠多的數據來訓練模型通常更快、更簡單,成本更低。
Richard Socher,Salesforce 公司首席科學家,斯坦福大學計算機系兼職教授
2:數據清洗
機器學習首要原則:「模型性能受制於數據好壞」。
數據科學家的一個關鍵技能就是知道下一步是該處理數據還是去研究模型。一個好的經驗法則是,先查看數據再清洗數據。一個乾淨的數據集能讓模型學習到有意義的特徵,而不是學到過擬合的噪音。
這裡有一個數據清洗方法清單:
- 刪除無關字元,例如非字母或數字的字元串
- 將文本分離成單獨文字來標記解析
- 刪除無關辭彙,例如「Twitter@」或網址
- 將所有字母轉換為小寫,以便處理「hello」、「Hello」、「HELLO」之類的單詞
- 將拼寫錯誤或重複拼寫的單詞單獨表示(例如「cool」/「kewl」/「cooool」)
- 考慮詞性還原(例如將「am」、「are」、「is」等詞語統一為「be」)
數據清洗的更多細節請訪問:
https://github.com/hundredblocks/concrete_NLP_tutorial/blob/master/NLP_notebook.ipynb
遵循這些步驟並檢查其他錯誤之後,我們就有了比較乾淨的標籤數據來訓練機器學習模型了!
3:找到好的數據表示方法
機器學習模型輸入的是數值。處理圖像的模型,是以矩陣表示每個顏色通道中各個像素的強度。
一副笑臉,可以用一個數字矩陣表示
本文的數據集是一個句子列表,所以為了使我們的演算法能從數據中學習到特徵,首先要找到一種方法,把數據集轉換成機器學習模型能理解的形式,比如把句子列錶轉換成一個數字列表。
One-hot 編碼(詞袋模型)
計算機表示文本的常用方法是,把每個字元單獨編碼成一個數字,例如 ASCII 編碼。但如果把這種簡單的表示形式輸入到分類器中,它就得從零開始學習所有單詞的結構,這太難了。所以,我們需要更巧妙的方法。
例如,我們可以為數據集中所有的單詞建立一個不重複的辭彙表,每個單詞對應一個索引值。那麼,數據集中的每句話,都可以表示成一個和辭彙表一樣長的列表。列表中每個單詞的索引值,就是該單詞在這個句子中出現的次數。這就是所謂的 Bag of Words 詞袋模型。之所以叫「詞袋」,是因為它完全忽略了單詞在句子中的次序,而只關心單詞出現的次數。如下圖所示:
將句子表示為詞袋模型(bag-of-words):左邊是句子,右邊是對應的數字表示。向量中的每個索引值都代表一個特定的詞。
可視化的詞嵌入模型
在「社交媒體災難」數據樣本中,有20000個單詞,這意味著每個句子都會被表示成一個長度為20000的向量。該向量的大部分元素是0,因為每個句子都只是辭彙表的一個非常小的子集。
為了了解詞嵌入模型能否捕捉到問題相關的信息(即推文是否與災難有關),可以將其可視化,看看類別之間是否明顯分離。由於詞表的辭彙量很大,並且20000個維度的可視化是不可能的,所以採用 PCA (一種將特徵降維的技術),將數據投射到兩個維度。結果如下:
詞嵌入模型的可視化
詞嵌入模型的可視化結果顯示,兩類數據的分離效果不佳。這種效果可能就是我們詞嵌入的特徵,也可能是由於降維導致的。為了驗證詞袋模型學到的特徵是否有用,我們可以用詞袋模型來訓練一個分類器。
4.分類器
面對機器學習問題,最好先找到能解決問題的簡單工具。對數據進行分類時,往往使用邏輯回歸分析的方法(Logistic Regression),以保障結果的通用性和可解釋性。訓練過程很簡單。因為很容易從模型中提取出重要參數,所以訓練結果也容易解釋。
第一步是將數據分成兩部分,一部分是訓練集,另一部分是測試集。經過訓練,該模型把推文內容歸為「災難事件」的預測,準確率達到75.4%,效果還是不錯的。而把推文內容歸為「與災難無關事件」的預測,準確率只有57%。75%的精確度已經滿足我們的需求。下面,我們開始試圖理解這個模型。
5:檢驗模型
混淆矩陣
理解模型的第一步,是了解模型產生的錯誤分類,以及最不應該出現的錯誤。在我們的例子中,「誤報」是指將不相關的推文分類為「災難事件」,「漏報」是指將與災難有關的推文歸類為「與災難無關的事件」。如果要優先處理潛在的災難事件,那就要降低「漏報」。而如果資源受限,就要優先降低「誤報」,減少錯誤的提醒。使用混淆矩陣可以很好地可視化這些信息,並將模型預測的結果與數據的真是標籤進行比較。理想情況下,模型的預測結果與真實情況(人工標註)完全相符,這時候混淆矩陣是一條從左上角到右下角的對角矩陣。
混淆矩陣(綠色部分佔比較高,藍色部分佔較低)
分類器的漏報明顯多於誤報,這意味著這個模型的常見錯誤是把災難事件歸為「與災難無關的事件」。如果誤報災難的執法成本遠高於漏報災難的損失,那我們的分類模型就是可取的。
解釋和干預我們的模型
為了驗證我們的模型並對其預測做出解釋,我們就要看那些單詞在預測中起決定性作用。如果數據有偏差,那分類器會對樣本數據做出準確預測,但實際應用時效果會不理想。
下圖是為「災難事件」和「與災難無關的事件」列了一個重要單詞表。因為我們可以提取並比較模型中的預測係數,所以很容易用詞袋模型和邏輯回歸來找出重要的單詞。
詞袋:重要辭彙
我們的分類器正確地找到了一些特徵,比如廣島(hiroshima)和大屠殺(massacre),但也存在無意義數據的過擬合,比如 heyoo、x1392。我們當前的詞袋模型處理的是一個龐大的詞表,並且對所以單詞一視同仁。但實際上,其中某些單詞頻繁出現,成了影響我們預測的雜訊。接下來,我們嘗試一種方法來表示單詞的頻率,看能否從數據中獲得更多有用信號。
6:辭彙結構的統計
TF-IDF嵌入模型
為了讓模型專註於學習有意義的單詞,可以使用 TF-IDF (詞頻-逆文檔頻率嵌入模型)評估詞袋模型。TF-IDF 對單詞在數據中的稀疏程度來評估其重要性,對那些出現頻率高但只是增加雜訊的單詞進行降權處理。下圖是 TF-IDF 嵌入模型的 PCA 映射:
將TF-IDF嵌入模型可視化
從圖中看到,兩種顏色之間有明顯的分區了,這讓分類器更容易區分兩個類別。讓我們看看這是否會帶來更好的表現。
用 Logistic 邏輯回歸訓練新嵌入的模型 ,結果顯示,模型把推文內容歸為「災難事件」的預測,準確度達到了76.2%,比起之前的75%稍有提高。
這是非常小的改進,但模型能否因此學到更重要的辭彙呢?如果模型在預測時跳過了「陷阱辭彙」因而獲得更好結果,那才能說 TF-IDF 對模型提升有幫助。
TF-IDF嵌入模型:重要單詞
從新的重要辭彙列表可以看到,新模型學到的重要辭彙看起來與事件分類的關係更密切了!儘管測試集的指標只是略有增加,但是模型使用的重要關鍵詞更靠譜了,所以這個新模型會讓用戶體驗更好。
7:利用語義
Word2Vec
使用了 TF-IDF 技術的新模型能夠學習到信號強烈的單詞。但是如果部署這個模型,很可能會遇到一些在訓練集中沒有的辭彙。訓練集訓練出的模型無法對這樣的新數據進行分類,即使模型曾經在訓練集中遇到過相似的詞。
為了解決這個問題,就要捕捉單詞的含義。例如,模型需要理解「good」在語義上與「positive」更接近,而不是和「apricot(杏)」或者「continent(大陸)」更接近。這裡用來捕捉語義的工具就是 Word2Vec。
使用預先訓練好的辭彙
Word2Vec 是一種為每個單詞生成詞向量的技術。通過閱讀大量文本,它能夠學到並記住那些傾向於在相似語境中出現的辭彙。經過足夠多的數據訓練,辭彙表中的每個單詞都會生成一個300維的向量,由意思相近的單片語成。
論文《Efficient Estimation of Word Representations in Vector Space
》的作者 Tomas Mikolov 開源一個 Word2Vec 模型。這個模型已經在一個非常大的語料庫上經過了預訓練,我們可以把這個模型的一些語義知識納入我們的模型。預訓練向量的資源地址是:
https://github.com/hundredblocks/concrete_NLP_tutorial
句子的表示
為分類器獲得一個句子嵌入的快速方法是對句中所有單詞的 Word2Vec 分數求平均。這中方法和之前的詞袋模型是類似,區別是這次我們僅僅忽略了句子語法,而保留了句子的一些語義信息。
Word2vec 模型的句子嵌入
用前文技術對新嵌入模型可視化,結果如下:
Word2Vc嵌入模型的可視化結果
相比於上一個模型,這裡的兩組顏色區分更加明顯,Word2Vec 可以讓分類器更好地分類。再次使用 Logistic 回歸方法訓練模型之後,模型把推文內容歸為「災難事件」的預測準確率達到了77.7%,又創新高!
複雜性/可解釋性的權衡
由於我們這次的 Word2Vec 嵌入沒有像之前的模型那樣把每個單詞表示成一維向量,所以很難看出哪些單詞對分類結果是重要的。儘管仍然可以使用 Logistic 回歸係數,但這些係數僅僅和嵌入的300個維度有關,而和詞表中辭彙索引值無關。
模型準確率提高有限,但卻犧牲了所有的可解釋性,似乎得不償失。不過,對於更複雜的模型,我們可以利用 LIME 之類的「黑盒解釋器(black box explainers)」來解釋分類器的工作。
LIME
LIME是Github上的一個開源軟體包,項目地址:
https://github.com/marcotcr/lime
LIME 黑盒解釋器允許用戶通過觀察輸入的擾動(比如刪除句中某個單詞)並觀察擾動引起的變化,來分析一個分類器的預測結果是如何變化的。
來看看它對我們數據集中幾個句子的解釋:
這句話中,選出了正確的災難辭彙,並把句子歸類為「災難事件」
但在這一句中,單詞對分類的影響似乎不太明顯
但是,我們沒有時間去探索數據集中的大量樣本。我們要做的是在測試集的代表性樣本上運行 LIME,分析哪些辭彙對於分類預測的影響更大。這樣一來,我們可以像之前的模型一樣,評估出重要單詞,並驗證模型的預測結果。
Word2Vec 的重要單詞
Word2Vec 模型提取出了高度相關的詞,這意味著它做出了可解釋性更強的判斷。上面這些辭彙與事件性質的相關性是最高的,我們更願意把它們添加到實際應用中。
8:使用端到端(end-to-end)方式學習語法特徵
前面介紹了快速高效地獲得句子嵌入的方法,然而由於省略辭彙的順序,我們也忽略了句子中所有的語法信息。如果簡單方法給出的結果還不夠讓人滿意,那我們就用更複雜的模型:把整個句子作為輸入並預測標籤,而不用中間表示。常見的做法是,使用 Word2Vec 或者 GloVe、CoVe 等方法,把一個句子作為詞向量的序列。這就是下面要做的:
高效的端到端的訓練體系結構
用於句子分類的卷積神經網路訓練速度很快。卷積神經網路(CNN)作為一種入門級的深度學習框架效果很不錯,雖然 CNN 主要以在圖像處理方面的出色表現而著稱,但在文本相關的任務上也有出色的表現,而且比大多數複雜的 NLP 方法(如 LSTMs、Encoder/Decoder)訓練更快。CNN 能夠考慮單詞的順序,能很好地學習到句子中哪些單詞的序列特徵影響到目標預測。比如它可以區分出「Alex eats plants」與「Plants eat Alex」之間差異。
相比以往的方法,end-to-end 模型的訓練不要要太多工作就能取得不錯的效果,準確率達到了79.5%!具體代碼參見:
https://github.com/hundredblocks/concrete_NLP_tutorial/blob/master/NLP_notebook.ipynb
當然與前面步驟一樣,緊接著就要使用上述方法對這個模型的預測做出解釋,以確認它是否足夠好。經過上面的討論,你應該可以自己解決這個問題了。
最後的筆記
回顧一下我們成功使用的方法:
- 從一個簡單快速的模型開始
- 對模型的預測作出解釋
- 了解它所犯錯誤的種類
- 根據以上知識判斷下一步做什麼:處理數據,還是尋找複雜的模型
雖然上述方法用於本文特定的例子——使用適當模型理解和利用短文本(推文),但這種思想適用於各類問題。希望這篇文章對你有幫助,也歡迎提出意見和問題!
本文由集智小仙女編譯整理自 insightdatascience 博客:
原題:How to solve 90% of NLP problems: a step-by-step guide
地址:https://blog.insightdatascience.com/how-to-solve-90-of-nlp-problems-a-step-by-step-guide-fda605278e4e
推薦閱讀:
※雙語:人工智慧在思考什麼
※人工智慧寫春聯來了 人類還需要學書法嗎?
※[中國電子學會]新一代人工智慧發展白皮書(2017)第一、二章
※埃森哲與Infosys重磅報告:AI落地成果已出,仍無所作為將被踢出局
※一個關於意識的實驗
TAG:自然語言處理 | 人工智慧 | 深度學習DeepLearning |