如何解決90%的天然語言處理問題:分步指南奉上


天然語言處理(NLP)與計算機視覺(CV)同樣,是目前人工智能領域裏最爲重要的兩個方向。如何讓機器學習方法從文字中理解人類語言內含的思想?本文中,來自 Insight AI 的 Emmanuel Ameisen 將爲咱們簡述絕大多數任務上咱們須要遵循的思路。文章選自InsightDataScience,做者:Emmanuel Ameisen,由機器之心編譯。

文本數據無處不在

不管是成立的公司,仍是致力於推出新服務,你均可以利用文本數據來驗證、改進和擴展產品的功能。從文本數據中提取信息並從中學習的科學是天然語言處理(NLP)的一個活躍的研究課題。git

NLP 覆蓋領域很廣,天天都會有新的使人興奮的結果。但通過與數百家公司合做,Insight 團隊發現其中有幾個重要應用出現得尤爲頻繁:github

  • 識別不一樣的用戶/客戶羣(例如預測客戶流失、顧客終身價值、產品偏好)算法

  • 準確檢測和提取不一樣類別的反饋(正面和負面的評論/意見,提到的特定屬性,如衣服尺寸/合身度等)網絡

  • 根據意圖對文本進行分類(例如尋求通常幫助,緊急問題)機器學習

儘管網上有不少 NLP 論文和教程,但咱們很難找到從頭開始高效學習這些問題的指南和技巧。ide

本文給你的幫助

結合每一年帶領數百個項目組的經驗,以及全美國最頂尖團隊的建議,咱們完成了這篇文章,它將解釋如何利用機器學習方案來解決上述 NLP 問題。咱們將從最簡單的方法開始,而後介紹更細緻的方案,如特徵工程、單詞向量和深度學習。工具

閱讀完本文後,您將會知道如何:學習

  • 收集、準備和檢驗數據測試

  • 創建簡單的模型,必要時轉化爲深度學習優化

  • 解釋和理解模型,確保捕獲的是信息而非噪聲

這篇文章咱們將給你提供一步一步的指導;也能夠做爲一個提供有效標準方法的高水平概述。

這篇文章附有一個交互式 notebook,演示和應用了全部技術。你能夠隨意運行代碼,同步學習:github.com/hundredbloc…


第 1 步:收集數據

數據源示例

每一個機器學習問題都從數據開始,例如電子郵件、帖子或推文(微博)。文本信息的常見來源包括:

  • 產品評論(來自亞馬遜,Yelp 和各類應用商店)

  • 用戶發佈的內容(推文,Facebook 上的帖子,StackOverflow 上的問題)

  • 故障排除(客戶請求,支持票據,聊天記錄)


「社交媒體中出現的災難」數據集

本文咱們將使用由 CrowdFlower 提供的一個名爲「社交媒體中出現的災難」的數據集,其中:

編者查看了超過 1 萬條推文,其中包括「着火」、「隔離」和「混亂」等各類搜索,而後看推文是不是指災難事件(排除掉用這些單詞來說笑話或評論電影等沒有發生災難的狀況)。

咱們的任務是檢測哪些推文關於災難性事件,排除像電影這種不相關的話題。爲何?一個可能的應用是僅在發生緊急事件時(而不是在討論最近 Adam Sandler 的電影時)通知執法官員。

這篇文章的其它地方,咱們將把關於災難的推文稱爲「災難」,把其它的推文稱爲「不相關事件」。


標籤

咱們已經標記了數據,所以咱們知道推文所屬類別。正如 Richard Socher 在下文中概述的那樣,找到並標記足夠多的數據來訓練模型一般更快、更簡單、更便宜,而非嘗試優化複雜的無監督方法。

Richard Socher 的小建議


第 2 步:清理數據

咱們遵循的首要規則是:「你的模型受限於你的數據」。

數據科學家的重要技能之一就是知道下一步的工做對象是模型仍是數據。一個好的方法是先查看數據再清理數據。一個乾淨的數據集可使模型學習有意義的特徵,而不是過分擬合無關的噪聲。

