如何解決90%的NLP問題:逐步指導

如何解決90%的NLP問題:逐步指導html

使用機器學習來理解和利用文本。git

                                            如何將5 W和H應用於文本數據!

文本數據無處不在github

不管您是成熟公司仍是致力於推出新服務,您始終能夠利用文本數據來驗證,改進和擴展產品的功能。從文本數據中提取意義和學習的科學是一個活躍的研究主題,稱爲天然語言處理(NLP)。算法

天天NLP產生新的使人興奮的 結果,是一個很是大的領域。然而,Insight團隊與數百家公司合做,看到一些關鍵的實際應用程序比其餘任何公司更頻繁地出現:網絡

  • 識別不一樣的用戶/客戶羣(例如預測流失,生命週期價值,產品偏好)
  • 準確地檢測和提取不一樣類別的反饋(正面和負面評論/意見,說起特定屬性,如服裝尺碼/合身......)
  • 根據意圖對文本進行分類(例如請求基本幫助,緊急問題)

雖然許多NLP論文和教程存在於網上,但咱們發現很難找到有關如何從頭開始有效解決這些問題的指南和技巧。架構

本文如何提供幫助機器學習

在每一年領導數百個項目並得到美國各地頂級團隊的建議後,咱們寫了這篇文章來解釋如何構建機器學習解決方案來解決上述問題。咱們將從最簡單的方法開始,而後轉向更細微的解決方案,例如特徵工程,單詞向量和深度學習。ide

閱讀本文後,您將瞭解如何:工具

  • 收集,準備和檢查數據
  • 構建簡單的模型,並在必要時過渡到深度學習
  • 解釋和理解您的模型,以確保您實際捕獲信息而不是噪音

咱們把這篇文章寫成了一步一步的指南; 它還能夠做爲高效標準方法的高級概述。post

這篇文章附有一個交互式筆記本,演示和應用全部這些技術。隨意運行代碼並繼續!

第1步:收集您的數據

示例數據源

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

  • 產品評論(在亞馬遜,Yelp和各類應用商店)
  • 用戶生成的內容(推文,Facebook帖子,StackOverflow問題)
  • 故障排除(客戶請求,支持服務單,聊天記錄)

「社交媒體災難」數據集

對於這篇文章,咱們將使用 Figure Eight慷慨提供的數據集,稱爲「社交媒體上的災難」,其中:

貢獻者查看了超過

10,000

條推文,其中包括「點燃」,「隔離」和「混亂」等各類搜索,而後注意到推文是否涉及災難事件(而不是與單詞或電影評論相關的笑話或一些非災難性的事情)。

咱們的任務是檢測哪些推文是關於災難性事件的,而不是像電影那樣可有可無的話題。爲何?一個潛在的應用是徹底通知執法官員緊急緊急狀況,同時忽略對最近的亞當桑德勒電影的評論。這項任務的一個特殊挑戰是兩個類都包含用於查找推文的相同搜索詞,所以咱們必須使用微妙的差別來區分它們。

在本文的其他部分,咱們將把關於災難的推文稱爲「 disaster(災難 )」,並將有關其餘任何內容的推文稱爲「 (irrelevant)可有可無 」。

標籤

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

                                    Richard Socher的專業提示

第2步:清理數據

咱們遵循的首要規則是:

「您的模型將永遠與您的數據同樣好。」

數據科學家的關鍵技能之一是瞭解下一步是應該對模型仍是數據進行處理。一個好的經驗法則是首先查看數據而後進行清理。一個乾淨的數據集將容許模型學習有意義的功能,而不是過分匹配無關的噪音。

如下是用於清理數據的清單:( 有關詳細信息,請參閱代碼):

  • 刪除全部不相關的字符,例如任何非字母數字字符
  • 經過分詞將其分割成單個的單詞文本
  • 刪除不相關的單詞,例如「@」twitter說起或網址
  • 將全部字符轉換爲小寫,以便將諸如「hello」,「Hello」和「HELLO」之類的單詞視爲相同
  • 考慮將拼寫錯誤或交替拼寫的單詞組合成單個表示(例如「cool」/「kewl」/「cooool」)
  • 考慮詞形還原(將諸如「am」,「are」和「is」等詞語簡化爲常見形式,例如「be」)

