Python具有一些強(qiáng)大的工具,使您能夠執(zhí)行自然語言處理(NLP)。在大數(shù)據(jù)分析如何使用Python進(jìn)行自然語言處理中,我們將學(xué)習(xí)如何在Python中執(zhí)行一些基本的NLP。
看數(shù)據(jù)
我們將查看一個數(shù)據(jù)集,該數(shù)據(jù)集包括2006年至2015年間向Hacker News提交的內(nèi)容。數(shù)據(jù)取自此處。Arnaud Drizard使用Hacker News API進(jìn)行了抓取。我們10000從數(shù)據(jù)中隨機(jī)采樣了行,并刪除了所有多余的列。我們的數(shù)據(jù)只有四列:
1)submission_time -故事提交時。
2)url —提交的基本URL。
3)upvotes -提交的投票數(shù)。
4)headline —提交的標(biāo)題。
我們將使用頭條新聞來預(yù)測投票數(shù)。數(shù)據(jù)存儲在submissions變量中。
自然語言處理-第一步
我們最終希望訓(xùn)練一種機(jī)器學(xué)習(xí)算法,使其成為標(biāo)題,并告訴我們它將獲得多少票。但是,機(jī)器學(xué)習(xí)算法只能理解數(shù)字,而不能理解單詞。我們?nèi)绾螌?biāo)題轉(zhuǎn)換為算法可以理解的內(nèi)容?
第一步是創(chuàng)建一個稱為單詞袋矩陣的東西。一袋單詞矩陣給我們一個數(shù)字表示哪個單詞在哪個標(biāo)題中。為了構(gòu)建單詞袋矩陣,我們首先在整個標(biāo)題中找到唯一的單詞。然后,我們建立一個矩陣,其中每一行都是標(biāo)題,每一列都是唯一的單詞之一。然后,我們用單詞在該標(biāo)題中出現(xiàn)的次數(shù)填充每個單元格。這將導(dǎo)致一個矩陣,其中的許多單元格的值為零,除非詞匯在標(biāo)題之間大部分是共享的。
刪除標(biāo)點符號
我們剛剛制作的矩陣非常稀疏-這意味著很多值都是零。在一定程度上這是不可避免的,因為標(biāo)題沒有太多共享的詞匯。不過,我們可以采取一些措施來改善問題。目前,Why和why,和use和use.被視為不同的實體,但是我們知道它們指的是相同的詞。我們可以通過簡化每個單詞并刪除所有標(biāo)點符號來幫助解析器認(rèn)識到它們實際上是相同的。
刪除停用詞
某些字詞無法幫助您區(qū)分好壞標(biāo)題。詞語,例如the,a和also發(fā)生通常足以在所有上下文中,他們沒有真正告訴我們很多關(guān)于什么是好還是不好。它們通常同樣有可能同時出現(xiàn)在頭條新聞和頭條新聞中。通過刪除這些,我們可以減小矩陣的大小,并使訓(xùn)練算法更快。
生成所有標(biāo)題的矩陣
現(xiàn)在我們已經(jīng)了解了基礎(chǔ)知識,我們可以為整個標(biāo)題制作一袋單詞矩陣。我們不需要每次都手動編寫所有代碼,因此我們將使用scikit-learn中的類來自動執(zhí)行。使用scikit-learn的矢量化器來構(gòu)造您的單詞矩陣包將使此過程變得更加輕松和快捷。
減少尺寸
我們已經(jīng)構(gòu)造了一個矩陣,但是它現(xiàn)在具有13631唯一的單詞或列。進(jìn)行預(yù)測將花費很長時間。我們想加快速度,因此我們需要以某種方式減少列數(shù)。一種方法是從信息量最大的列中選擇一個子集,也就是,區(qū)分好和壞標(biāo)題的列是最好的。
找出信息最多的列的一種好方法是使用一種稱為卡方檢驗的方法。卡方檢驗可發(fā)現(xiàn)在高度贊同的帖子和未贊同的帖子之間區(qū)別最大的單詞。這可能是在高評價的帖子中經(jīng)常出現(xiàn)的單詞,而在沒有高評價的帖子中根本沒有出現(xiàn),或者在沒有高評價的帖子中經(jīng)常出現(xiàn)但在高評價的帖子中沒有出現(xiàn)的單詞??ǚ綑z驗僅適用于二進(jìn)制值,因此我們將upvotes列設(shè)置為二進(jìn)制,將upvotes高于平均值to的值設(shè)置為1up to0。缺點之一是,我們使用數(shù)據(jù)集中的知識來選擇特征,從而引入一些過擬合。通過使用數(shù)據(jù)的一個子集進(jìn)行特征選擇,并使用另一個子集來訓(xùn)練算法,我們可以解決“現(xiàn)實世界”中的過度擬合問題?,F(xiàn)在,我們將使事情變得更簡單,然后跳過該步驟。
添加元功能
如果我們忽略標(biāo)題的“元”功能,那么我們會丟失許多有用的信息。這些功能包括長度,標(biāo)點數(shù)量,平均單詞長度以及其他特定于句子的功能。添加這些可以大大提高預(yù)測準(zhǔn)確性。要添加它們,我們將遍歷標(biāo)題,并對每個標(biāo)題應(yīng)用一個函數(shù)。一些功能將以字符為單位計算標(biāo)題的長度,而其他功能將進(jìn)行更高級的操作,例如計算數(shù)字位數(shù)。
增加更多功能
我們可以使用的功能不僅僅是文字功能。我們有一個名為的列submission_time,它告訴我們故事提交的時間,并且可以添加更多信息。通常在進(jìn)行NLP工作時,您將能夠添加外部功能,從而使您的預(yù)測更好。一些機(jī)器學(xué)習(xí)算法可以弄清楚這些功能如何與您的文字功能進(jìn)行交互(例如,“在午夜發(fā)布,標(biāo)題中帶有'tacos'的單詞會獲得較高的得分”)。
做出預(yù)測
現(xiàn)在我們可以將單詞翻譯為數(shù)字,可以使用算法進(jìn)行預(yù)測了。我們將隨機(jī)選擇7500標(biāo)題作為訓(xùn)練集,然后在2500標(biāo)題測試集上評估算法的性能。在我們訓(xùn)練的同一集合上預(yù)測結(jié)果將導(dǎo)致擬合過度,這會導(dǎo)致您的算法針對訓(xùn)練集過度優(yōu)化-我們認(rèn)為錯誤率不錯,但在新數(shù)據(jù)上實際上可能更高。對于算法,我們將使用嶺回歸。與普通的線性回歸相比,嶺回歸對系數(shù)造成了損失,從而防止了系數(shù)變得太大。像我們一樣,這可以幫助它處理大量相互關(guān)聯(lián)的預(yù)測變量(列)。
評估誤差
現(xiàn)在我們有了預(yù)測,但是我們?nèi)绾未_定它們的好壞呢?一種方法是計算測試集預(yù)測與測試集實際投票數(shù)之間的錯誤率。我們還希望巴塞爾比較錯誤,以查看結(jié)果是否良好。為此,我們可以使用一種簡單的方法為測試集進(jìn)行基線估計,然后將預(yù)測的錯誤率與基線估計的錯誤率進(jìn)行比較。
一個非常簡單的基準(zhǔn)是獲取訓(xùn)練集中每個提交的平均投票數(shù),并將其用作每個提交的預(yù)測。我們將使用平均絕對誤差作為誤差度量。這非常簡單-只需從預(yù)測中減去實際值,取差的絕對值,然后找到所有差的平均值即可。
下一步
此方法在該數(shù)據(jù)集上合理有效,但效果并不理想。我們發(fā)現(xiàn)標(biāo)題和其他列具有一定的預(yù)測價值。我們可以通過使用不同的預(yù)測算法(例如隨機(jī)森林或神經(jīng)網(wǎng)絡(luò))來改進(jìn)此方法。在生成詞袋矩陣時,我們也可以使用ngram,例如bigrams和trigram。
在矩陣上 嘗試tf-idf轉(zhuǎn)換也可能會有所幫助-scikit-learn有一個可自動執(zhí)行此操作的類。我們還可以考慮其他數(shù)據(jù),例如提交文章的用戶,并生成指示諸如用戶的業(yè)力和用戶的近期活動之類的特征。有關(guān)已提交網(wǎng)址的其他統(tǒng)計信息(例如,從該網(wǎng)址收到的已提交upuptes的平均數(shù)量)也可能很有用。
進(jìn)行這些操作時請務(wù)必謹(jǐn)慎,以僅考慮進(jìn)行預(yù)測的提交之前存在的信息。所有這些添加都將比我們到目前為止花費更多的時間來運行,但是會減少錯誤。希望您有一些時間來嘗試一下!如果您想與NLP合作,請查看我們的交互式《大數(shù)據(jù)分析課程》。
填寫下面表單即可預(yù)約申請免費試聽!怕錢不夠?可先就業(yè)掙錢后再付學(xué)費! 怕學(xué)不會?助教全程陪讀,隨時解惑!擔(dān)心就業(yè)?一地學(xué)習(xí),可推薦就業(yè)!
?2007-2022/ m.5wd995.cn 北京漫動者數(shù)字科技有限公司 備案號: 京ICP備12034770號 監(jiān)督電話:010-53672995 郵箱:bjaaa@aaaedu.cc