下面是一個清理數據的清單:(更多細節見代碼 code (github.com/hundredbloc…)):

1. 刪除全部不相關的字符,如任何非字母數字字符

2. 把文字分紅單獨的單詞來標記解析

3. 刪除不相關的詞,例如推文中的「@」或網址

4. 將全部字符轉換爲小寫字母,使「hello」,「Hello」和「HELLO」等單詞統一

5. 考慮將拼寫錯誤和重複拼寫的單詞歸爲一類(例如「cool」/「kewl」/「cooool」)

6. 考慮詞性還原(將「am」「are」「is」等詞語統一爲常見形式「be」)

按這些步驟操做並檢查錯誤後,就可使用乾淨的標籤化的數據來訓練模型啦!


第 3 步:尋找好的數據表示

機器學習模型的輸入是數值。如圖像處理的模型中,用矩陣來表示各個顏色通道中每一個像素的強度。

一個笑臉能夠表示爲一個數字矩陣

若是咱們的數據集是一系列的句子,爲了使算法能夠從數據中提取特徵,咱們須要表示爲能夠被算法識別的形式,如表示爲一系列數字。


One-hot encoding(詞袋模型)

表示文本的一種常見方法是將每一個字符單獨編碼爲一個數字(例如 ASCII)。若是咱們直接把這種簡單的形式用於分類器,那隻能基於咱們的數據從頭開始學習單詞的結構,這對於大多數數據集是不可實現的。所以,咱們須要一個更高級的方法。

例如,咱們能夠爲數據集中的全部單詞創建一個詞彙表,每一個單詞對應一個不一樣的數字(索引)。那句子就能夠表示成長度爲詞彙表中不一樣單詞的一個列表。在列表的每一個索引處,標記該單詞在句子中出現的次數。這就是詞袋模型(Bag of Words),這種表示徹底忽略了句子中單詞的順序。以下所示。

將句子表示爲詞袋。左邊爲句子,右邊爲對應的表示,向量中的每一個數字(索引)表明一個特定的單詞。


可視化詞嵌入

在「社交媒體中出現的災難」一例中,大約有 2 萬字的詞彙,這表明每一個句子都將被表示爲長度爲 2 萬的向量。向量中有不少 0,由於每一個句子只包含詞彙表中很是小的一個子集。

爲了瞭解詞嵌入是否捕獲到了與問題相關的信息(如推文是否說的是災難),有一個很好的辦法,就是將它們可視化並看這些類的分離程度。因爲詞彙表很大,在 20,000 個維度上可視化數據是不可能的,所以須要主成分分析(PCA)這樣的方法將數據分到兩個維度。以下圖所示。

將嵌入的詞袋可視化

看起來很難分爲兩類,也很差去下降維度,這是嵌入的一個特色。爲了瞭解詞袋模型特徵是否有用,咱們能夠基於它們訓練一個分類器。


第 4 步:分類器

遇到一個問題時,一般從尋找解決問題的工具入手。當咱們要對數據進行分類時,出於通用性和可解釋性的考慮,一般使用 Logistic 迴歸(Logistic Regression)。訓練很是簡單,結果也可解釋,由於易於從模型提取出最重要的參數。

咱們將數據分紅一個用於擬合模型的訓練集和一個用於分析對不可見數據擬合程度的測試集。訓練結束後,準確率爲 75.4%。還看得過去!最頻繁的一類(「不相關事件」)僅爲 57%。但即便只有 75% 的準確率也足以知足咱們的須要了,必定要在理解的基礎上建模。


第 5 步:檢驗

混淆矩陣(Confusion Matrix)

