當前位置:
首頁 > 新聞 > 如何解決自然語言處理中90%的問題

如何解決自然語言處理中90%的問題

本文為雷鋒字幕組編譯的技術博客,原標題How to solve 90% of NLP problems: a step-by-step guide,作者Emmanuel Ameisen。

翻譯 | 於澤平    整理 |  凡江   編輯 |  吳璇

如何將這五個W和H開頭的詞應用在文本數據中?

想要了解更多類似的內容,請在Twitter上關注Insight和Emmanuel。

文本數據無處不在

無論你是已成立的公司還是致力於推出新服務,你都可以使用文本數據驗證、提升和擴展產品的性能與功能。學習並提取文本數據中的意義,這一科學是自然語言處理(NLP)中的一個活躍的研究課題。

NLP是一個非常龐大的領域,每天都會產生新的令人興奮的結果。然而,Insight團隊與數百家公司合作之後,發現一下幾個關鍵的實用的應用,在實際中使用的頻率比其它應用高得多。

識別不同的用戶/客戶群體(例如預測客戶流失,生命周期,產品偏好)

準確地檢測並提取不同類別的反饋(正面或負面的評論/意見,特定屬性的評論,例如衣服尺寸/合身)

根據意圖對文本進行分類(例如請求基本幫助,緊急的問題)

儘管網上有許多NLP的論文和教程,但我們發現很難找到,如何從頭開始學習高效處理這些問題的指導與技巧。

本文如何提供幫助

我們每年領導數百個項目,從美國的頂尖團隊獲得建議後,我們寫下這篇文章來解釋如何構建機器學習的方案解決上述問題。我們將從最簡單的方法開始,然後轉向更細緻的解決方案,比如特徵工程,詞向量和深度學習。

讀完這篇文章,你將學會如何:

收集、準備並檢查數據

建立簡單的模型,並在必要時轉化為深度學習

解釋並理解你的模型,確保你獲取到的是信息而不是雜訊

我們寫這篇文章是作為一個逐步的指南,它也可以作為高效的標準方法的一個高級概述。

這篇文章中包含一個互動式的notebook,用來演示和應用這些所有的技術。

隨意運行代碼,並一步一步跟上吧!

第一步:收集你的數據

數據源樣例

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

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

用戶生成的內容(Tweet和Facebook的帖子, StackOverflow 的問題 )

疑難解答(客戶的請求,服務記錄,聊天記錄)

「社交媒體上的災難」數據集

在這篇文章中,我們將使用CrowdFlower提供的數據集,叫作「社交媒體上的災難」。

貢獻者查看了超過10000條tweet內容,做了各種各樣的搜索,如「著火」,「隔離」和「混亂」,然後標記這些tweet是否對應到一個災難事件(而不是一個玩笑或是影評等無災難性的語句)

我們的任務是檢測哪些tweet是關於災難事件的,而不是像電影這樣的無關的話題。為什麼要這樣做呢?一個潛在的應用是只把關於緊急事件的tweet通知給執法人員,而忽略掉最近的電影Adam Sandler的評論。這個任務一個特殊挑戰是這兩類推文都包含同樣的搜索關鍵詞,因此我們需要使用更細緻的差異來區分它們。

在本文此後的敘述中,我們將關於災難的tweet稱為「災難」,把其它的tweet成為「無關」。

標籤

我們對數據作了標記,因此我們知道哪些tweet屬於哪種類別。正如Richard Socher在下面概述的一樣: 與試圖優化複雜的無監督方法相比,找到並標記足夠數據從而把模型訓練起來通常更快,更簡單也更便宜。

第二步:清理數據

我們遵從的首要規則是:你的模型優劣取決於你的數據。

數據科學家的關鍵技能之一就是知道下一步應該專註於提升模型效果還是處理數據。一個好的經驗法則是先查看數據然後清理它。一個乾淨的數據集將使模型學習到有意義的特徵,而不是在無關的噪音上過擬合。

下面是一個清單,用來清理你的數據(更多細節見代碼):

