手把手教您解決90%的自然語言處理問題
摘要: 本文將講解如何從零開始,有效地處理自然語言問題的指南和技巧:首先解釋如何構建機器學習解決方案來解決上面提到的問題。然後轉向更細緻的解決方案。
原文
文本數據無處不在
從文本數據中提取有意義和值得學習的數據是自然語言處理(NLP)的一個非常重要的研究課題。NLP是一個非常大的領域,NLP有幾個最常使用的關鍵應用:
- 識別不同的用戶/客戶群。
- 準確的檢測和提取不同類別的反饋。
- 根據意圖對文本進行分類。
本文將講解如何從頭開始有效地處理這些問題的指南和技巧:首先解釋如何構建機器學習解決方案來解決上面提到的問題。然後轉向更細緻的解決方案,比如特性工程、單詞向量和深度學習。
第一步:收集你的數據
每個機器學習問題都始於數據。本文中,我們將使用一個名為「社交媒體上的災難」的數據集:投稿人查看了超過一萬條的推文,然後指出每條推文是否提到了災難事件。
我們的任務是檢測哪些推文是關於災難事件的,因為有潛在的應用專門收集緊急事件並通知執法部門。這個任務的特殊挑戰是兩個類都包含用於查找推文的相同搜索條件,所以我們不得不用更微妙的差異來區分它們。
在本文中,我們將有關災難的推文稱為「災難」,其他推文稱為「無關緊要的」。正如Richard Socher所描述的那樣,查找和標記足夠的數據來訓練模型比試圖優化複雜的無監督方法通常更快、更簡單、更便宜。
第二步:清理你的數據
「你的模型只能和你的數據一樣好」。一個乾淨的數據集能夠使模型學習有意義的特徵,所以應當是先查看數據然後再清理數據。
以下是用來清理你的數據的清單(詳見代碼):
1、刪除所有不相關的字元,例如任何非字母數字字元。
2、把你的文章分成一個個單獨的單詞。
3、刪除不相關的單詞。
4、將所有字元轉換為小寫。
5、考慮將拼錯的單詞或拼寫單片語合成一個單獨的表示。
6、考慮詞形化。
在遵循這些步驟並檢查額外的錯誤之後,我們可以開始使用乾淨的、標記的數據來訓練模型!
第三步:找到一個好的數據表示
機器學習模型以數值作為輸入。我們的數據集是一個句子的列表,所以為了能夠提取數據。我們首先要找到一種方法使我們的演算法能理解它:也就是數字列表。
獨熱編碼(Bag of Words)
計算機文本表示的一種方法是將每個字元單獨編碼為一個數字(例如ASCII)。這對於大多數數據集來說是不可能的,所以我們需要更高層次的方法。
例如,我們可以在我們的數據集中建立一個所有的單詞的辭彙表,並將一個唯一的索引與辭彙表中的每個單詞聯繫起來。每個句子被表示為一個列表,只要我們的辭彙表中有不同單詞的數量。在這個列表中的每個索引中,我們標記出在我們的句子中出現了多少次給定的單詞。這被稱為Bag of Words模型,因為它是一種完全無視我們句子中詞語順序的表現形式。
可視化嵌入
為了查看嵌入是否捕獲了與我們的問題相關的信息(例如,tweet是否與災難有關),我們選擇可視化並查看這些類這個方法,但是由於辭彙表通常非常大,並且在20000個維度中可視化數據是不可能的,像PCA這樣的技術將有助於將數據壓縮到兩個維度。如下圖。
嵌入後這兩個類依舊不太好分開,僅僅是降低了維度。為了看Bag of Words特徵是否有用,我們根據它們來訓練一個分類器。
第四步:分類
當涉及到對數據進行分類時,邏輯回歸是最簡單可用的工具,訓練簡單,結果可解釋,可以很容易的從模型中提取最重要的係數。將數據分成一個適用於我們的模型和測試集的訓練集,以了解它如何推廣到不可見的數據。訓練結束後得到了75.4%的準確度,雖然這個精度足夠滿足我們的需求,但是我們還是應該試圖去理解它是如何工作的。
第五步:檢查
混淆矩陣
第一步是了解我們模型的錯誤類型,以及哪種類型的錯誤是最不可取。在我們的例子中,誤報是將不相關的tweet歸為災難,而漏報是將災難歸類為不相關的tweet。如果要優先處理每個潛在的事件,就要降低漏報率,如果受到資源的限制,那麼會遊戲那考慮降低誤報率。將這些信息可視化的一個好方法是使用混淆矩陣,將我們的模型與真實標籤的預測相比較。理想情況下,矩陣將是從左上角到右下角的對角線。
結果顯示該分類器漏報率更高。換句話說,我們的模型最常見的錯誤是將災難分類為不相關的。
解釋我們的模型
驗證我們的模型並解釋它的預測結果,重要的是看它使用哪些詞作出預測。在數據有偏差時,分類器能在樣本數據中做出準確預測,但是這個模型在現實世界中不能很好地推廣。在這裡,我們為災難和不相關的推文繪製了最關鍵的單詞表。
我們分類器的辭彙庫能夠處理大量的辭彙。然而,有些詞是非常頻繁的,而且只會對我們的預測造成干擾。所以接下來,我們將嘗試用一種方法來表示能夠解釋單詞頻率的句子,看看我們是否能從我們的數據中獲得更多的信息。
第六步:掌握辭彙結構
TF-IDF
為了幫助我們的模型更多地關注有意義的單詞,我們可以在我們的單詞模型包上使用TF-IDF評分,下圖為新嵌入的PCA投影。
我們可以看到這兩個顏色之間的區別更明顯了,這使我們的分類器更容易區分。我們在新的嵌入式系統上培訓另一個邏輯回歸,並最終達到了76.2%的精確度。一個輕微的改善,提高了模型的性能,所以我們可以考慮升級這個模型了。
第七步:Leveraging semantics
Word2Vec
即使是最新的模型也沒法將訓練中沒有遇到的單詞進行分類,哪怕是非常相似的單詞。為了解決這個問題,我們所用的工具叫做Word2Vec。
Word2Vec是一種查找單詞連續嵌入的技術。它可以從閱讀大量的文本中學習,並記住在類似的語境中出現的單詞。論文的作者開放了一個在非常大的語料庫中預先訓練的模型,預先訓練的向量可以在與這個帖子相關的存儲庫中找到。
語句級別的表示
為我們的分類器獲得一個句子嵌入的一個快速方法是平均Word2Vec得分。這跟以前一樣是Bag of Words的方法,但是這次我們只丟掉句子的語法,同時保留一些語義信息。
下圖是我們使用以前的技術實現的新嵌入的可視化:
在訓練了相同的模型三次(邏輯回歸)後,我們得到了77.7%的精度分數,這是現階段得到的最好的結果!
複雜性/ Explainability trade-oG
由於我們的嵌入沒有像以前的模型那樣被表示為每個單詞一維的矢量,所以很難看出哪些單詞與我們的分類最相關。雖然我們仍然可以訪問我們的邏輯回歸的係數,但它們與我們嵌入的300個維度相關,而不是詞的索引。然而,對於更複雜的模型,我們可以利用LIME等黑盒解釋器來了解我們的分類器如何工作。
LIME
在GitHub上可以獲得開源的LIME。它是一種允許用戶解釋任何分類器決定的黑盒解釋器。
我們需要在一個有代表性的測試用例上運行LIME,看看那些詞最關鍵,用這種方法可以得到像以前模型一樣重要的分數,並驗證我們模型的預測結果。
由上圖可得,這個模型收集了相關性非常高的詞,暗示它做出了可以解釋的預測結果,所以可以放心的部署到生成中。
第八步:使用端到端的方法來利用語法
由於以上方法省略了單詞的順序,丟棄了句子的句法信息,所以這些方法不能提供足夠準確的結果。為此您可以使用更複雜的模型,一種常見的方法是將一個句子作為單個單詞向量的序列,使用Word2Vec或者如GloVe、CoVe這樣的方法。
卷積神經網路用於句子分類的訓練非常迅速,並且是入門級的深度學習體系結構。卷積神經網路在文本相關的任務中表現非常出色,而且通常比大多數複雜的NLP方法(例如LSTMs和編碼器/解碼架構)要快得多。這個模型保存了單詞的順序,並學習了有價值的信息,其中的單詞序列可以預測我們的目標類。訓練這個模型不會比之前的方法麻煩,並且能獲得79.5%的準確性。所以下一步應該是使用我們描述的方法來探索和解釋預測,以驗證它確實是部署到用戶的最佳模型。
本文由阿里云云棲社區組織翻譯。
文章原標題《How to solve 90% of NLP problems: a step-by-step guide》
作者:Emmanuel Ameisen
譯者:奧特曼,審校:袁虎。
推薦閱讀:
※AI+互聯網金融--入職半年總結
※torchtext入門教程,輕鬆玩轉文本數據處理
※RNN基本模型匯總(deeplearning.ai)
※為何讀不懂你的那個TA
※CRF 小結