首先要知道咱們模型的錯誤類型,以及最不指望的是哪一種錯誤。在咱們的例子中,誤報指將不相關的推文分類爲災難,漏報指將關於災難的推文歸爲不相關事件。若是要優先處理每一個可能的事件,那咱們想下降漏報的狀況。若是咱們優先考慮資源有限的問題,那咱們會優先下降誤報的狀況,從而減小誤報的提醒。咱們能夠用混淆矩陣來可視化這些信息,混淆矩陣將咱們模型預測的結果與真實狀況進行比較。理想狀況下(咱們的預測結果與真實狀況徹底相符),矩陣爲從左上到右下的一個對角矩陣。


混淆矩陣(綠色比例大,藍色比例小)

咱們的分類器的漏報狀況(相對)高於誤報狀況。也就是說,這個模型極可能錯誤地將災難歸爲不相關事件。若是誤報狀況下執法的成本很高,那咱們更傾向於使用這個分類器。


解釋模型

爲了驗證模型並解釋模型的預測,咱們須要看哪些單詞在預測中起主要做用。若是數據有誤差,分類器會對樣本數據做出準確的預測,但在實際應用時模型預測的效果並不理想。下圖中咱們給出了關於災難和不相關事件的重要詞彙。咱們能夠提取並比較模型中的預測係數,因此用詞袋模型和 Logistic 迴歸來尋找重要詞彙很是簡單。

詞袋:重要詞彙

咱們的分類器正確地找到了一些模式(廣島,大屠殺),但顯然這是無心義數據的過分擬合(heyoo, x1392)。如今咱們的詞袋模型正在處理一個龐大的詞彙表,全部詞彙對它來講都是同樣的。但一些詞彙出現地很是頻繁,並且只會對咱們的預測加入噪聲。接下來,咱們試着用一個方法來表示詞彙出現的頻率,看咱們可否從數據中得到更多的信號。


第 6 步:統計詞彙

TF-IDF

爲了使模型更關注有意義的單詞,咱們可使用 TF-IDF(詞頻-逆文檔頻率)對咱們的詞袋模型進行評估。TF-IDF 經過對數據集中詞彙出現的頻率來加權,並減少高頻但只是增長噪音的單詞的權重。這是咱們新嵌入的 PCA 預測。

將 TF-IDF 嵌入可視化

由上圖咱們看到,兩種顏色的數據差異更加明顯。這使分類器分組更加容易。讓咱們來看一下這樣結果是否會更好。訓練新嵌入的 Logistic 迴歸,咱們獲得了 76.2%的準確率。

只是稍稍地進行了改進。那如今咱們的模型能夠選擇更重要的單詞了嗎?若是模型預測時有效地繞過了「陷阱」,獲得了更好的結果,那就能夠說,這個模型獲得了優化。

TF-IDF:重要詞彙

挑出來的單詞彷佛更加相關了!儘管咱們測試集的指標稍有增長,但模型使用的詞彙更加關鍵了,所以咱們說「整個系統運行時與客戶的交互更加溫馨有效」。


第 7 步:利用語義

Word2Vec

咱們最新的模型能夠挑出高信號的單詞。但極可能咱們運做模型時會遇到訓練集中沒有單詞。所以,即便在訓練中遇到很是類似的單詞,以前的模型也不會準確地對這些推文進行分類。

爲了解決這個問題,咱們須要捕獲單詞的含義,也就是說,須要理解「good」和「positive」更接近而不是「apricot」或「continent」。用來捕獲單詞含義的工具叫 Word2Vec。


使用預訓練的單詞

Word2Vec 是尋找單詞連續 embedding 的技術。經過閱讀大量的文本學習,並記憶哪些單詞傾向於類似的語境。訓練足夠多的數據後,詞彙表中的每一個單詞會生成一個 300 維的向量,由意思相近的單詞構成。

論文《Efficient Estimation of Word Representations in Vector Space》的做者開源了一個模型,對一個足夠大的可用的語料庫進行預訓練,將其中的一些語義歸入咱們的模型中。預訓練的向量能夠在這篇文章相關的資源庫中找到:https://github.com/hundredblocks/concrete_NLP_tutorial。


句子的表示