刪除所有不相關的字元,如不是字母和數字的字元

將文本切分成獨立的單詞進行標記

移除不相關的詞,例如twitter中的「@」或者是網址

將所有字母轉為小寫,以便於將「hello」,「Hello」和「HELLO」統一對待

考慮將拼寫錯誤或是有多種拼寫方法的單詞用同一中表示方法表示(例如「cool」/"kewl"/「cooool」)

考慮詞形還原(例如將類似"am","are","is"的詞語統一縮寫為「be」)

在按照這個清單逐步檢查之後,我們就可以開始使用清潔之後的,已經標註好的數據開始訓練模型了!

第三步:找到一個好的表示數據的方式

機器學習模型將數值作為輸入。例如,用於圖像處理的模型將每個顏色通道中每個像素的強度矩陣作為輸入。

一個數字矩陣,它表現出一副笑臉的樣子

我們的數據集是句子的列表,為了讓我們的演算法從數據中提取特徵,我們首先需要找到一種表達方法,使我們的演算法可以理解,即用數字列表來表示。

one-hot編碼(詞袋)

為了讓計算機理解,一種自然的文本表達方式是將每個字元編碼成一個單獨的數字(例如ASCII碼)。如果我們把這種表達方式餵給分類器的話,它就需要從頭開始,僅僅根據我們的數據學習出單詞的結構,這對大多數數據集都是不可能的。我們需要使用更高級的方法。

例如,我們可以根據我們的數據集創建一個包含所有單詞的辭彙表,並使用唯一的索引與辭彙表中的每個單詞相連。每個句子都被表示成一個與辭彙表中單詞數量一樣長的列表。在這個列表中的每個索引出,我們標記對應單詞在句子中出現的次數。這種方法被稱為詞袋模型,因為這種表示方法完全忽視了句子中的詞語順序。如下所示。

使用詞袋錶示句子。句子在左邊,右邊是句子的表示向量。向量中的每個索引代表一個特定的詞。

向量可視化

在「社交媒體的災難」這個例子中,我們辭彙表中有大約20000個辭彙,這意味著每個句子都被表示成長度為20000的向量。這個向量包含的大部分都是0,因為每個句子只包含辭彙表中很少的單詞子集。

為了了解我們的表示向量是否捕獲到與我們的問題相關的信息(即tweet與災難是否相關),將它們可視化並是一種好方法,可以查看這些類是否看起來可以很好地分離。因為辭彙表通常很大,將20000維的數據可視化是不可能的,PCA等技術可以幫助我們把數據降至2維。如下圖所示。

詞袋向量可視化

這兩類看起來沒有被很好地分開,可能是向量的特徵就是如此,也可能只是因為降維。為了看看詞袋特徵有沒有用,我們可以根據它們訓練一個分類器。

第四步:分類

第一次遇到問題時,通常最好的做法是從最簡單的工具開始解決問題。每當遇到分類問題時,一個大家普遍喜歡用的方法是邏輯回歸,因為它功能多,可解釋。訓練非常簡單,而且結果可以解釋,因為你可以很容易地提取模型中最重要的係數。

我們將數據分成訓練集和測試集。訓練集用來訓練我們的模型,測試集用來看看模型在看不見的數據上表現如何。訓練後,我們得到了75.4%的準確率,不是太爛!猜測頻率最高的類別(無關)只會達到57%的準確率。然而,即使75%的準確率已經足夠滿足我們的需求,我們也不應該不試圖理解這個模型就使用它。

第五步:檢查

混淆矩陣

第一步是了解模型的錯誤種類,以及哪些錯誤是我們無法接受的。在我們的例子中,誤報將無關的tweet分類為災難,而錯報將災難的tweet分類為無關。如果我們想要優先應對每一個潛在的災難事件,我們可能想要減少錯報率。如果受資源的限制,我們可能優先想要低的誤報率以減少錯誤警報。一個將這些信息可視化的好方法是使用混淆矩陣,將我們的模型預測的標籤與真實標籤比較。理想情況下,這個矩陣是從左上角到右下角的對角線(當我們的預測完美預測真實標籤時)。

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

