0
本文為雷鋒字幕組編譯的技術博客,原標題How to solve 90% of NLP problems: a step-by-step guide,作者Emmanuel Ameisen。
翻譯 | 于澤平 整理 | 凡江 編輯 | 吳璇
如何將這五個W和H開頭的詞應用在文本數(shù)據(jù)中?
想要了解更多類似的內(nèi)容,請在Twitter上關注Insight和Emmanuel。
文本數(shù)據(jù)無處不在
無論你是已成立的公司還是致力于推出新服務,你都可以使用文本數(shù)據(jù)驗證、提升和擴展產(chǎn)品的性能與功能。學習并提取文本數(shù)據(jù)中的意義,這一科學是自然語言處理(NLP)中的一個活躍的研究課題。
NLP是一個非常龐大的領域,每天都會產(chǎn)生新的令人興奮的結果。然而,Insight團隊與數(shù)百家公司合作之后,發(fā)現(xiàn)一下幾個關鍵的實用的應用,在實際中使用的頻率比其它應用高得多。
識別不同的用戶/客戶群體(例如預測客戶流失,生命周期,產(chǎn)品偏好)
準確地檢測并提取不同類別的反饋(正面或負面的評論/意見,特定屬性的評論,例如衣服尺寸/合身)
根據(jù)意圖對文本進行分類(例如請求基本幫助,緊急的問題)
盡管網(wǎng)上有許多NLP的論文和教程,但我們發(fā)現(xiàn)很難找到,如何從頭開始學習高效處理這些問題的指導與技巧。
本文如何提供幫助
我們每年領導數(shù)百個項目,從美國的頂尖團隊獲得建議后,我們寫下這篇文章來解釋如何構建機器學習的方案解決上述問題。我們將從最簡單的方法開始,然后轉(zhuǎn)向更細致的解決方案,比如特征工程,詞向量和深度學習。
讀完這篇文章,你將學會如何:
收集、準備并檢查數(shù)據(jù)
建立簡單的模型,并在必要時轉(zhuǎn)化為深度學習
解釋并理解你的模型,確保你獲取到的是信息而不是噪聲
我們寫這篇文章是作為一個逐步的指南,它也可以作為高效的標準方法的一個高級概述。
這篇文章中包含一個交互式的notebook,用來演示和應用這些所有的技術。
隨意運行代碼,并一步一步跟上吧!
第一步:收集你的數(shù)據(jù)
數(shù)據(jù)源樣例
每一個機器學習問題都始于數(shù)據(jù),例如電子郵件,帖子或推文。文本信息的常見來源包括:
產(chǎn)品評論(來自于亞馬遜,Yelp和各種應用商店)
用戶生成的內(nèi)容(Tweet和Facebook的帖子, StackOverflow 的問題 )
疑難解答(客戶的請求,服務記錄,聊天記錄)
“社交媒體上的災難”數(shù)據(jù)集
在這篇文章中,我們將使用CrowdFlower提供的數(shù)據(jù)集,叫作“社交媒體上的災難”。
貢獻者查看了超過10000條tweet內(nèi)容,做了各種各樣的搜索,如“著火”,“隔離”和“混亂”,然后標記這些tweet是否對應到一個災難事件(而不是一個玩笑或是影評等無災難性的語句)
我們的任務是檢測哪些tweet是關于災難事件的,而不是像電影這樣的無關的話題。為什么要這樣做呢?一個潛在的應用是只把關于緊急事件的tweet通知給執(zhí)法人員,而忽略掉最近的電影Adam Sandler的評論。這個任務一個特殊挑戰(zhàn)是這兩類推文都包含同樣的搜索關鍵詞,因此我們需要使用更細致的差異來區(qū)分它們。
在本文此后的敘述中,我們將關于災難的tweet稱為“災難”,把其它的tweet成為“無關”。
標簽
我們對數(shù)據(jù)作了標記,因此我們知道哪些tweet屬于哪種類別。正如Richard Socher在下面概述的一樣: 與試圖優(yōu)化復雜的無監(jiān)督方法相比,找到并標記足夠數(shù)據(jù)從而把模型訓練起來通常更快,更簡單也更便宜。
第二步:清理數(shù)據(jù)
我們遵從的首要規(guī)則是:你的模型優(yōu)劣取決于你的數(shù)據(jù)。
數(shù)據(jù)科學家的關鍵技能之一就是知道下一步應該專注于提升模型效果還是處理數(shù)據(jù)。一個好的經(jīng)驗法則是先查看數(shù)據(jù)然后清理它。一個干凈的數(shù)據(jù)集將使模型學習到有意義的特征,而不是在無關的噪音上過擬合。
下面是一個清單,用來清理你的數(shù)據(jù)(更多細節(jié)見代碼):
刪除所有不相關的字符,如不是字母和數(shù)字的字符
將文本切分成獨立的單詞進行標記
移除不相關的詞,例如twitter中的“@”或者是網(wǎng)址
將所有字母轉(zhuǎn)為小寫,以便于將“hello”,“Hello”和“HELLO”統(tǒng)一對待
考慮將拼寫錯誤或是有多種拼寫方法的單詞用同一中表示方法表示(例如“cool”/"kewl"/“cooool”)
考慮詞形還原(例如將類似"am","are","is"的詞語統(tǒng)一縮寫為“be”)
在按照這個清單逐步檢查之后,我們就可以開始使用清潔之后的,已經(jīng)標注好的數(shù)據(jù)開始訓練模型了!
第三步:找到一個好的表示數(shù)據(jù)的方式
機器學習模型將數(shù)值作為輸入。例如,用于圖像處理的模型將每個顏色通道中每個像素的強度矩陣作為輸入。
一個數(shù)字矩陣,它表現(xiàn)出一副笑臉的樣子
我們的數(shù)據(jù)集是句子的列表,為了讓我們的算法從數(shù)據(jù)中提取特征,我們首先需要找到一種表達方法,使我們的算法可以理解,即用數(shù)字列表來表示。
one-hot編碼(詞袋)
為了讓計算機理解,一種自然的文本表達方式是將每個字符編碼成一個單獨的數(shù)字(例如ASCII碼)。如果我們把這種表達方式喂給分類器的話,它就需要從頭開始,僅僅根據(jù)我們的數(shù)據(jù)學習出單詞的結構,這對大多數(shù)數(shù)據(jù)集都是不可能的。我們需要使用更高級的方法。
例如,我們可以根據(jù)我們的數(shù)據(jù)集創(chuàng)建一個包含所有單詞的詞匯表,并使用唯一的索引與詞匯表中的每個單詞相連。每個句子都被表示成一個與詞匯表中單詞數(shù)量一樣長的列表。在這個列表中的每個索引出,我們標記對應單詞在句子中出現(xiàn)的次數(shù)。這種方法被稱為詞袋模型,因為這種表示方法完全忽視了句子中的詞語順序。如下所示。
使用詞袋表示句子。句子在左邊,右邊是句子的表示向量。向量中的每個索引代表一個特定的詞。
向量可視化
在“社交媒體的災難”這個例子中,我們詞匯表中有大約20000個詞匯,這意味著每個句子都被表示成長度為20000的向量。這個向量包含的大部分都是0,因為每個句子只包含詞匯表中很少的單詞子集。
為了了解我們的表示向量是否捕獲到與我們的問題相關的信息(即tweet與災難是否相關),將它們可視化并是一種好方法,可以查看這些類是否看起來可以很好地分離。因為詞匯表通常很大,將20000維的數(shù)據(jù)可視化是不可能的,PCA等技術可以幫助我們把數(shù)據(jù)降至2維。如下圖所示。
詞袋向量可視化
這兩類看起來沒有被很好地分開,可能是向量的特征就是如此,也可能只是因為降維。為了看看詞袋特征有沒有用,我們可以根據(jù)它們訓練一個分類器。
第四步:分類
第一次遇到問題時,通常最好的做法是從最簡單的工具開始解決問題。每當遇到分類問題時,一個大家普遍喜歡用的方法是邏輯回歸,因為它功能多,可解釋。訓練非常簡單,而且結果可以解釋,因為你可以很容易地提取模型中最重要的系數(shù)。
我們將數(shù)據(jù)分成訓練集和測試集。訓練集用來訓練我們的模型,測試集用來看看模型在看不見的數(shù)據(jù)上表現(xiàn)如何。訓練后,我們得到了75.4%的準確率,不是太爛!猜測頻率最高的類別(無關)只會達到57%的準確率。然而,即使75%的準確率已經(jīng)足夠滿足我們的需求,我們也不應該不試圖理解這個模型就使用它。
第五步:檢查
混淆矩陣
第一步是了解模型的錯誤種類,以及哪些錯誤是我們無法接受的。在我們的例子中,誤報將無關的tweet分類為災難,而錯報將災難的tweet分類為無關。如果我們想要優(yōu)先應對每一個潛在的災難事件,我們可能想要減少錯報率。如果受資源的限制,我們可能優(yōu)先想要低的誤報率以減少錯誤警報。一個將這些信息可視化的好方法是使用混淆矩陣,將我們的模型預測的標簽與真實標簽比較。理想情況下,這個矩陣是從左上角到右下角的對角線(當我們的預測完美預測真實標簽時)。
混淆矩陣(綠色比例高,藍色比例低)
我們的分類器產(chǎn)生的錯報比誤報(比例)多。換句話說,我們的模型更普遍的錯誤是將災難標記為無關。如果誤報的執(zhí)法成本很高,這對于我們分類器來說可能是一個好的偏差。
解釋我們的模型
為了驗證我們的模型并解釋它的預測,很重要的是看看模型使用哪些單詞做預測。如果我們的數(shù)據(jù)有偏差,我們的分類器將在訓練集中做出準確預測,但可能在現(xiàn)實世界中無法很好地推廣。這里我們將災難與無關兩類中最重要的單詞做成圖表。當使用詞袋模型和邏輯回歸時,將詞語重要性繪成圖表很簡單,因為我們只需要將模型用于預測的系數(shù)提取出來并將其排序。
詞袋的重要性
我們的分類器正確提取了一些詞語(如廣島,屠殺),但很明顯,在一些無意義的詞語中過擬合(如heyoo,x1392)?,F(xiàn)在,我們的詞袋模型處理不同詞語的詞匯表,并將所有單詞同等對待。然而,其中某些詞語出現(xiàn)的頻率很高,對于我們的預測只是起到噪聲的作用。接下來,我們將嘗試一種考慮詞語頻率表示句子的方式,看看能否從我們的數(shù)據(jù)中提取更多的意義。
第六步:考慮詞語結構
TF-IDF
為了讓我們的模型專注于更有意義的單詞,我們可以在詞袋模型的基礎上使用TF-IDF分數(shù)(詞頻-逆文檔頻率)。TF-IDF通過詞語在數(shù)據(jù)集中出現(xiàn)的稀少程度決定詞語權重,減少出現(xiàn)頻率太多的詞語權重,因為它們可能只會帶來噪聲。這里是使用PCA獲得的新向量。
TF-IDF向量可視化
我們從上圖中可以看到,兩種顏色間有一個更清晰的區(qū)別。這可以讓我們的分類器更容易地將兩類分開。讓我們看看它是否帶來了更好的表現(xiàn)。使用另一個邏輯回歸模型訓練我們的新向量,我們得到了76.2%的準確率。
只改進了一點點。我們的模型是否開始獲得更重要的單詞?如果我們在防止模型“作弊”的同時得到了一個更好的結果,我們可以考慮升級這個模型。
TF-IDF:詞語重要性
它獲得的詞語看起來相關性更強!即使我們在測試集的評價指標只是略微增加了一些,但我們對我們模型使用的詞語有了更多的自信,因此我們將其部署在與客戶的交互系統(tǒng)中會感覺更加舒服。
第七步:利用語義
Word2Vec
我們剛剛的模型嘗試獲取詞語的意義。然而,如果我們使用這個模型,我們很可能會遇到在訓練集中沒有看見過的詞語。即使在訓練過程中遇到很多相似的詞匯,之前的模型也無法將這些tweet準確分類。
為了解決這個問題,我們需要捕捉單詞的語義,意思是我們需要理解像“好”和“積極”的距離比“杏”和“大陸”的距離更近。我們使用的幫助我們捕捉語義的工具叫作Word2Vec。
使用預訓練的詞語
Word2Vec是為詞語尋找連續(xù)向量的工具。它通過閱讀大量的文本來學習,并記憶哪些詞語傾向于在相似的上下文中出現(xiàn)。在足夠數(shù)據(jù)中訓練后,它為詞匯表中的每一個單詞生成一個300維的向量,其中語義相似的詞語向量間的距離更近。
這篇論文的作者開源了一個使用巨大語料集預訓練的模型,我們可以利用它將語義知識納入我們的模型中。預訓練詞向量可以在這篇博客的相關存儲庫中找到。
句子層級向量表示
為我們的分類器快速獲得句向量的方法是對句子中的所有詞使用平均詞向量分數(shù)。這與以一樣,是一個詞袋的方法,但這一次我們只丟失了句子的語法信息,而保存了一些語義信息。
Word2Vec句向量
這是我們對用之前的技術獲得的新向量的可視化:
Word2Vec 向量可視化
這兩種顏色看起來更容易分離,我們的新向量應該可以幫助我們的分類器將兩類分開。在第三次用同樣的模型(邏輯回歸)訓練后,我們得到了一個77.7%的準確率,這是我們目前最好的結果!是時候檢查我們的模型了。
困惑度/可解釋的權衡
我們的向量不像之前的模型那樣將每一個單詞表示成一個一維的向量,因此更難看出哪些詞語對分類的相關性最強。雖然我們?nèi)匀豢梢允褂眠壿嫽貧w的系數(shù),它們對應的是我們向量的300個維度,而不是詞語的索引。
對于如此低的準確率提升,失去所有的可解釋性看起來是一個不太好的權衡。然而,對于更復雜的模型,我們可以利用LIME等黑盒解釋器來解釋分類器的工作原理。
LIME
LIME可以通過Github上面開源的包得到。一個黑盒解釋器允許用戶擾動輸入(我們這種情況是移除句子中的詞語)并查看在預測中如何改變,通過這種方法在一個特例中解釋分類器的決定。
我們來看看我們的數(shù)據(jù)集中幾個句子的解釋。
正確的災難詞匯被分類為“相關”。
這里,詞語對分類的貢獻看起來不太明顯。
但是我們沒有時間查看數(shù)據(jù)集中的數(shù)千個例子。我們能做的是在測試集中的代表樣例中運行LIME,并查看哪些單詞持續(xù)做很多的貢獻。使用這種方法我們可以得到像之前模型一樣的單詞重要性分數(shù),并驗證模型的預測結果。
Word2Vec:詞語重要性
看起來模型可以獲取高度相關的詞匯,暗示它做出可以理解的決定。這些看起來是在之前的所有模型中最相關的詞匯,我們將它應用在產(chǎn)品中時感覺更舒服。
第八步:使用端到端方法利用語法
我們已經(jīng)介紹了快速高效的獲得句向量的方法。然而,通過省略單詞的順序,我們放棄了句子所有的語法信息。如果這些方法無法提供足夠好的結果,你可以利用更多復雜的模型,將整個句子作為輸入并預測模型,而不需要建立中間的表示向量。一個普遍的方法是將句子作為詞向量的序列,可以通過Word2Vec或者最近的GloVe與CoVe等方法獲得詞向量。這是我們接下來要做的。
一個搞笑的端到端結構(源)
用于句子分類的卷積神經(jīng)網(wǎng)絡訓練十分迅速,并且作為入門級深度學習結構表現(xiàn)出色。雖然卷積神經(jīng)網(wǎng)絡(CNN)主要因其圖像處理中的表現(xiàn)而聞名,它們在文本相關人物中也取得了很好的結果,而且它們通常比大多數(shù)復雜的NLP方法(如LSTM和編碼器/解碼器結構)速度快得多。這個模型保留了單詞的順序,并學習到哪些詞語序列可以預測目標類別這些有價值的信息。與之前的模型相反,它可以分別“Alex吃植物”和“植物吃Alex”的區(qū)別。
訓練這個模型不需要比以前方法更多的工作(詳見代碼),并讓我們得到了比以前更好的模型,達到了79.5%的準確率!與上面的模型一樣,下一步我們應該使用我們講過的方法探索并解釋預測,以此驗證它的確是部署給用戶的最佳模型?,F(xiàn)在,你應該可以自己處理這個問題。
最后的筆記
以下是對我們成功使用的方法的快速回顧
從一個簡單快速的模型開始
解釋它的預測
了解它正在犯的是哪種錯誤
使用這些知識決定下一步應該處理數(shù)據(jù)還是使用一個更復雜的模型
我們將這些方法應用在一個特例中,使用模型理解并利用諸如tweet的短文本。但這些思想在許多問題中都適用。我希望這對你有幫助,我們很樂意聽到你的意見和問題!你可以通過在下面評論或是在Twitter上@EmmanuelAmeisen 聯(lián)系我們!
博客原址
更多文章,關注雷鋒網(wǎng)
添加雷鋒字幕組微信號(leiphonefansub)為好友
備注「我要加入」,To be a AI Volunteer !
雷鋒網(wǎng)雷鋒網(wǎng)
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。