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