按照這些步驟並檢查其餘錯誤後,咱們能夠開始使用乾淨的標記數據來訓練模型!

第3步:找到一個好的數據表示

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

                                        一個微笑的臉表示爲數字矩陣。

咱們的數據集是一個句子列表,因此爲了讓咱們的算法從數據中提取模式,咱們首先須要找到一種方法來表示咱們的算法能夠理解的方式,即做爲數字列表。

one-hot編碼(Bag of Words)

表示計算機文本的一種天然方式是將每一個字符單獨編碼爲數字(例如ASCII)。若是咱們將這個簡單的表示提供給分類器,則必須僅根據咱們的數據從頭學習單詞的結構,這對於大多數數據集是不可能的。咱們須要使用更高級別的方法。

例如,咱們能夠在數據集中構建全部惟一單詞的詞彙表,並將惟一索引與詞彙表中的每一個單詞相關聯。而後將每一個句子表示爲與咱們詞彙表中不一樣單詞的數量同樣長的列表。在此列表中的每一個索引處,咱們標記給定單詞在句子中出現的次數。這被稱爲Bag of Words模型,由於它是一種徹底忽略句子中單詞順序的表示。這以下圖所示。

   將句子表示爲一Bage of Words。左邊的句子,右邊的表示。向量中的每一個索引表明一個特定的單詞。

可視化嵌入

咱們在「社交媒體災難」示例中的詞彙量大約有20,000個單詞,這意味着每一個句子都將表示爲長度爲20,000的向量。向量將主要包含0由於每一個句子只包含咱們詞彙表的一小部分。

爲了查看咱們的嵌入是否正在捕獲與咱們的問題相關的信息(即推文是否與災難有關),最好將它們可視化並查看類看起來是否分離得很好。因爲詞彙表一般很是大,而且不可能以20,000維度可視化數據,所以像PCA這樣的技術將有助於將數據投影到二維。這個繪製以下。

                            可視化詞袋嵌入

這兩個類看起來分離不是很好,這多是咱們嵌入的一個特徵,或者僅僅是咱們降維的一個特徵。爲了查看Bag of Words功能是否有用,咱們能夠根據它們訓練分類器。

第4步:分類

當第一個接近問題時,通常的最佳作法是從能夠解決工做的最簡單的工具開始。不管什麼時候對數據進行分類,其多功能性和可解釋性的共同點都是Logistic迴歸。訓練很是簡單,結果能夠解釋,由於您能夠輕鬆地從模型中提取最重要的係數。

咱們將數據分紅一個訓練集,用於擬合咱們的模型和一個測試集,以查看它對未見數據的歸納性。通過培訓,咱們獲得75.4%準確率。不是太寒酸!猜想最頻繁的分類(「不相關(irrelevant)」)將只給咱們57%。然而,即便75%的精度足以知足咱們的需求,咱們也毫不應該在不試圖瞭解它的狀況下運送模型。

第五步:檢查

混亂矩陣

第一步是瞭解咱們的模型所犯的錯誤類型,以及哪一種錯誤是最不可取的。在咱們的示例中,false positives將不相關的推文分類爲災難,而false negatives則將災難歸類爲不相關的推文。若是優先考慮對每一個潛在事件做出反應,咱們會但願下降咱們的false negatives。可是,若是咱們在資源方面受到限制,咱們可能會優先考慮較低的false positives率以減小誤報。可視化此信息的一種好方法是使用混淆矩陣,該矩陣將咱們的模型預測與真實標籤進行比較。理想狀況下,矩陣將是從左上角到右下角的對角線(咱們的預測徹底匹配真相)。

                                混淆矩陣(綠色比例高,藍色低)

