八大步驟,用機器學習解決90%的NLP問題
編譯 | 林椿眄
審校 | 胡永波
在現實生活中,文本信息無處不在。理解並學習文本數據的內在涵義一直是一個非常活躍的研究課題,這就是自然語言處理。
對於企業而言,利用文本數據可以對新產品的功能進行驗證、改進並擴展。在這樣的實際應用中,有三大類自然語言處理任務最為常見:
識別不同的用戶/客戶群(如預測客戶流失量、生命周期價值、產品偏好)
準確地檢測和提取不同類別的反饋信息(如正面和負面的評論/意見、衣服尺寸等特定屬性的提及頻率)
根據用戶的意圖對文本信息進行分類(如請求基本幫助、緊急問題)
儘管自然語言處理領域有很多在線的論文和教程資源,但很少有一些比較高效的指引和提示,以方便我們快速上手並解決這裡的問題。這正是我們整理出本文的目的。
在本文中,我們將分八大步驟來介紹如何用機器學習處理文本數據。我們將從最簡單的方法開始,逐一講解,然後分析更具體的方案細節,如特徵工程、詞向量和深度學習。你可以把本文看作是標準方法的高度概括。
讀完本文後,你將學會:
如何收集,準備和檢查數據
如何建立簡單的模型,有必要的話,應構建深度學習模型
如何解釋並理解你的模型,以確保模型學習的是特徵信息而不是噪音
此外,本文還附有一個互動式筆記,讓你可以隨意運行本文中的代碼,來演示和應用其中的技術,特別是一些比較抽象的概念:
代碼鏈接 https://github.com/hundredblocks/concrete_NLP_tutorial/blob/master/NLP_notebook.ipynb
步驟1:收集數據
數據樣本
每個機器學習問題都始於數據,如一系列的電子郵件、帖子或推文。文本信息的常見來源包括:
產品評論(在亞馬遜、Yelp和各種應用商店)
用戶生成的內容(推文、Facebook帖子、StackOverflow問答)
用戶疑難解答(客戶請求、客服支持記錄、聊天記錄)
「社交媒體災難」數據集
對於這篇文章,我們將使用一個由CrowdFlower所提供的「社交媒體災難」的數據集(鏈接:https://www.crowdflower.com/data-for-everyone/),其中:
志願者以「燃燒(ablaze)」、「隔離(quarantine)」、「混亂(pandemonium)」等作為關鍵詞查找了超過1萬條推文,並把推文內容是否跟災難性事件(區分於這些詞所指的笑話、電影評論或非災難性話題)有關標記出來。
由此,我們就可以判斷哪些推文內容是在說災難性事件,哪些是說像電影這樣的不相關話題。為什麼呢?因為存在一些情況,可能要讓執法部門優先獲知那些需要及時處理的緊急事件,而非關於Adam Sandler最新電影的海量評論。而這兩類內容使用完全相同的關鍵詞都能搜到,我們不得不使用更微妙的特徵來區分它們,這是很大的挑戰。
本文接下來的內容,我們將含災難性內容的推文稱為「災難性推文」,其他推文則被視為「不相關推文」。
數據標籤
在樣本數據中,每條推文屬於哪個類別都已被標記出來。正如Richard Socher在推文中所說的,找到並標記足夠的數據來訓練有監督模型,往往是一條更快、更簡單、成本更低的路徑,遠比難於優化的無監督方法有效。
Richard Socher的觀點
步驟2:數據清洗
機器學習的第一條原則是:「數據有多好,模型的性能才會有多好」。
知道何時該調整模型何時要處理數據,這一能力是數據科學家的核心技能之一。一條良好的經驗就是先查看數據進而把它清洗好。一個乾淨的數據集,可以讓機器學習模型學到有意義的特徵,而非過擬合在不想關的噪音信息上。
下面列出了一些數據清洗的方法,你可以自己嘗試(更多細節見代碼https://github.com/hundredblocks/concrete_NLP_tutorial/blob/master/NLP_notebook.ipynb):
刪除所有不相關的字元,如任何非字母或數字的字元串。
將文本信息分離成單獨的文字,並逐字進行標記。
移除一些不相關的字詞串,比如Twitter的「@」標識、網址鏈接等。
將所有字幕轉換為小寫,避免重複識別「hello」,「Hello」和「HELLO」等同類辭彙。
考慮合併拼寫錯誤或替代拼寫的單詞,如「cool」/「kewl」/「cooool」。
考慮將不同變體的詞形還原回來,如將「a」、「is」和「are」等單詞還原成「be」的這種通用形式。
按照上述步驟處理並檢查數據後,我們就可以使用這些乾淨的標註數據來訓練機器學習模型了!
步驟3:找到一種好的數據表示
機器學習模型通常以數值作為輸入。例如,處理圖像的模型是以每個顏色通道中像素值矩陣作為輸入的。
一副笑臉圖可以被表示成這樣的數字矩陣
我們這裡的數據集是句子列表,為了讓模型可以從數據中學到句子的特徵模式,我們首先要找到一種方法來把它轉換成模型能理解的形式,即數字列表。
獨熱編碼(詞袋)
通常,計算機文本數據的表示是將每個字元編碼成一個獨特的數字(例如ASCII碼錶)。如果把這麼簡單的表示輸入給分類器,它就只能根據這些數據從頭來學習單詞的結構,這對大部分數據集來說是不現實的。這就要求我們採用更高級的數據表示方法。
例如,我們可以為數據集的所有辭彙建立一個特定的辭彙表,令每一個辭彙對應一個唯一的索引值。這樣,每句話均可表示為一個列表,列表的長度由辭彙表中單詞的數量來決定。列表的每處索引值,標識一個給定單詞在句中出現的次數。這就是我們常說的詞袋模型(bag-of-words),因為它完全無視單詞在句中的先後次序。如下圖所示:
將句子表示為詞袋模型(bag-of-words):左邊是句子,右邊是對應的表示。向量中的每個索引都代表一個特定的詞。
詞嵌入模型的可視化
在「社交媒體災難」樣本中,我們有大約20000個的單詞,這意味著每個句子都會被表示成一個長度為20000的向量。該向量的大部分元素都是0,因為相對於完整的辭彙表,每個句子都只是一個非常小的子集。
為了進一步了解詞嵌入模型能否捕獲到與問題相關的信息(即推文內容是否與災難有關),我們可以將其可視化並檢查不同類別的數據是否能很好地分離。由於辭彙表的量通常都非常大,在20000個維度上顯示數據不現實,因此像PCA(主成分分析)這樣能把數據降維到兩個維度的技術就很有幫助了。繪圖如下:
詞袋嵌入模型的可視化結果
結果表明,這兩類數據的分離效果不是很好。這可能是由於我們所嵌入的某一個特徵,或僅僅是因為我所降低的特徵維度。為了驗證詞袋模型(bag-of-words)所學到的特徵是否對分類有用,我們可以用它們來訓練一個分類器。
步驟4:模型分類
剛接觸機器學習問題時,我們最好從能解決問題的最簡單工具上手。每每涉及到數據的分類,Logistic回歸都會是很好的選擇。因為它的通用性與可解釋性都很好,訓練過程也非常簡單,結果極易解釋,很容易就能提取出模型中最重要的係數。
我們將數據分成訓練集和測試集,訓練集用於生成模型,測試集用於檢查模型在未知數據上的泛化情況。訓練完成時,我們得出75.4%的分類準確度。還不算太差!而判斷「不相關內容」時,準確度只有57%。儘管如此,75%的識別精度也足以滿足我們的需求。下一步,在部署前,我們要做儘可能全面的可視化分析,並徹底理解這個模型。
步驟5:模型檢查
混淆矩陣
理解模型的第一步是要知道模型錯分的數據類型,以及最不應該出現的錯誤類別。在我們的例子中,假陽性結果是指將不相關推文錯分為災難性推文,而假陰性結果類則將災難性推文歸類為不相關推文。如果要優先處理潛在的災難性事件,那我們要降低假陰性結果。而如果資源比較受限,我們就需要優先降低假陽性結果,以減少誤報。使用混淆矩陣可以很好地可視化這裡的信息,並將模型預測結果與數據的真實標籤進行比較。理想情況下,混淆矩陣是一條從左上角到右下角的對角線(如果我們模型的預測結果能與真實標籤完美匹配的話)。
混淆矩陣(綠色部分所佔比例較高,藍色部分的比例較低)
相比假陽性結果,我們的分類器產生了更多的假陰性結果。換句話說,模型中最常見的錯誤是將災難性推文錯誤歸類為不相關推文。如果假陽性結果的執法成本很高的話,那麼我們分類器的這種偏差就是良性的。
模型的可解釋性
為了驗證模型並解釋它的預測結果,我們需要明確模型用以進行判斷的那些辭彙。如果我們的數據有偏差,而分類器在樣本數據中卻能做出準確預測,那這樣的模型就無法在現實世界中很好地推廣。
在這裡,我們可以用圖表來表示災難性推文與不相關推文兩類預測中最重要的辭彙。由於我們可以對模型的預測係數進行提取和排序,用詞袋模型(bag-of-words)和Logistic回歸模型很容易就能計算出單詞的重要性。
詞袋模型(bag-of-words):單詞的重要性
我們的分類器能夠正確識別出一些模式(如廣島、大屠殺等),但在一些毫無意義的辭彙(如heyoo、x1392等)上還是出現了過擬合。詞袋模型(bag-of-words)僅能處理龐大辭彙表內的不同辭彙,並對所有的辭彙分配相同的權重。然而,其中一些辭彙出現得非常頻繁,但卻只是預測結果的噪音數據。接下來,我們將試著找到一種能夠表示辭彙在句子中出現頻率的方法,盡量讓模型從數據中獲取更多的信號。
步驟6:辭彙結構的統計
TF-IDF嵌入模型
為了讓模型專註於學習更有意義的辭彙,我們可以在詞袋模型上面使用TF-IDF評分(術語頻率,逆文檔頻率)。TF-IDF通過辭彙在數據集中的稀有程度來評估它的重要性,適度削弱出現過於頻繁的單詞。下圖是TF-IDF嵌入模型的PCA映射:
可視化TF-IDF嵌入模型
從中可以看出,兩種顏色之間有了更清晰的區分,使這兩類數據更易於被分類器分開。在新模型上訓練Logistic回歸,我們得到了76.2%的準確度,說明TF-IDF確實有助於提高識別性能。
儘管只是非常微小的改進,但我們的模型能否就此學到更重要的辭彙呢?如果能得到更好的結果,同時還能避免模型在無關辭彙上的過擬合,那TF-IDF嵌入模型就可以被認為是真正的「升級版」模型。
TF-IDF嵌入模型:單詞的重要性
可以看到,新模型學到的辭彙看起來相關度更高!儘管測試集的指標只是略有增加,但是我們對模型的識別性能更有把握,因此部署新模型的交互系統會讓用戶體驗更為舒適。
步驟7:語義信息的利用
Word2Vec
TF-IDF嵌入模型能夠學習到信號更高頻的辭彙。然而,如果部署該模型後,我們很可能會遇到一些訓練集中從未出現過的辭彙。先前的模型均無法正確分類這樣的新數據,即便其中的辭彙與訓練集非常相似。
要解決這個問題,我們就要捕捉辭彙的語義,這就意味著模型需要理解「好」與「積極」在語義上的距離要比「杏」和「大陸」更接近。這裡的工具就是Word2Vec。
使用預訓練的嵌入模型
Word2Vec是一種為單詞查找連續嵌入的技術。通過閱讀大量的文字,它能夠學習並記憶那些傾向於在相似語境中出現的辭彙。經過足夠的數據訓練之後,它會為辭彙表中的每個單詞都生成一個300維的向量,用以記錄語義相近的辭彙。
Word2Vec作者在一個非常大的語料庫上預訓練並開源了該模型。利用這一語料庫,我們可以將一些語義知識納入到我們的模型內。預訓練好的詞向量可以在本文的GitHub代碼庫中找到。
GitHub地址:
https://github.com/hundredblocks/concrete_NLP_tutorial
句子分級表示
讓分類器快速得到句子嵌入的方法,是先將句中所有辭彙Word2Vec得分的平均化。這與此前詞袋模型的做法類似,但這裡我們在保留語義信息的同時只丟棄句法。
Word2vec模型的句子嵌入
利用前面的可視化技術對新模型繪圖,結果如下:
Word2Vc嵌入模型的可視化結果
在這裡,兩組顏色的分離程度更大一些,這就意味著Word2Vec能夠幫助分類器更好地分離這兩種類別。再一次使用Logistic回歸,得到77.7%的準確率,是我們迄今最好的結果!
複雜性/可解釋性權衡取捨
與先前的模型不同,新模型無法將每個單詞都表示成一維向量,因此很難看出哪些辭彙與我們的分類結果相關度最高。儘管我們仍可使用Logistic回歸的係數,但它們僅與嵌入的300個維度相關,而與辭彙索引值並不相關。
模型準確率確實提高了,但完全做不了可解釋性分析就有點得不償失了。不過,對於更複雜的模型,我們可以利用LIME這樣的「黑盒解釋器」來稍微解釋一下分類器具體是如何工作的。
LIME
LIME是Github上的一個開源軟體包,它允許用戶通過觀察輸入的擾動(比如在我們的例子中,從句中移除單詞)來分析一個特定分類器的預測結果是如何變化的。
從下圖來看它對我們數據集中幾個句子的解釋:
正確分類的災難性辭彙被歸類為「相關」
這個詞對分類的影響似乎不太明顯
不過,我們沒有時間去逐一探索數據集中的數千個樣本。我們要做的是在代表性的測試樣本上運行LIME,以此來分析哪些辭彙對於分類預測的影響更大。這樣,我們就可以像前面一樣獲取到單詞的重要性分數,以驗證模型的預測結果。
Word2Vec:單詞的重要性
模型能夠提取高度相關的詞,這意味著它做出了可解釋的決定。這些辭彙的相關度是最高的,因此我們更願意在實際生產中部署這樣的模型。
步驟8:使用端到端的方式訓練語法特徵
我們已經介紹過如何用快速有效的辦法來生成緊湊的句子嵌入。然而,通過省略辭彙的順序,我們也放棄了語句的所有句法信息。如果簡單的方法給不出令人滿意的結果,那我們就用更為複雜的模型:將整個句子作為輸入並預測標籤,同時無需建立中間表示。一種常見的做法是把句子視為詞向量的序列,如使用Word2Vec,或是GloVe、CoVe等更先進的方法。接下來我們詳細討論。
高效的端到端的訓練體系結構(源)
用於句子分類的卷積神經網路(https://arxiv.org/abs/1408.5882)訓練速度很快快。它作為一種入門級的深度學習架構,能夠很好地解決分類問題。儘管CNN聲名主要源自它在圖像處理方面的出色能力,但在文本相關任務上,它所提供的結果也相當優異。且相比多數複雜的NLP方法(如LSTM、Encoder/Decoder架構等),CNN訓練速度也更快。它能夠保留單詞的順序,很好地學習單詞的序列特徵以及其他有用信息。相對於先前的模型,它可以區分出「Alex eats plants」與「Plants eat Alex」之間差異。
相比先前的方法,該模型的訓練不需更多的工作,但效果卻好得多,準確率高達79.5%!與前面的步驟一樣,下一步也要繼續探索並可視化該模型的預測結果,以驗證它是否為最佳模型。做到這一步,你應該能自己完成這裡的操作。
寫在最後
簡單回顧一下,我們在各個步驟中所用的方法是這樣的:
從一個簡單的模型快速開始
解釋模型的預測
理解模型分類中的錯誤樣本
使用這些知識來決定下一步的部署。
上述八大步驟所用的模型是我們處理短文本時的幾個特定實例,但其背後的解決方法已經廣泛被用在各類NLP問題的實際處理上。
https://blog.insightdatascience.com/how-to-solve-90-of-nlp-problems-a-step-by-step-guide-fda605278e4e


TAG:機器學習 |