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

2021-01-08 雷鋒網

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

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

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

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

文本數據無處不在

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

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

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

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

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

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

本文如何提供幫助

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

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

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

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

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

第一步:收集你的數據

數據源樣例

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

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

在這篇文章中,我們將使用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 聯繫我們!

博客原址

https://blog.insightdatascience.com/how-to-solve-90-of-nlp-problems-a-step-by-step-guide-fda605278e4e

更多文章,關注雷鋒網

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

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

雷鋒網雷鋒網(公眾號:雷鋒網)

雷鋒網原創文章,未經授權禁止轉載。詳情見轉載須知。

相關焦點

  • 金融領域中的自然語言處理,弄懂這五個問題就夠了
    計算機非常擅長使用結構化數據,因此針對大量的數據和表格的處理,它都信手拈來。但是對於人類來說,我們是以非結構化的文字等信息進行交流的。計算機並不擅長處理這些非結構化數據,因此如何讓計算機理解人類的語言,一直以來是一大難題。
  • 自然語言處理的最佳實踐
    雷鋒網 AI 開發者按,近年來,自然語言處理(NLP)在質量和可用性方面快速增長,這有助於推動人工智慧解決方案的實際落地。在過去的幾年裡,研究人員一直在將新的深度學習方法應用於 NLP。數據科學家開始從傳統的方法轉向最先進的(SOTA)深度神經網絡(DNN)算法,這種算法使用的語言模型經過了大文本語料庫的預訓練。
  • 科普自然語言處理
    例如,漢語、英語、日語為自然語言的例子,這一種用法可見於自然語言處理一詞中。自然語言是人類交流和思維的主要工具。以上是百度百科對自然語言的釋義。語言是信息的載體,如同數字、文字、圖像、視頻等一樣,它們的目的都是為了記錄和傳播信息。
  • 自然語言處理的經驗主義和理性主義
    美國計算機科學家馬納瑞斯(Bill Manaris)在1999年出版的《計算機進展》(Advanced in Computers)第47卷的《從人機互動的角度看自然語言處理》一文中給自然語言處理提出的如下定義:「自然語言處理可以定義為研究在人與人交際中以及在人與計算機交際中的語言問題的一門學科。
  • 自然語言處理必讀:5本平衡理論與實踐的書籍
    為了幫助你解決問題,我幫你選擇5本關於自然語言處理的書,不像其他的書單,除了第一本之外,這些書都不是免費的,但事實證明它們是值得投資的,希望能對大家有所幫助。本書適合所有人,無論以前的編程經驗如何,只要你想學如何編程並分析書面語言,就可以讀它。」如上所述,這本書絕對實用。雖然你肯定會在進行過程中得到概念解釋,但毫無疑問,這本書的確是為那些希望用Python實現NLP解決方案的人而設計的。
  • 實踐入門NLP:基於深度學習的自然語言處理
    特別是最近兩年,基於深度學習的自然語言處理逐漸取得了一定進展,在人機對話、問答系統、語言翻譯等方向的應用也一直是自然語言處理中的熱門話題,而這些應用的實現,基本依賴於底層技術和模型的進步,再加上自然語言處理領域也算是一個多學科交叉的行業,自然語言處理的未來發展對於很多相關學科和方向都具有深遠的影響力。
  • 自然語言處理(NLP)中的深度學習發展史和待解難題
    王小新 編譯自 sigmoidal量子位 出品 | 公眾號 QbitAI自然語言處理(NLP)是指機器理解並解釋人類寫作與說話方式的能力。近年來,深度學習技術在自然語言處理方面的研究和應用也取得了顯著的成果。技術博客Sigmoidal最近發布了一篇文章,作者是機器學習工程師Rafal。
  • 復旦大學黃萱菁:自然語言處理中的表示學習
    復旦大學黃萱菁帶來報告《自然語言處理中的表示學習》。黃萱菁,復旦大學計算機科學技術學院教授、博士生導師。1998年於復旦大學獲計算機理學博士學位,研究領域為人工智慧、自然語言處理、信息檢索和社會媒體分析。兼任中國中文信息學會常務理事,社會媒體專委會副主任,中國計算機學會中文信息技術專委會副主任。
  • AI閱卷「翻車」 其實是「翻」在了自然語言處理
    AI閱卷系統則涉及到對語言文字的評判,涵蓋很多方面,如語法、語義等,會大量運用到自然語言處理技術。「自然語言處理技術是人工智慧的一個重要分支,研究利用計算機對自然語言進行智能化處理,基礎的自然語言處理技術主要圍繞語言的不同層級展開,包括音位(語言的發音模式)、形態(字、字母如何構成單詞、單詞的形態變化)、詞彙(單詞之間的關係)、句法(單詞如何形成句子)、語義(語言表述對應的意思)、語用(不同語境中的語義解釋)、篇章(句子如何組合成段落)7個層級。」
  • CNCC 2019 | 劉群:基於深度學習的自然語言處理,邊界在哪裡?
    那麼它所能起作用的邊界在哪裡呢?對此問題,我們應當深思。近日,在北京語言大學舉辦的第四屆語言與智能高峰論壇上,華為諾亞方舟實驗室語音語義首席科學家劉群教授高屋建瓴,細緻分析了深度學習時代NLP的已知與未知。他從自然語言處理基於規則、統計到深度學習的範式遷移出發,探討了深度學習方法解決了自然語言處理的哪些問題以及尚未解決哪些問題。
  • 中國的自然語言處理領域的人工智慧公司
    自然語言處理的英文是Natural Language Processing,一般被簡寫為NLP,它實際上包括了三個方面:語音識別、自然語言理解與語音合成(有一些人把語音識別作為自然語言處理之外的技術,在本文中,我們將語音識別也包含在自然語言處理的技術範疇之內)。
  • 一文讀懂Smartbi的自然語言處理(NLP)技術
    02自然語言處理的發展趨勢 目前,人們主要通過兩種思路來進行自然語言處理,一種是基於規則的理性主義,另外一種是基於統計的經驗主義。理性主義方法認為,人類語言主要是由語言規則來產生和描述的,因此只要能夠用適當的形式將人類語言規則表示出來,就能夠理解人類語言,並實現語言之間的翻譯等各種NLP任務。而經驗主義方法則認為,從語言數據中獲取語言統計知識,有效建立語言的統計模型。因此只要能夠有足夠多的用於統計的語言數據,就能夠理解人類語言。然而,當面對現實世界充滿模糊與不確定性時,這兩種方法都面臨著各自無法解決的問題。
  • 自然語言處理深度學習的7個應用
    原文:7 Applications of Deep Learning for Natural Language Processing作者:Jason Brownlee翻譯:無阻我飛揚摘要:在這篇文章中,作者詳細介紹了自然語言處理深度學習的7種應用,以下是譯文。自然語言處理領域正在從統計方法轉變為神經網絡方法。
  • AI自然語言處理(NLP)領域常用的16個術語
    1.自然語言處理(NLP)自然語言處理,簡單來說就是構建人與機器之間溝通的橋梁,以實現人機交流的目的。自然語言處理有兩大核心任務:自然語言理解(NLU)與自然語言生成(NLG)。Encoder-Decoder很好的詮釋了機器學習的核心思路:將現實問題轉化為數學問題,通過求解數學問題,從而解決現實問題。Seq2Seq(是Sequence-to-Sequence的縮寫),字面含義為:輸入一個序列,輸出另一個序列。這種結構最重要的地方在於輸入序列和輸出序列的長度是可變的。
  • 什麼是自然語言處理?它為什麼比計算機視覺更重要?
    自然語言是指中文、英語、西班牙語、法語、德語等等語言,作為人們日常使用的其他語言,它們對人類的交流有著重要作用。自然語言是隨著人類社會的發展而自然產生的語言,而不是由人類所特意創造的語言。自然語言是人們日常學習生活的重要工具和媒介,如果人類失去交流的能力,文明就失去了意義。
  • 復旦大學陳俊坤:自然語言處理中的多任務學習 | AI 研習社職播間第...
    我所在的研究組主要聚焦於深度學習和自然語言處理領域,包括語言表示學習、詞法/句法分析、文本推理、問答系統等方面,指導老師是邱錫鵬副教授,近幾年來,我們發表國際頂級會議/期刊 50 餘篇,還獲得了 ACL 2017 傑出論文;在 SQUAD 2.0 上獲得第二的成績,並在 SQUAD 1.1 上多次獲得第一;另外我們也開發開源自然語言處理系統,希望能幫助大眾解決更多問題,其中包括 FudanNLP(國內最早的開源
  • 科普丨什麼是NLP(自然語言處理)
    自然語言處理(NLP)是一種專業分析人類語言的人工智慧。(下文皆簡稱為「NLP」),它的工作原理是這樣的:接收自然語言,這種語言是通過人類的自然使用演變而來的,我們每天都用它來交流轉譯自然語言,通常是通過基於概率的算法分析自然語言並輸出結果
  • 想攻克自然語言處理?你需要這個武器
    但是,僅僅是到這一步,自然語言處理也已經走過了數不清的年頭,耗費了無數科學家的心血,未來更是大大的可期。▌此處是科普自然語言處理(NLP)是計算機科學領域和人工智慧領域的一個分支,是計算機科學、語言學和機器學習的交叉點,它關注計算機與人類之間使用自然語言的交流與溝通。
  • 用於自然語言處理的4個業務應用
    至頂網CIO與應用頻道 12月18日 編譯:你可能還沒有意識到,自然語言處理(NLP)對於企業來說已經不僅僅是一種新興的技術,它還是一種每天都在廣泛使用的技術。在線搜索、拼寫檢查——機會所有涉及語言的功能都包含自然語言處理算法。自然語言處理算法會教導計算機像人一樣使用語言。如果你從一組文檔中手動搜索信息的話,你可以查看關鍵字,就像是搜尋引擎一樣。
  • 人工智慧難點之——自然語言處理(NLP)
    (人工智慧主要包含以下幾個方面: 自動推理-計算語言學-計算機視覺-進化計算-專家系統-自然語言處理-機器人學)自然語言處理(NLP)是資訊時代最重要的技術之一。理解複雜的語言也是人工智慧的重要組成部分。NLP的應用無處不在,因為人們用語言進行大部分溝通:網絡搜索,廣告,電子郵件,客戶服務,語言翻譯,發布學報告等等。