咱們的分類器比 false negatives(按比例)產生更多的false positives 。換句話說,咱們模型最多見的錯誤是將災難分類爲不相關。若是false positives表明了執法的高成本,那麼這對咱們的分類者來講多是一個很好的偏見。

解釋咱們的模型

爲了驗證咱們的模型並解釋其預測,重要的是要查看它用於作出決策的單詞。若是咱們的數據有誤差,咱們的分類器將對樣本數據作出準確的預測,但該模型在現實世界中不會很好地歸納。在這裏,咱們爲災難和無關的分類繪製最重要的單詞。使用Bag of Words和Logistic迴歸繪製單詞重要性很簡單,由於咱們能夠提取和排列模型用於其預測的係數。

                           Bag of words:詞重要性

咱們的分類器正確地採用了一些模式(廣島,大屠殺),但顯然在某些無心義的術語上過分擬合(heyoo,x1392)。如今,咱們的Bag of Words模型正在處理不一樣單詞的巨大詞彙並平等對待全部單詞。然而,這些詞中的一些是很是頻繁的,而且只會對咱們的預測產生噪音。接下來,咱們將嘗試一種方法來表示能夠解釋單詞頻率的句子,看看咱們是否能夠從咱們的數據中獲取更多信號。

第六步:考慮詞彙結構

TF-IDF

爲了幫助咱們的模型更多地關注有意義的單詞,咱們能夠在咱們的Bag of Words模型之上使用TF-IDF分數(Term Frequency,Inverse Document Frequency)。TF-IDF根據它們在咱們的數據集中的稀有程度對單詞進行加權,對過於頻繁的單詞進行折扣並僅添加噪聲。這是咱們新嵌入的PCA投影。

                             可視化TF-IDF嵌入

咱們能夠看到上面兩種顏色之間有更明確的區別。這應該使咱們的分類器更容易 分離兩個組。讓咱們看看這是否會帶來更好的性能。在咱們的新嵌入體上訓練另外一個Logistic迴歸,咱們獲得76.2%的準確度。

一點點改進。咱們的模型是否開始接受更重要的詞彙?若是咱們在防止咱們的模型「做弊」的同時得到更好的結果,那麼咱們能夠真正認爲這個模型是升級。

                                TF-IDF:單詞重要性

它所拾取的單詞看起來更相關!儘管咱們的測試集上的指標僅略有增長,但咱們對模型使用的術語更有信心,所以在將與客戶交互的系統中部署它時會感受更舒服。

第7步:利用語義

Word2Vec

咱們最新模型設法得到高信號詞。可是,若是咱們部署此模型,咱們極可能會遇到之前在訓練集中沒有看到過的單詞。即便在培訓期間看到很是類似的單詞,以前的模型也沒法準確地對這些推文進行分類。

爲了解決這個問題,咱們須要捕捉詞語語義,這意味着咱們須要理解像「好」和「積極」這樣的詞比「杏」和「大陸」更接近。咱們將用來幫助咱們捕獲意義的工具稱爲Word2Vec。

使用預先訓練過的單詞

Word2Vec是一種查找單詞連續嵌入的技術。它經過閱讀大量文本並記住哪些詞語傾向於出如今相似的語境中來學習。在對足夠的數據進行訓練以後,它爲詞彙表中的每一個單詞生成300維向量,其中具備類似含義的單詞彼此更接近。

該報告的做者論文開源了一個很是大的語料庫,咱們能夠利用到包括語義一些知識轉化成咱們的模型這是預先訓練的典範。能夠在與此帖相關聯的存儲庫中找到預先訓練的向量。

句子級別表示

爲咱們的分類器設置句子嵌入的快速方法是平均句子中全部單詞的Word2Vec分數。這是一個像以前同樣的Bag of Words方法,但此次咱們只丟失了句子的語法,同時保留了一些語義信息。

                              Word2Vec句子嵌入

