翻譯:Emmanuel Ameisen撰寫(xiě)的《如何解決90%的NLP問(wèn)題:分步指南》
http://t.cn/RQd3IGq
文本數(shù)據(jù)無(wú)處不在
無(wú)論您是一家老牌公司還是致力于推出一項(xiàng)新服務(wù),您都可以始終利用文本數(shù)據(jù)來(lái)驗(yàn)證,改善和擴(kuò)展產(chǎn)品的功能。從文本數(shù)據(jù)中提取含義和進(jìn)行學(xué)習(xí)的科學(xué)是被稱為自然語(yǔ)言處理(NLP)的研究活動(dòng)。
NLP每天都會(huì)產(chǎn)生令人興奮的新結(jié)果,并且是一個(gè)很大的領(lǐng)域。但是,與數(shù)百家公司合作之后,Insight團(tuán)隊(duì)發(fā)現(xiàn)一些關(guān)鍵的實(shí)際應(yīng)用比其他任何應(yīng)用都要頻繁出現(xiàn):
- 識(shí)別用戶/客戶的不同群組(例如預(yù)測(cè)客戶流失,生命周期價(jià)值,產(chǎn)品偏好),
- 準(zhǔn)確地檢測(cè)和提取不同類別的反饋(正面和負(fù)面評(píng)論/意見(jiàn),提及特定屬性,例如衣服尺寸/ )
- 根據(jù)意圖對(duì)文本進(jìn)行分類(例如,請(qǐng)求基本幫助,緊急問(wèn)題)
盡管在線上存在許多NLP論文和教程,但我們發(fā)現(xiàn)很難找到有關(guān)如何解決這些問(wèn)題的指南和技巧。
這篇文章可以提供哪些幫助
在每年領(lǐng)導(dǎo)數(shù)百個(gè)項(xiàng)目并獲得全美頂級(jí)團(tuán)隊(duì)的建議后,我們寫(xiě)了這篇文章來(lái)解釋如何構(gòu)建機(jī)器學(xué)習(xí)解決方案來(lái)解決上述問(wèn)題。我們將從最可行的最簡(jiǎn)單方法開(kāi)始,然后繼續(xù)介紹更細(xì)微的解決方案,例如特征工程,詞向量和深度學(xué)習(xí)。
通過(guò)這篇文章,你可以知道:
- 收集,準(zhǔn)備和檢查數(shù)據(jù)
- 建立簡(jiǎn)單的模型以開(kāi)始,并在必要時(shí)過(guò)渡到深度學(xué)習(xí)
- 解釋和理解您的模型,以確保您實(shí)際上捕獲的是信息而不是噪音
我們寫(xiě)這篇文章是一個(gè)循序漸進(jìn)的指南。它也可以作為高效標(biāo)準(zhǔn)方法的高級(jí)概述
這篇文章還附有一個(gè)交互式筆記本,展示并應(yīng)用了所有這些技術(shù)。隨意運(yùn)行代碼并繼續(xù)學(xué)習(xí)!
第一步:收集數(shù)據(jù)
數(shù)據(jù)源
每個(gè)機(jī)器學(xué)習(xí)問(wèn)題都始于數(shù)據(jù),例如電子郵件,帖子或推文列表。文本信息的常見(jiàn)來(lái)源包括:
- 產(chǎn)品評(píng)論(在Amazon,Yelp和各種App Store上)
- 用戶生成的內(nèi)容(推文,F(xiàn)acebook帖子,StackOverflow問(wèn)題)
- 故障排除(客戶請(qǐng)求,支持通知單,聊天記錄)
“社交媒體上的災(zāi)難”數(shù)據(jù)集
對(duì)于本文,我們將使用CrowdFlower提供的數(shù)據(jù)集,稱為“社交媒體上的災(zāi)難”,其中:
我們收集了10,000多個(gè)推文,這些推文通過(guò)各種搜索(例如“大火”,“隔離”和“ 騷動(dòng)”)被剔除,然后指出了該推文是否指的是災(zāi)難事件(與帶有單詞或電影評(píng)論的笑話或非災(zāi)難性的東西)。
我們的任務(wù)是檢測(cè)哪些推文是與災(zāi)難性事件有關(guān),而不是與不相關(guān)的主題(例如災(zāi)難電影)。為什么?一種潛在的應(yīng)用是專門將緊急情況通知執(zhí)法人員,而無(wú)視最新的亞當(dāng)·桑德勒災(zāi)難電影的評(píng)論。此任務(wù)面臨的一個(gè)特殊挑戰(zhàn)是,兩個(gè)類都包含用于查找推文的相同搜索詞,因此我們將不得不使用微妙的區(qū)別來(lái)區(qū)分它們。
在本文的其余部分,我們將與災(zāi)難有關(guān)的推文稱為“災(zāi)難”,而將其他任何事物的推文稱為“無(wú)關(guān)緊要”。
標(biāo)簽
我們已經(jīng)標(biāo)記了數(shù)據(jù),因此我們知道哪些推文屬于哪些類別。正如Richard Socher在下面概述的那樣,查找和標(biāo)記足夠的數(shù)據(jù)以訓(xùn)練模型通常更快,更簡(jiǎn)單,也更容易,而不是嘗試優(yōu)化復(fù)雜的無(wú)監(jiān)督方法。
第二步 清洗數(shù)據(jù)
我們遵循的第一條規(guī)則是:“您的模型將永遠(yuǎn)與您的數(shù)據(jù)一樣好。”
數(shù)據(jù)科學(xué)家的一項(xiàng)關(guān)鍵技能就是知道下一步應(yīng)該對(duì)模型還是對(duì)數(shù)據(jù)進(jìn)行研究。一個(gè)好的經(jīng)驗(yàn)法則是首先查看數(shù)據(jù),然后進(jìn)行清理。干凈的數(shù)據(jù)集將使模型學(xué)習(xí)有意義的特征,而不會(huì)過(guò)度夸大無(wú)關(guān)的噪聲。
這是用于清除數(shù)據(jù)的清單:(有關(guān)更多詳細(xì)信息,請(qǐng)參見(jiàn)代碼):
1.刪除所有不相關(guān)的字符,例如任何非字母數(shù)字字符.
2.通過(guò)將其分隔為單個(gè)單詞來(lái)對(duì)文本進(jìn)行標(biāo)記。
3.刪除不相關(guān)的詞,例如“ @”推特提及或網(wǎng)址。
4.將所有字符都轉(zhuǎn)換為小寫(xiě),以便將“ hello”,“ Hello”和“ HELLO”之類的單詞視為相同。
5.考慮將拼寫(xiě)錯(cuò)誤或替代拼寫(xiě)的單詞組合為單個(gè)表示形式(例如“ cool” /“ kewl” /“ cooool”)
6.考慮去詞綴化(將諸如“ am”,“ are”和“ is”之類的詞簡(jiǎn)化為諸如“ be”之類的常見(jiàn)形式)
完成上述步驟并檢查其他錯(cuò)誤之后,我們就可以開(kāi)始使用帶有標(biāo)簽的干凈數(shù)據(jù)來(lái)訓(xùn)練模型了!
第三步 尋找良好的數(shù)據(jù)表示方法
機(jī)器學(xué)習(xí)模型將數(shù)值作為輸入。例如,處理圖像的模型采用代表每個(gè)顏色通道中每個(gè)像素強(qiáng)度的矩陣。
我們的數(shù)據(jù)集是一個(gè)句子列表,因此為了使我們的算法從數(shù)據(jù)中提取模式,我們首先需要找到一種以我們的算法可以理解的方式表示它的方式,即作為一個(gè)數(shù)字列表。
One-hot 編碼(Bag of Words)
代表計(jì)算機(jī)文本的自然方法是將每個(gè)字符分別編碼為數(shù)字(例如ASCII)。如果我們將這種簡(jiǎn)單表示形式提供給分類器,則必須僅基于我們的數(shù)據(jù)從頭開(kāi)始學(xué)習(xí)單詞的結(jié)構(gòu),這對(duì)于大多數(shù)數(shù)據(jù)集是不可能的。我們需要使用更高層次的方法。
例如,我們可以為數(shù)據(jù)集中的所有唯一單詞構(gòu)建詞匯表,并將唯一索引與詞匯表中的每個(gè)單詞相關(guān)聯(lián)。
然后,將每個(gè)句子表示為一個(gè)列表,該列表與我們?cè)~匯表中不同單詞的數(shù)量一樣長(zhǎng)。在此列表的每個(gè)索引處,我們標(biāo)記給定單詞出現(xiàn)在句子中的次數(shù)。這被稱為“詞袋”模型,因?yàn)樗且环N完全忽略句子中單詞順序的表示形式。如下所示。
可視化嵌入
在“社交媒體的災(zāi)難”示例中,詞匯表中大約有20,000個(gè)單詞,這意味著每個(gè)句子將被表示為長(zhǎng)度為20,000的向量。向量將主要包含0,因?yàn)槊總€(gè)句子僅包含我們?cè)~匯的很小一部分。
為了查看我們的嵌入是否正在捕獲與我們的問(wèn)題相關(guān)的信息(即推文是否與災(zāi)難有關(guān)),最好將它們可視化并查看類是否看起來(lái)分離得很好。由于詞匯量通常很大,并且無(wú)法在20,000個(gè)維度上可視化數(shù)據(jù),因此PCA等技術(shù)將有助于將數(shù)據(jù)投影到二維。這在下面繪制。
這兩個(gè)類看起來(lái)并沒(méi)有很好地分開(kāi),這可能是我們嵌入的特征,或者僅僅是我們降維的特征。(The two classes do not look very well separated,which could be a feature of our embeddings or simply of our dimensionality reduction.)
為了查看詞袋功能是否有用,我們可以基于它們訓(xùn)練分類器。
第四步 分類
當(dāng)我們要解決問(wèn)題時(shí),一般的最佳做法是從可以解決問(wèn)題的最簡(jiǎn)單工具開(kāi)始。每當(dāng)涉及數(shù)據(jù)分類時(shí),因其多功能性和可解釋性而廣受歡迎的是Logistic回歸。訓(xùn)練非常簡(jiǎn)單,結(jié)果可以解釋,因?yàn)槟梢暂p松地從模型中提取最重要的系數(shù)。
我們將數(shù)據(jù)分為一個(gè)用于訓(xùn)練模型的訓(xùn)練集和一個(gè)測(cè)試集,用來(lái)測(cè)試在未知數(shù)據(jù)上的表現(xiàn)。經(jīng)過(guò)訓(xùn)練,我們的準(zhǔn)確率為75.4%。結(jié)果不算太差!猜到最頻繁的類別(“無(wú)關(guān)”)只會(huì)給我們57%的機(jī)會(huì)。但是,即使75%的精度足以滿足我們的需求,我們也應(yīng)該在不理解模型的情況下發(fā)布模型。
第五步 檢查
混淆矩陣
第一步是需要了解我們的模型產(chǎn)生的錯(cuò)誤類型,以及哪種錯(cuò)誤是最不希望的。在我們的示例中,F(xiàn)alse Positives(假陽(yáng)性)將不相關(guān)的推文歸類為災(zāi)難,F(xiàn)alse Negatives(假陰性)將災(zāi)難歸為不相關(guān)的推文。如果優(yōu)先考慮對(duì)每個(gè)潛在事件進(jìn)行響應(yīng),我們希望降低False Negatives(假陰性)。但是,如果我們考慮資源的限制,則可以優(yōu)先考慮較低的False Positives(假陽(yáng)性),以減少錯(cuò)誤警報(bào)。
可視化此信息的一種好方法是使用混淆矩陣,該矩陣將我們的模型做出的預(yù)測(cè)與真實(shí)標(biāo)簽進(jìn)行比較。理想情況下,矩陣應(yīng)該是從左上角到右下角的對(duì)角線(我們的預(yù)測(cè)與事實(shí)完全吻合)。
我們的分類器產(chǎn)生的false negatives(假陰性)要比f(wàn)alse positives(假陽(yáng)性)多。換句話說(shuō),我們模型中最常見(jiàn)的錯(cuò)誤是將災(zāi)難錯(cuò)誤地歸類為不相關(guān)。如果誤報(bào)會(huì)給執(zhí)法部門帶來(lái)高昂的成本及風(fēng)險(xiǎn)。
解釋和解釋我們的模型
為了驗(yàn)證我們的模型并解釋其預(yù)測(cè),重要的是要查看使用哪個(gè)詞來(lái)做決策。如果我們的數(shù)據(jù)有偏差,我們的分類器將在樣本數(shù)據(jù)中做出準(zhǔn)確的預(yù)測(cè),但是該模型在現(xiàn)實(shí)世界中無(wú)法很好地推廣。在這里,我們?yōu)闉?zāi)難和無(wú)關(guān)的人群繪制了最重要的單詞。
使用單詞袋和邏輯回歸可以很容易地繪制單詞的重要性,因?yàn)槲覀兛梢蕴崛〔⑴判蚰P陀糜陬A(yù)測(cè)的系數(shù)。
我們的分類者正確地選擇了一些模式(廣島,屠殺),但顯然似乎在一些毫無(wú)意義的術(shù)語(yǔ)上過(guò)擬合(heyoo,x1392)。目前,我們的“詞袋”模型正在處理大量不同單詞的詞匯,并平等對(duì)待所有單詞。但是,其中一些詞非常頻繁,只會(huì)對(duì)我們的預(yù)測(cè)產(chǎn)生影響。接下來(lái),我們將嘗試一種表示可以解釋單詞出現(xiàn)頻率的句子的方法,以查看是否可以從數(shù)據(jù)中獲取更多信號(hào)。
第六步:統(tǒng)計(jì)意義下的單詞表
TF-IDF
為了幫助我們的模型更多地關(guān)注有意義的詞,我們可以在“詞袋”模型的頂部使用TF-IDF分?jǐn)?shù)(詞頻,文檔逆頻)。TF-IDF會(huì)根據(jù)單詞在我們的數(shù)據(jù)集中的稀有程度對(duì)單詞進(jìn)行權(quán)衡,將過(guò)于頻繁且只會(huì)增加噪音的單詞打折。這是我們新嵌入的PCA投影。
我們可以在上面看到兩種顏色之間有更清晰的區(qū)別。這應(yīng)該使我們的分類人員更容易將兩個(gè)組分開(kāi)。讓我們看看這是否可以帶來(lái)更好的性能。在我們的新嵌入上訓(xùn)練另一個(gè)Logistic回歸,我們得到76.2%的準(zhǔn)確性。
非常輕微的改善。我們的模型是否已開(kāi)始使用更重要的單詞?如果我們?cè)诜乐鼓P汀白鞅住钡耐瑫r(shí)獲得了更好的結(jié)果,那么我們可以真正地將此模型視為升級(jí)。
它所選擇的單詞看起來(lái)更加相關(guān)!盡管我們?cè)跍y(cè)試集上的指標(biāo)僅略有增加,但是我們對(duì)模型使用的術(shù)語(yǔ)有更多的信心,因此將其部署在與客戶互動(dòng)的系統(tǒng)中會(huì)更自在。
第七步 利用語(yǔ)義
Word2Vec
我們的最新模型設(shè)法獲得高頻詞。
但是,如果我們部署此模型,則很有可能會(huì)遇到以前在訓(xùn)練集中看不到的單詞。
以前的模型即使在訓(xùn)練期間看到非常相似的單詞,也將無(wú)法準(zhǔn)確地對(duì)這些推文進(jìn)行分類。
為了解決這個(gè)問(wèn)題,我們需要捕獲單詞的語(yǔ)義,這意味著我們需要理解“好”和“肯定”等詞比“杏”和“大陸”更接近。我們將使用該工具來(lái)幫助我們捕獲 含義稱為Word2Vec。
使用預(yù)訓(xùn)練模型
Word2Vec是一種用于查找單詞的連續(xù)嵌入的技術(shù)。它通過(guò)閱讀大量文本并記住哪些單詞傾向于在相似的上下文中學(xué)習(xí)來(lái)學(xué)習(xí)。經(jīng)過(guò)足夠的數(shù)據(jù)訓(xùn)練后,它會(huì)為詞匯表中的每個(gè)單詞生成一個(gè)300維的向量,意思相似的單詞會(huì)彼此靠近。
該論文的作者公開(kāi)了一個(gè)在非常大的語(yǔ)料庫(kù)上預(yù)先訓(xùn)練的模型,我們可以利用該模型將一些語(yǔ)義含義的知識(shí)包括到我們的模型中。可以在與此帖子關(guān)聯(lián)的存儲(chǔ)庫(kù)中找到經(jīng)過(guò)預(yù)訓(xùn)練的向量。
句子級(jí)別的表示
為我們的分類器嵌入句子的一種快速方法是對(duì)句子中所有單詞的Word2Vec分?jǐn)?shù)求平均。就像以前一樣,這是一個(gè)“詞袋”方法,但是這次我們只丟失了句子的語(yǔ)法,同時(shí)保留了一些語(yǔ)義信息。
這是使用先前技術(shù)的新嵌入的可視化:
這兩組顏色在這里看起來(lái)更加分離,我們的新嵌入應(yīng)有助于我們的分類器找到兩個(gè)類之間的分離。在第三次訓(xùn)練相同的模型(邏輯回歸)之后,我們獲得了77.7%的準(zhǔn)確性得分,這是我們迄今為止最好的結(jié)果!
是時(shí)候檢查我們的模型了。
復(fù)雜性/解釋性權(quán)衡
由于我們的嵌入不像以前的模型那樣被表示為每個(gè)單詞一維的向量,因此很難確定哪個(gè)單詞與我們的分類最相關(guān)。雖然我們?nèi)匀豢梢允褂眠壿嫽貧w的系數(shù),但是它們與嵌入的300個(gè)維度有關(guān),而不是與單詞索引有關(guān)。
由于準(zhǔn)確性如此之低,因此失去所有可解釋性似乎是一項(xiàng)艱巨的代價(jià)。但是,對(duì)于更復(fù)雜的模型,我們可以利用LIME之類的黑匣子解釋器來(lái)深入了解我們的分類器如何工作。
LIME
LIME可通過(guò)開(kāi)源軟件包在Github上使用。黑盒解釋器允許用戶解釋任何分類器在可視化Word2Vec嵌入方面的決定。通過(guò)擾動(dòng)輸入(在本例中為從句子中刪除單詞)并查看預(yù)測(cè)如何變化,
我們來(lái)看看數(shù)據(jù)集中句子的一些解釋。
但是,我們沒(méi)有時(shí)間探索數(shù)據(jù)集中的數(shù)千個(gè)示例。我們要做的是在一個(gè)有代表性的測(cè)試用例樣本上運(yùn)行LIME,然后看看哪些詞繼續(xù)成為強(qiáng)大的貢獻(xiàn)者。使用這種方法,我們可以像以前的模型那樣獲得單詞重要性評(píng)分,并驗(yàn)證模型的預(yù)測(cè)。
看起來(lái)該模型使用了高度相關(guān)的詞語(yǔ),表明它似乎在做出易于理解的決策。這些似乎是所有先前型號(hào)中最相關(guān)的詞,因此我們更愿意將其部署到生產(chǎn)中。
第八步:使用端到端方法
我們已經(jīng)介紹了快速有效的方法來(lái)生成緊湊的句子嵌入。但是,通過(guò)忽略單詞的順序,我們將丟棄句子中所有的句法信息。如果這些方法不能提供足夠的結(jié)果,則可以利用更復(fù)雜的模型將整個(gè)句子作為輸入并預(yù)測(cè)標(biāo)簽,而無(wú)需構(gòu)建中間表示。常用的方法是使用Word2Vec或更新的方法(例如GloVe或CoVe)將句子視為單個(gè)單詞向量的序列。這就是我們下面要做的。
用于句子分類的卷積神經(jīng)網(wǎng)絡(luò)訓(xùn)練非常迅速,并且可以作為入門級(jí)深度學(xué)習(xí)架構(gòu)很好地工作。
雖然卷積神經(jīng)網(wǎng)絡(luò)(CNN)主要以其在圖像數(shù)據(jù)上的性能而聞名,但它們?cè)谂c文本有關(guān)的任務(wù)上一直提供出色的結(jié)果,并且通常比大多數(shù)復(fù)雜的NLP方法(例如LSTM和編碼器/解碼器體系結(jié)構(gòu))訓(xùn)練起來(lái)要快得多。該模型保留了單詞的順序,并學(xué)習(xí)了有關(guān)哪些單詞序列可以預(yù)測(cè)我們的目標(biāo)類別的有價(jià)值的信息。與以前的模型相反,它可以說(shuō)出“ Alex食用植物”和“ Plant eat食用Alex”之間的區(qū)別。訓(xùn)練該模型不需要比以前的方法做更多的工作(有關(guān)詳細(xì)信息,請(qǐng)參見(jiàn)代碼),并且為我們提供了一個(gè)模型比以前的要好得多,準(zhǔn)確度高達(dá)79.5%!與上述模型一樣,下一步應(yīng)該是使用我們描述的方法來(lái)探索和解釋預(yù)測(cè),以驗(yàn)證它確實(shí)是部署給用戶的最佳模型。到目前為止,您應(yīng)該可以自己解決這個(gè)問(wèn)題。
最后說(shuō)明
以下是我們成功使用的方法的簡(jiǎn)要概述:
- 從快速簡(jiǎn)單的模型開(kāi)始
- 解釋其預(yù)測(cè)
- 了解其正在犯的錯(cuò)誤
- 使用該知識(shí)來(lái)告知您的下一步,無(wú)論是對(duì)數(shù)據(jù)還是更復(fù)雜的模型。
這些方法使用為理解和利用諸如tweet之類的短文本而量身定制的模型應(yīng)用于特定的示例案例,但是這些思想廣泛應(yīng)用于各種問(wèn)題。希望對(duì)您有所幫助,我們很樂(lè)意聽(tīng)到您的評(píng)論和問(wèn)題!