我們的分類器產生的錯報比誤報(比例)多。換句話說,我們的模型更普遍的錯誤是將災難標記為無關。如果誤報的執法成本很高,這對於我們分類器來說可能是一個好的偏差。

解釋我們的模型

為了驗證我們的模型並解釋它的預測,很重要的是看看模型使用哪些單詞做預測。如果我們的數據有偏差,我們的分類器將在訓練集中做出準確預測,但可能在現實世界中無法很好地推廣。這裡我們將災難與無關兩類中最重要的單詞做成圖表。當使用詞袋模型和邏輯回歸時,將詞語重要性繪成圖表很簡單,因為我們只需要將模型用於預測的係數提取出來並將其排序。

詞袋的重要性

我們的分類器正確提取了一些詞語(如廣島,屠殺),但很明顯,在一些無意義的詞語中過擬合(如heyoo,x1392)。現在,我們的詞袋模型處理不同詞語的辭彙表,並將所有單詞同等對待。然而,其中某些詞語出現的頻率很高,對於我們的預測只是起到雜訊的作用。接下來,我們將嘗試一種考慮詞語頻率表示句子的方式,看看能否從我們的數據中提取更多的意義。

第六步:考慮詞語結構

TF-IDF

為了讓我們的模型專註於更有意義的單詞,我們可以在詞袋模型的基礎上使用TF-IDF分數(詞頻-逆文檔頻率)。TF-IDF通過詞語在數據集中出現的稀少程度決定詞語權重,減少出現頻率太多的詞語權重,因為它們可能只會帶來雜訊。這裡是使用PCA獲得的新向量。

TF-IDF向量可視化

我們從上圖中可以看到,兩種顏色間有一個更清晰的區別。這可以讓我們的分類器更容易地將兩類分開。讓我們看看它是否帶來了更好的表現。使用另一個邏輯回歸模型訓練我們的新向量,我們得到了76.2%的準確率。

只改進了一點點。我們的模型是否開始獲得更重要的單詞?如果我們在防止模型「作弊」的同時得到了一個更好的結果,我們可以考慮升級這個模型。

TF-IDF:詞語重要性

它獲得的詞語看起來相關性更強!即使我們在測試集的評價指標只是略微增加了一些,但我們對我們模型使用的詞語有了更多的自信,因此我們將其部署在與客戶的交互系統中會感覺更加舒服。

第七步:利用語義

Word2Vec

我們剛剛的模型嘗試獲取詞語的意義。然而,如果我們使用這個模型,我們很可能會遇到在訓練集中沒有看見過的詞語。即使在訓練過程中遇到很多相似的辭彙,之前的模型也無法將這些tweet準確分類。

為了解決這個問題,我們需要捕捉單詞的語義,意思是我們需要理解像「好」和「積極」的距離比「杏」和「大陸」的距離更近。我們使用的幫助我們捕捉語義的工具叫作Word2Vec。

使用預訓練的詞語

Word2Vec是為詞語尋找連續向量的工具。它通過閱讀大量的文本來學習,並記憶哪些詞語傾向於在相似的上下文中出現。在足夠數據中訓練後,它為辭彙表中的每一個單詞生成一個300維的向量,其中語義相似的詞語向量間的距離更近。

這篇論文的作者開源了一個使用巨大語料集預訓練的模型,我們可以利用它將語義知識納入我們的模型中。預訓練詞向量可以在這篇博客的相關存儲庫中找到。

句子層級向量表示

為我們的分類器快速獲得句向量的方法是對句子中的所有詞使用平均詞向量分數。這與以一樣,是一個詞袋的方法,但這一次我們只丟失了句子的語法信息,而保存了一些語義信息。

Word2Vec句向量

這是我們對用之前的技術獲得的新向量的可視化:

Word2Vec 向量可視化

