文本數據無處不在
無論您是成熟公司還是致力於推出新服務,您始終可以利用文本數據來驗證,改進和擴展產品的功能。從文本數據中提取意義和學習的科學是一個活躍的研究主題,稱為自然語言處理(NLP)。
NLP產生新的和令人興奮的 結果每天的基礎上,是一個非常大的領域。然而,Insight團隊已與數百家公司合作,他們看到一些關鍵的實際應用程序比其他任何應用程序更頻繁地出現:
- 識別不同的用戶/客戶群(例如預測流失,生命周期價值,產品偏好)
- 準確地檢測和提取不同類別的反饋(正面和負面評論/意見,提及特定屬性,如服裝尺碼/合身……)
- 根據意圖對文本進行分類(例如請求基本幫助,緊急問題)
雖然許多NLP論文和教程存在於網上,但我們發現很難找到有關如何從頭開始有效解決這些問題的指南和技巧。
本文如何提供幫助
在每年領導數百個項目並獲得美國各地頂級團隊的建議之後,我們寫了這篇文章來解釋如何構建機器學習解決方案來解決上面提到的問題。我們將從最簡單的方法開始,然後轉向更細微的解決方案,例如特徵工程,單詞向量和深度學習。
閱讀本文後,您將了解如何:
- 收集,準備和檢查數據
- 構建簡單的模型,並在必要時過渡到深度學習
- 解釋和理解您的模型,以確保您實際捕獲信息而不是噪音
我們把這篇文章寫成了一步一步的指南; 它還可以作為高效標準方法的高級概述。
這篇文章附有一個互動筆記本,演示和應用所有這些技術。隨意運行代碼並繼續!
第1步:收集您的數據
示例數據源
每個機器學習問題都從數據開始,例如電子郵件,帖子或推文列表。常見的文字信息來源包括:
- 產品評論(在亞馬遜,Yelp和各種應用商店)
- 用戶生成的內容(推文,Facebook帖子,StackOverflow問題)
- 故障排除(客戶請求,支持服務單,聊天記錄)
「社交媒體災難」數據集
對於這篇文章,我們將使用圖8中慷慨提供的數據集,稱為「社交媒體上的災難」,其中:
貢獻者查看了超過10,000條推文,其中包括「點燃」,「隔離」和「混亂」等各種搜索,然後注意到推文是否涉及災難事件(而不是與單詞或電影評論相關的笑話或一些非災難性的事情)。
我們的任務是檢測哪些推文是關於災難性事件的,而不是像電影那樣無關緊要的話題。為什麼?一個潛在的應用是完全通知執法官員緊急緊急情況,同時忽略對最近的Adam Sandler電影的評論。這項任務的一個特殊挑戰是兩個類都包含用於查找推文的相同搜索詞,因此我們必須使用微妙的差異來區分它們。
在本文的其餘部分,我們將把關於災難的推文稱為「 災難 」,並將有關其他任何內容的推文稱為「 無關緊要 」。
標籤
我們已經標記了數據,因此我們知道哪些推文屬於哪些類別。正如Richard Socher在下面概述的那樣,通常更快,更簡單,更便宜地找到並標記足夠的數據來訓練模型,而不是試圖優化複雜的無監督方法。
![Richard Socher的專業提示](https://easyai.tech/wp-content/uploads/2022/08/c500e-2019-07-19-004424.jpg)
第2步:清理數據
我們遵循的首要規則是:「您的模型將永遠與您的數據一樣好。」
數據科學家的關鍵技能之一是了解下一步是應該對模型還是數據進行處理。一個好的經驗法則是首先查看數據然後進行清理。一個乾淨的數據集將允許模型學習有意義的功能,而不是過度匹配無關的噪音。
以下是用於清理數據的清單:( 有關詳細信息,請參閱代碼):
- 刪除所有不相關的字符,例如任何非字母數字字符
- 令牌化通過將其分割成單個的單詞文本
- 刪除不相關的單詞,例如「@」twitter提及或網址
- 將所有字符轉換為小寫,以便將諸如「hello」,「Hello」和「HELLO」之類的單詞視為相同
- 考慮將拼寫錯誤或交替拼寫的單詞組合成單個表示(例如「cool」/「kewl」/「cooool」)
- 考慮詞形還原(將諸如「am」,「are」和「is」之類的詞語簡化為諸如「be」之類的常見形式)
按照這些步驟並檢查其他錯誤後,我們可以開始使用乾淨的標記數據來訓練模型!
第3步:找到一個好的數據表示
機器學習模型將數值作為輸入。例如,處理圖像的模型採用表示每個顏色通道中每個像素的強度的矩陣。
![一個微笑的臉表示為數字矩陣。](https://easyai.tech/wp-content/uploads/2022/08/4221e-2019-07-19-004447.jpg)
我們的數據集是一個句子列表,所以為了讓我們的算法從數據中提取模式,我們首先需要找到一種方法來表示我們的算法可以理解的方式,即作為數字列表。
單熱編碼(Bag of Words)
表示計算機文本的一種自然方式是將每個字符單獨編碼為數字(例如ASCII)。如果我們將這個簡單的表示提供給分類器,則必須僅根據我們的數據從頭學習單詞的結構,這對於大多數數據集是不可能的。我們需要使用更高級別的方法。
例如,我們可以構建數據集中所有唯一單詞的詞彙表,並將唯一索引與詞彙表中的每個單詞相關聯。然後將每個句子表示為與我們詞彙表中不同單詞的數量一樣長的列表。在此列表中的每個索引處,我們標記給定單詞在句子中出現的次數。這被稱為Bag of Words模型,因為它是一種完全忽略句子中單詞順序的表示。這如下圖所示。
![將句子表示為一袋詞。左邊的句子,右邊的表示。向量中的每個索引代表一個特定的單詞。](https://easyai.tech/wp-content/uploads/2022/08/1e67c-2019-07-19-004459.jpg)
可視化嵌入
我們在「社交媒體災難」示例中的詞彙量大約有20,000個單詞,這意味着每個句子都將表示為長度為20,000的向量。向量將主要包含0,因為每個句子只包含我們詞彙表的一小部分。
為了查看我們的嵌入是否正在捕獲與我們的問題相關的信息(即推文是否與災難有關),最好將它們可視化並查看類看起來是否分離得很好。由於詞彙表通常非常大,並且不可能以20,000維度可視化數據,因此像PCA這樣的技術將有助於將數據投影到二維。這個繪製如下。
![可視化詞袋嵌入。](https://easyai.tech/wp-content/uploads/2022/08/27543-2019-07-19-004520.jpg)
這兩個類看起來分離不是很好,這可能是我們嵌入的一個特徵,或者僅僅是我們降維的一個特徵。為了查看Bag of Words功能是否有用,我們可以根據它們訓練分類器。
第4步:分類
當第一個接近問題時,一般的最佳做法是從可以解決工作的最簡單的工具開始。無論何時對數據進行分類,其多功能性和可解釋性的共同點都是Logistic回歸。訓練非常簡單,結果可以解釋,因為您可以輕鬆地從模型中提取最重要的係數。
我們將數據分成一個訓練集,用於擬合我們的模型和一個測試集,以查看它對未見數據的概括性。經過培訓,我們得到75.4%的準確率。不是太寒酸!猜測最頻繁的課程(「不相關」)將只給我們57%。然而,即使75%的精度足以滿足我們的需求,我們也絕不應該在不試圖了解它的情況下運送模型。
第五步:檢查
混亂矩陣
第一步是了解我們的模型所犯的錯誤類型,以及哪種錯誤是最不可取的。在我們的示例中,誤報將不相關的推文分類為災難,而誤報則將災難歸類為不相關的推文。如果優先考慮對每個潛在事件作出反應,我們會希望降低我們的漏報。但是,如果我們在資源方面受到限制,我們可能會優先考慮較低的誤報率以減少誤報。可視化此信息的一種好方法是使用混淆矩陣,該矩陣將我們的模型預測與真實標籤進行比較。理想情況下,矩陣將是從左上角到右下角的對角線(我們的預測完全匹配真相)。
![混淆矩陣(綠色比例高,藍色低)](https://easyai.tech/wp-content/uploads/2022/08/5d0b8-2019-07-19-004537.jpg)
我們的分類器比假陽性(按比例)產生更多的假陰性。換句話說,我們模型最常見的錯誤是將災難分類為不相關。如果誤報代表了執法的高成本,那麼這對我們的分類者來說可能是一個很好的偏見。
解釋和解釋我們的模型
為了驗證我們的模型並解釋其預測,重要的是要查看它用於做出決策的單詞。如果我們的數據有偏差,我們的分類器將對樣本數據做出準確的預測,但該模型在現實世界中不會很好地概括。在這裡,我們為災難和無關的課程繪製最重要的單詞。使用Bag of Words和Logistic回歸繪製單詞重要性很簡單,因為我們可以提取和排列模型用於預測的係數。
![袋子詞:詞重要性](https://easyai.tech/wp-content/uploads/2022/08/e39b2-2019-07-19-004551.jpg)
我們的分類器正確地採用了一些模式(廣島,大屠殺),但顯然在某些無意義的術語上過度擬合(heyoo,x1392)。現在,我們的Bag of Words模型正在處理不同單詞的巨大詞彙並平等對待所有單詞。然而,這些詞中的一些是非常頻繁的,並且只會對我們的預測產生噪音。接下來,我們將嘗試一種方法來表示可以解釋單詞頻率的句子,看看我們是否可以從我們的數據中獲取更多信號。
第六步:考慮詞彙結構
TF-IDF
為了幫助我們的模型更多地關注有意義的單詞,我們可以在我們的Bag of Words模型之上使用TF-IDF分數(Term Frequency,Inverse Document Frequency)。TF-IDF根據它們在我們的數據集中的稀有程度對單詞進行加權,對過於頻繁的單詞進行折扣並僅添加噪聲。這是我們新嵌入的PCA投影。
![可視化TF-IDF嵌入。](https://easyai.tech/wp-content/uploads/2022/08/ecb02-2019-07-19-004608.jpg)
我們可以看到上面兩種顏色之間有更明確的區別。這應該使我們的分類器更容易分離兩個組。讓我們看看這是否會帶來更好的性能。在我們的新嵌入體上訓練另一個Logistic回歸,我們得到76.2%的準確度。
一點點改進。我們的模型是否開始接受更重要的詞彙?如果我們在防止我們的模型「作弊」的同時獲得更好的結果,那麼我們可以真正認為這個模型是升級。
![TF-IDF:單詞重要性](https://easyai.tech/wp-content/uploads/2022/08/558b8-2019-07-19-004623.jpg)
它所拾取的單詞看起來更相關!雖然我們的測試集上的指標僅略有增加,但我們對模型使用的術語更有信心,因此在將與客戶交互的系統中部署它時會感覺更舒服。
第7步:利用語義
Word2Vec
我們的最新型號設法獲得高信號詞。但是,如果我們部署此模型,我們很可能會遇到以前在訓練集中沒有看到過的單詞。即使在培訓期間看到非常相似的單詞,之前的模型也無法準確地對這些推文進行分類。
為了解決這個問題,我們需要捕捉詞語的語義,這意味着我們需要理解像「好」和「積極」這樣的詞比「杏」和「大陸」更接近。我們將用來幫助我們捕獲意義的工具稱為Word2Vec。
使用預先訓練過的單詞
Word2Vec是一種查找單詞連續嵌入的技術。它通過閱讀大量文本並記住哪些詞語傾向於出現在類似的語境中來學習。在對足夠的數據進行訓練之後,它為詞彙表中的每個單詞生成300維向量,其中具有相似含義的單詞彼此更接近。
該報告的作者論文開源了一個非常大的語料庫,我們可以利用到包括語義一些知識轉化成我們的模型這是預先訓練的典範。可以在與此帖相關聯的存儲庫中找到預先訓練的向量。
句子級別表示
為我們的分類器設置句子嵌入的快速方法是平均句子中所有單詞的Word2Vec分數。這是一個像之前一樣的Bag of Words方法,但這次我們只丟失了句子的語法,同時保留了一些語義信息。
![Word2Vec句子嵌入](https://easyai.tech/wp-content/uploads/2022/08/a218b-2019-07-19-004640.jpg)
以下是使用以前技術的新嵌入的可視化:
![可視化Word2Vec嵌入。](https://easyai.tech/wp-content/uploads/2022/08/46f3d-2019-07-19-004653.jpg)
這兩組顏色看起來更加分離,我們的新嵌入應該有助於我們的分類器找到兩個類之間的分離。在第三次訓練相同模型(Logistic回歸)後,我們得到77.7%的準確度得分,我們的最佳結果呢!是時候檢查我們的模型了。
複雜性/可解釋性權衡
由於我們的嵌入不像我們之前的模型那樣表示為每個單詞一維的向量,因此很難看出哪些單詞與我們的分類最相關。雖然我們仍然可以訪問Logistic回歸的係數,但它們與嵌入的300維有關,而不是單詞的索引。
對於如此低的準確度增益,失去所有可解釋性似乎是一種嚴厲的權衡。但是,對於更複雜的模型,我們可以利用LIME等黑盒解釋器,以便深入了解分類器的工作原理。
酸橙
LIME 可通過開源軟件包在Github上獲得。黑盒解釋器允許用戶通過擾亂輸入(在我們的情況下從句子中刪除單詞)並查看預測如何變化來解釋任何分類器在一個特定示例上的決定。
讓我們看一下我們數據集中句子的幾個解釋。
![挑選正確的災難詞語以歸類為「相關」。](https://easyai.tech/wp-content/uploads/2022/08/2d684-2019-07-19-004723.jpg)
![在這裡,單詞對分類的貢獻似乎不太明顯。](https://easyai.tech/wp-content/uploads/2022/08/19b28-2019-07-19-004736.jpg)
但是,我們沒有時間探索數據集中的數千個示例。我們要做的是在有代表性的測試用例樣本上運行LIME,看看哪些詞會繼續成為強大的貢獻者。使用這種方法,我們可以像以前的模型一樣獲得單詞重要性分數,並驗證模型的預測。
![Word2Vec:單詞重要性](https://easyai.tech/wp-content/uploads/2022/08/a6716-2019-07-19-004752.jpg)
看起來該模型選擇了高度相關的詞語,暗示它似乎做出了可以理解的決定。這些似乎是以前所有型號中最相關的詞,因此我們更願意部署到生產中。
步驟8:使用端到端方法利用語法
我們已經介紹了生成緊湊句嵌入的快速有效方法。但是,通過省略單詞的順序,我們將丟棄句子的所有句法信息。如果這些方法不能提供足夠的結果,您可以使用更複雜的模型,將整個句子作為輸入並預測標籤,而無需構建中間表示。要做到這一點的常用方法是把一個句子中的單詞矢量序列使用或者Word2Vec或更近的方法,比如手套或山凹。這是我們將在下面做的。
![高效的端到端架構(源代碼)](https://easyai.tech/wp-content/uploads/2022/08/cafcf-2019-07-19-004809.jpg)
用於句子分類的卷積神經網絡訓練非常快,並且作為入門級深度學習架構運行良好。雖然卷積神經網絡(CNN)主要以其在圖像數據上的性能而聞名,但它們在文本相關任務上提供了出色的結果,並且通常比大多數複雜的NLP方法(例如LSTM和編碼器/解碼器架構)更快地進行訓練。該模型保留了單詞的順序,並學習了有關哪些單詞序列可以預測目標類的有價值信息。與之前的型號相反,它可以區分「Alex吃植物」和「植物吃Alex」之間的區別。
訓練此模型並不需要比以前的方法更多的工作(詳見代碼),並為我們提供了比以前更好的模型,準確率達到79.5%!與上述模型一樣,下一步應該是使用我們描述的方法探索和解釋預測,以驗證它確實是部署到用戶的最佳模型。到現在為止,您應該自己解決這個問題。
最後總結
以下是我們成功使用的方法的簡要回顧:
- 從快速簡單的模型開始
- 解釋它的預測
- 了解它正在犯的錯誤
- 使用該知識為下一步提供信息,無論是對您的數據還是更複雜的模型。
這些方法適用於特定的示例案例,使用了為理解和利用短文本(如推文)而量身定製的模型,但這些思想廣泛適用於各種問題。我希望這對你有幫助,我們很樂意聽到你的意見和問題!歡迎在下面發表評論,或者在這裡或Twitter上聯繫@EmmanuelAmeisen。
本文轉自Insight,原文地址
Comments