如何解決90%的NLP問題:逐步指導
使用機器學習來理解和利用文字。
文字資料無處不在
無論您是成熟公司還是致力於推出新服務,您始終可以利用文字資料來驗證,改進和擴充套件產品的功能。從文字資料中提取意義和學習的科學是一個活躍的研究主題,稱為自然語言處理(NLP)。
每天NLP產生新的和令人興奮的 結果,是一個非常大的領域。然而,Insight團隊與數百家公司合作,看到一些關鍵的實際應用程式比其他任何公司更頻繁地出現:
- 識別不同的使用者/客戶群(例如預測流失,生命週期價值,產品偏好)
- 準確地檢測和提取不同類別的反饋(正面和負面評論/意見,提及特定屬性,如服裝尺碼/合身......)
- 根據意圖對文字進行分類(例如請求基本幫助,緊急問題)
雖然許多NLP論文和教程存在於網上,但我們發現很難找到有關如何從頭開始有效解決這些問題的指南和技巧。
本文如何提供幫助
在每年領導數百個專案並獲得美國各地頂級團隊的建議後,我們寫了這篇文章來解釋如何構建機器學習解決方案來解決上述問題。我們將從最簡單的方法開始,然後轉向更細微的解決方案,例如特徵工程,單詞向量和深度學習。
閱讀本文後,您將瞭解如何:
- 收集,準備和檢查資料
- 構建簡單的模型,並在必要時過渡到深度學習
- 解釋和理解您的模型,以確保您實際捕獲資訊而不是噪音
我們把這篇文章寫成了一步一步的指南; 它還可以作為高效標準方法的高階概述。
這篇文章附有一個互動式筆記本,演示和應用所有這些技術。隨意執行程式碼並繼續!
第1步:收集您的資料
示例資料來源
每個機器學習問題都從資料開始,例如電子郵件,帖子或推文列表。常見的文字資訊來源包括:
- 產品評論(在亞馬遜,Yelp和各種應用商店)
- 使用者生成的內容(推文,Facebook帖子,StackOverflow問題)
- 故障排除(客戶請求,支援服務單,聊天記錄)
“社交媒體災難”資料集
對於這篇文章,我們將使用 Figure Eight慷慨提供的資料集,稱為“社交媒體上的災難”,其中:
貢獻者檢視了超過
條推文,其中包括“點燃”,“隔離”和“混亂”等各種搜尋,然後注意到推文是否涉及災難事件(而不是與單詞或電影評論相關的笑話或一些非災難性的事情)。
我們的任務是檢測哪些推文是關於災難性事件的,而不是像電影那樣無關緊要的話題。為什麼?一個潛在的應用是完全通知執法官員緊急緊急情況,同時忽略對最近的亞當桑德勒電影的評論。這項任務的一個特殊挑戰是兩個類都包含用於查詢推文的相同搜尋詞,因此我們必須使用微妙的差異來區分它們。
在本文的其餘部分,我們將把關於災難的推文稱為“ disaster(災難 )”,並將有關其他任何內容的推文稱為“ (irrelevant)無關緊要 ”。
標籤
我們已經標記了資料,因此我們知道哪些推文屬於哪些類別。正如Richard Socher在下面概述的那樣,通常更快,更簡單,更便宜地找到並標記足夠的資料來訓練模型,而不是試圖優化複雜的無監督方法。
第2步:清理資料
我們遵循的首要規則是:
資料科學家的關鍵技能之一是瞭解下一步是應該對模型還是資料進行處理。一個好的經驗法則是首先檢視資料然後進行清理。一個乾淨的資料集將允許模型學習有意義的功能,而不是過度匹配無關的噪音。
以下是用於清理資料的清單:( 有關詳細資訊,請參閱程式碼):
- 刪除所有不相關的字元,例如任何非字母數字字元
- 通過分詞將其分割成單個的單詞文字
- 刪除不相關的單詞,例如“@”twitter提及或網址
- 將所有字元轉換為小寫,以便將諸如“hello”,“Hello”和“HELLO”之類的單詞視為相同
- 考慮將拼寫錯誤或交替拼寫的單片語合成單個表示(例如“cool”/“kewl”/“cooool”)
- 考慮詞形還原(將諸如“am”,“are”和“is”等詞語簡化為常見形式,例如“be”)
按照這些步驟並檢查其他錯誤後,我們可以開始使用乾淨的標記資料來訓練模型!
第3步:找到一個好的資料表示
機器學習模型將數值作為輸入。例如,處理影象的模型採用表示每個顏色通道中每個畫素的強度的矩陣。
我們的資料集是一個句子列表,所以為了讓我們的演算法從資料中提取模式,我們首先需要找到一種方法來表示我們的演算法可以理解的方式,即作為數字列表。
one-hot編碼(Bag of Words)
表示計算機文字的一種自然方式是將每個字元單獨編碼為數字(例如ASCII)。如果我們將這個簡單的表示提供給分類器,則必須僅根據我們的資料從頭學習單詞的結構,這對於大多數資料集是不可能的。我們需要使用更高階別的方法。
例如,我們可以在資料集中構建所有唯一單詞的詞彙表,並將唯一索引與詞彙表中的每個單詞相關聯。然後將每個句子表示為與我們詞彙表中不同單詞的數量一樣長的列表。在此列表中的每個索引處,我們標記給定單詞在句子中出現的次數。這被稱為Bag 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迴歸繪製單詞重要性很簡單,因為我們可以提取和排列模型用於其預測的係數。
我們的分類器正確地採用了一些模式(廣島,大屠殺),但顯然在某些無意義的術語上過度擬合(heyoo,x1392)。現在,我們的Bag of Words模型正在處理不同單詞的巨大詞彙並平等對待所有單詞。然而,這些詞中的一些是非常頻繁的,並且只會對我們的預測產生噪音。接下來,我們將嘗試一種方法來表示可以解釋單詞頻率的句子,看看我們是否可以從我們的資料中獲取更多訊號。
第六步:考慮詞彙結構
TF-IDF
為了幫助我們的模型更多地關注有意義的單詞,我們可以在我們的Bag of Words模型之上使用TF-IDF分數(Term Frequency,Inverse Document Frequency)。TF-IDF根據它們在我們的資料集中的稀有程度對單詞進行加權,對過於頻繁的單詞進行折扣並僅新增噪聲。這是我們新嵌入的PCA投影。
我們可以看到上面兩種顏色之間有更明確的區別。這應該使我們的分類器更容易 分離兩個組。讓我們看看這是否會帶來更好的效能。在我們的新嵌入體上訓練另一個Logistic迴歸,我們得到76.2%的準確度。
一點點改進。我們的模型是否開始接受更重要的詞彙?如果我們在防止我們的模型“作弊”的同時獲得更好的結果,那麼我們可以真正認為這個模型是升級。
它所拾取的單詞看起來更相關!儘管我們的測試集上的指標僅略有增加,但我們對模型使用的術語更有信心,因此在將與客戶互動的系統中部署它時會感覺更舒服。
第7步:利用語義
Word2Vec
我們最新模型設法獲得高訊號詞。但是,如果我們部署此模型,我們很可能會遇到以前在訓練集中沒有看到過的單詞。即使在培訓期間看到非常相似的單詞,之前的模型也無法準確地對這些推文進行分類。
為了解決這個問題,我們需要捕捉詞語的語義,這意味著我們需要理解像“好”和“積極”這樣的詞比“杏”和“大陸”更接近。我們將用來幫助我們捕獲意義的工具稱為Word2Vec。
使用預先訓練過的單詞
Word2Vec是一種查詢單詞連續嵌入的技術。它通過閱讀大量文字並記住哪些詞語傾向於出現在類似的語境中來學習。在對足夠的資料進行訓練之後,它為詞彙表中的每個單詞生成300維向量,其中具有相似含義的單詞彼此更接近。
該報告的作者論文開源了一個非常大的語料庫,我們可以利用到包括語義一些知識轉化成我們的模型這是預先訓練的典範。可以在與此帖相關聯的儲存庫中找到預先訓練的向量。
句子級別表示
為我們的分類器設定句子嵌入的快速方法是平均句子中所有單詞的Word2Vec分數。這是一個像之前一樣的Bag of Words方法,但這次我們只丟失了句子的語法,同時保留了一些語義資訊。
以下是使用以前技術的新嵌入的視覺化:
這兩組顏色看起來更加分離,我們的新嵌入應該有助於我們的分類器找到兩個類之間的分離。在第三次訓練相同模 型(Logistic迴歸)後,我們得到77.7%的準確度得分,我們的最佳結果呢!是時候檢查我們的模型了。
複雜性/可解釋性權衡
由於我們的嵌入不像我們之前的模型那樣表示為每個單詞一維的向量,因此很難看出哪些單詞與我們的分類最相關。雖然我們仍然可以訪問Logistic迴歸的係數,但它們與嵌入的300維有關,而不是單詞的索引。
對於如此低的準確度增益,失去所有可解釋性似乎是一種嚴厲的權衡。但是,對於更復雜的模型,我們可以利用LIME等黑盒直譯器,以便深入瞭解分類器的工作原理。
LIME
LIME 可通過開源軟體包在Github上獲得。黑盒直譯器允許使用者通過擾亂輸入(在我們的情況下從句子中刪除單詞)並檢視預測如何變化來解釋任何分類器在一個特定示例上的決定。
讓我們看一下我們資料集中句子的幾個解釋。
但是,我們沒有時間探索資料集中的數千個示例。我們要做的是在有代表性的測試用例樣本上執行LIME,看看哪些詞會繼續成為強大的貢獻者。使用這種方法,我們可以像以前的模型一樣獲得單詞重要性分數,並驗證模型的預測。
看起來該模型選擇了高度相關的詞語,暗示它似乎做出了可以理解的決定。這些似乎是以前所有型號中最相關的詞,因此我們更願意部署到生產中。
步驟8:使用端到端方法利用語法
我們已經介紹了生成緊湊句嵌入的快速有效方法。但是,通過省略單詞的順序,我們將丟棄句子的所有句法資訊。如果這些方法不能提供足夠的結果,您可以使用更復雜的模型,將整個句子作為輸入並預測標籤,而無需構建中間表示。要做到這一點的常用方法是把一個句子中的單詞向量序列使用或者Word2Vec或更近的方法,比如GloVe或GoVe。這是我們將在下面做的。
用於句子分類的卷積神經網路訓練非常快,並且作為入門級深度學習架構執行良好。雖然卷積神經網路(CNN)主要以其在影象資料上的效能而聞名,但它們在文字相關任務上提供了出色的結果,並且通常比大多數複雜的NLP方法(例如LSTM和編碼器/解碼器架構)更快地進行訓練。該模型保留了單詞的順序,並學習了有關哪些單詞序列可以預測目標類的有價值資訊。與之前的型號相反,它可以區分“Alex吃植物”和“植物吃Alex”之間的區別。
訓練此模型不需要比以前的方法更多的工作(詳見程式碼),併為我們提供了比以前更好的模型,準確度達到79.5%!與上述模型一樣,下一步應該是使用我們描述的方法探索和解釋預測,以驗證它確實是部署到使用者的最佳模型。到現在為止,您應該自己解決這個問題。
最後的筆記
以下是我們成功使用的方法的簡要回顧:
- 從快速簡單的模型開始
- 解釋它的預測
- 瞭解它正在犯的錯誤
- 使用該知識為下一步提供資訊,無論是對您的資料還是更復雜的模型。
這些方法適用於特定的示例案例,使用為理解和利用短文字(如推文)而定製的模型,但這些思想廣泛適用於各種問題。我希望這對你有幫助,我們很樂意聽到你的意見和問題!
更多文章歡迎訪問 http://www.apexyun.com/
聯絡郵箱:public@space-explore.com
(未經同意,請勿轉載)