快速獲得分類器的 sentence embedding 的一個方法是平均對句子中的全部單詞的 Word2Vec 評估。這和以前詞袋模型是一個意思,但此次咱們保留一些語言信息,僅忽略句子的語法。


如下是以前技術的新嵌入的可視化:

可視化 Word2Vec 嵌入

這兩種顏色的數據更明顯地分離了,咱們新的嵌入可使分類器找到兩類以前的分離。通過第三次訓練同一個模型後(Logistic 迴歸),咱們獲得了 77.7%的準確率,這是目前最好的結果!能夠檢驗咱們的模型了。


複雜性/可解釋性的權衡

咱們的 embedding 沒有向以前的模型那樣每一個單詞表示爲一維的向量,因此很驗證看出哪些單詞和咱們的向量最相關,。雖然咱們仍可使用 Logistic 迴歸的係數,但它們和咱們 embedding 的 300 個維度有關,而再也不是單詞的索引。

它的準確率這麼低,拋掉全部的可解釋性彷佛是一個粗糙的權衡。但對於更復雜的模型來講,咱們能夠利用 LIME 之類的黑盒解釋器(black box explainers)來深刻了解分類器的工做原理。


LIME

能夠經過開源軟件包在 Github 上找到 LIME:https://github.com/marcotcr/lime

黑盒解釋器容許用戶經過擾亂輸入並觀察預測的變化來解釋一個特定例子的任何分類器的決定。

讓咱們看一下數據集中幾個句子的解釋。

挑選正確的災難詞彙並歸類爲「相關」。


這裏,這個詞對分類器的形成的影響彷佛不太明顯。

可是,咱們沒有時間去探索數據集中的數千個示例。咱們要作的是在測試例子的表明樣本上運行 LIME,看哪些詞彙作的貢獻大。使用這種方式,咱們能夠像以前的模型同樣對重要單詞進行評估,並驗證模型的預測結果。


Word2Vec:重要單詞

模型提取的高度相關的詞意味它能夠作出更加可解釋的決定。這些看起來像是以前模型中最相關的詞彙,所以咱們更願意將其加入到咱們的模型中。


第 8 步:使用端到端(end-to-end)方法

咱們已經介紹了生成簡潔句嵌入快速有效的方法。可是因爲忽略了單詞的順序,咱們跳過了句子全部的語法信息。若是這些方法提供的結果不充分,那咱們可使用更復雜的模型,輸入整個句子並預測標籤,而不須要中間表示。一個常見的方法是使用 Word2Vec 或更相似的方法(如 GloVe 或 CoVe)將句子看做一個單詞向量的序列。這就是咱們下文中要作的。

高效的端到端結構

用於句子分類的卷積神經網絡訓練很是迅速,做爲入門級深度學習體系效果很是理想。雖然卷積神經網絡(CNN)主要由於在圖像處理的使用而廣爲人知,但它們在處理文本相關任務時獲得的結果也很是好,並且一般比大多數複雜的 NLP 方法(如 LSTMs 和 Encoder/Decoder 結構)訓練地更快。這個模型考慮了單詞的順序,並學習了哪些單詞序列能夠預測目標類等有價值的信息,能夠區別「Alex eats plants」和「Plants eat Alex」。

訓練這個模型不用比以前的模型作更多的工做,而且效果更好,準確率達到了 79.5%!詳見代碼:github.com/hundredbloc…

與上述模型同樣,下一步咱們要使用此方法來探索和解釋預測,以驗證它是不是給用戶提供的最好的模型。到如今,你應該對這樣的問題輕車熟路了。


結語

下面對咱們成功使用的方法進行簡要回顧:

  • 從一個簡單快速的模型開始

  • 解釋其預測

  • 瞭解其錯誤類型

  • 根據以上知識來判斷下一步的工做——處理數據仍是尋找更復雜的模型

這些方法只用於特定的例子——使用適當的模型來理解和利用短文本(推文),但這種思想適用於各類問題。但願這篇文章對你有所幫助,也歡迎你們提出意見和問題!

相關文章
相關標籤/搜索