這兩種顏色看起來更容易分離,我們的新向量應該可以幫助我們的分類器將兩類分開。在第三次用同樣的模型(邏輯回歸)訓練後,我們得到了一個77.7%的準確率,這是我們目前最好的結果!是時候檢查我們的模型了。

困惑度/可解釋的權衡

我們的向量不像之前的模型那樣將每一個單詞表示成一個一維的向量,因此更難看出哪些詞語對分類的相關性最強。雖然我們仍然可以使用邏輯回歸的係數,它們對應的是我們向量的300個維度,而不是詞語的索引。

對於如此低的準確率提升,失去所有的可解釋性看起來是一個不太好的權衡。然而,對於更複雜的模型,我們可以利用LIME等黑盒解釋器來解釋分類器的工作原理。

LIME

LIME可以通過Github上面開源的包得到。一個黑盒解釋器允許用戶擾動輸入(我們這種情況是移除句子中的詞語)並查看在預測中如何改變,通過這種方法在一個特例中解釋分類器的決定。

我們來看看我們的數據集中幾個句子的解釋。

正確的災難辭彙被分類為「相關」。

這裡,詞語對分類的貢獻看起來不太明顯。

但是我們沒有時間查看數據集中的數千個例子。我們能做的是在測試集中的代表樣例中運行LIME,並查看哪些單詞持續做很多的貢獻。使用這種方法我們可以得到像之前模型一樣的單詞重要性分數,並驗證模型的預測結果。

Word2Vec:詞語重要性

看起來模型可以獲取高度相關的辭彙,暗示它做出可以理解的決定。這些看起來是在之前的所有模型中最相關的辭彙,我們將它應用在產品中時感覺更舒服。

第八步:使用端到端方法利用語法

我們已經介紹了快速高效的獲得句向量的方法。然而,通過省略單詞的順序,我們放棄了句子所有的語法信息。如果這些方法無法提供足夠好的結果,你可以利用更多複雜的模型,將整個句子作為輸入並預測模型,而不需要建立中間的表示向量。一個普遍的方法是將句子作為詞向量的序列,可以通過Word2Vec或者最近的GloVe與CoVe等方法獲得詞向量。這是我們接下來要做的。

一個搞笑的端到端結構(源)

用於句子分類的卷積神經網路訓練十分迅速,並且作為入門級深度學習結構表現出色。雖然卷積神經網路(CNN)主要因其圖像處理中的表現而聞名,它們在文本相關人物中也取得了很好的結果,而且它們通常比大多數複雜的NLP方法(如LSTM和編碼器/解碼器結構)速度快得多。這個模型保留了單詞的順序,並學習到哪些詞語序列可以預測目標類別這些有價值的信息。與之前的模型相反,它可以分別「Alex吃植物」和「植物吃Alex」的區別。

訓練這個模型不需要比以前方法更多的工作(詳見代碼),並讓我們得到了比以前更好的模型,達到了79.5%的準確率!與上面的模型一樣,下一步我們應該使用我們講過的方法探索並解釋預測,以此驗證它的確是部署給用戶的最佳模型。現在,你應該可以自己處理這個問題。

最後的筆記

以下是對我們成功使用的方法的快速回顧

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

解釋它的預測

了解它正在犯的是哪種錯誤

使用這些知識決定下一步應該處理數據還是使用一個更複雜的模型

我們將這些方法應用在一個特例中,使用模型理解並利用諸如tweet的短文本。但這些思想在許多問題中都適用。我希望這對你有幫助,我們很樂意聽到你的意見和問題!你可以通過在下面評論或是在Twitter上@EmmanuelAmeisen聯繫我們!

博客原址

更多文章,關注雷鋒網

添加雷鋒字幕組微信號(leiphonefansub)為好友

備註「我要加入」,To be a  AI  Volunteer !

雷鋒網雷鋒網


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 雷鋒網 的精彩文章:

北汽聯合戴姆勒出資119億新建賓士生產基地
蘋果iCloud數據中心落地貴州 既為服務速度也為中國國情

TAG:雷鋒網 |