如下是使用之前技術的新嵌入的可視化:

                              可視化Word2Vec嵌入

這兩組顏色看起來更加分離,咱們的新嵌入應該有助於咱們的分類器找到兩個類之間的分離。在第三次訓練相同模 型(Logistic迴歸)後,咱們獲得77.7%的準確度得分,咱們的最佳結果呢!是時候檢查咱們的模型了。

複雜性/可解釋性權衡

因爲咱們的嵌入不像咱們以前的模型那樣表示爲每一個單詞一維的向量,所以很難看出哪些單詞與咱們的分類最相關。雖然咱們仍然能夠訪問Logistic迴歸的係數,但它們與嵌入的300維有關,而不是單詞的索引。

對於如此低的準確度增益,失去全部可解釋性彷佛是一種嚴厲的權衡。可是,對於更復雜的模型,咱們能夠利用LIME黑盒解釋器,以便深刻了解分類器的工做原理。

LIME

LIME 經過開源軟件包在Github上得到。黑盒解釋器容許用戶經過擾亂輸入(在咱們的狀況下從句子中刪除單詞)並查看預測如何變化來解釋任何分類器在一個特定示例上的決定。

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

                 挑選正確的災難詞語以歸類爲「相關」。
               在這裏,單詞對分類的貢獻彷佛不太明顯

可是,咱們沒有時間探索數據集中的數千個示例。咱們要作的是在有表明性的測試用例樣本上運行LIME,看看哪些詞會繼續成爲強大的貢獻者。使用這種方法,咱們能夠像之前的模型同樣得到單詞重要性分數,並驗證模型的預測。

                                Word2Vec:單詞重要性

看起來該模型選擇了高度相關的詞語,暗示它彷佛作出了能夠理解的決定。這些彷佛是之前全部型號中最相關的詞,所以咱們更願意部署到生產中。

步驟8:使用端到端方法利用語法

咱們已經介紹了生成緊湊句嵌入的快速有效方法。可是,經過省略單詞的順序,咱們將丟棄句子的全部句法信息。若是這些方法不能提供足夠的結果,您可使用更復雜的模型,將整個句子做爲輸入並預測標籤,而無需構建中間表示。要作到這一點的經常使用方法是把一個句子中的單詞矢量序列使用或者Word2Vec或更近的方法,好比GloVeGoVe。這是咱們將在下面作的。

                          高效的端到端架構( 源代碼

用於句子分類的卷積神經網絡訓練很是快,而且做爲入門級深度學習架構運行良好。雖然卷積神經網絡(CNN)主要以其在圖像數據上的性能而聞名,但它們在文本相關任務上提供了出色的結果,而且一般比大多數複雜的NLP方法(例如LSTM編碼器/解碼器架構)更快地進行訓練。該模型保留了單詞的順序,並學習了有關哪些單詞序列能夠預測目標類的有價值信息。與以前的型號相反,它能夠區分「Alex吃植物」和「植物吃Alex」之間的區別。

訓練此模型不須要比之前的方法更多的工做(詳見代碼),併爲咱們提供了比之前更好的模型,準確度達到79.5%!與上述模型同樣,下一步應該是使用咱們描述的方法探索和解釋預測,以驗證它確實是部署到用戶的最佳模型。到如今爲止,您應該本身解決這個問題。

最後的筆記

如下是咱們成功使用的方法的簡要回顧:

  • 從快速簡單的模型開始
  • 解釋它的預測
  • 瞭解它正在犯的錯誤
  • 使用該知識爲下一步提供信息,不管是對您的數據仍是更復雜的模型。

這些方法適用於特定的示例案例,使用爲理解和利用短文本(如推文)而定製的模型,但這些思想普遍適用於各類問題。我但願這對你有幫助,咱們很樂意聽到你的意見和問題!

點擊英文原文

更多文章歡迎訪問 http://www.apexyun.com/

聯繫郵箱:public@space-explore.com

(未經贊成,請勿轉載)

相關文章
相關標籤/搜索