R 和 Python 中的文本挖掘:8 個(gè)入門小貼士
你希望學(xué)習(xí)文本挖掘,卻發(fā)現(xiàn)大多數(shù)教程難度跨度很大?或者說(shuō)你找不到心儀的數(shù)據(jù)集?
本文將會(huì)通過(guò) 8 個(gè)小貼士幫助你走進(jìn)文本挖掘之門。
對(duì)文本保持好奇
在數(shù)據(jù)科學(xué)世界中,凡事的第一步都是“感到好奇”,文本挖掘也不例外。
就像 StackOverflow 的數(shù)據(jù)科學(xué)家 David Robinson 在他的博客中說(shuō)的那樣,“當(dāng)我看到一個(gè)假設(shè) […] 我就迫不及待地想要用數(shù)據(jù)驗(yàn)證它”。你也應(yīng)該像他那樣對(duì)文本保持好奇心。
David Robinson 看到的假設(shè)是:
即使你并不打算真的去驗(yàn)證它,你也應(yīng)該對(duì)自己看到的詞云圖感到好奇,并且有想要自己動(dòng)手復(fù)現(xiàn)一遍的想法。
如果你還未能感受到文本挖掘的魅力,那就來(lái)看看這些最近在媒體上廣受關(guān)注的文本挖掘應(yīng)用案例吧,比如 South Park dialogue, film dialogue 等等,你會(huì)從中得到啟發(fā)。
掌握你所需要的知識(shí)和技能
當(dāng)你擁有了好奇心,是時(shí)候去學(xué)習(xí)關(guān)于文本挖掘的知識(shí)和技能了。你可以通過(guò)完成一些教學(xué)課程輕松地做到這一步。
在這些教程中你需要格外關(guān)注的是數(shù)據(jù)科學(xué)工作流中的基本步驟,比如數(shù)據(jù)預(yù)備和預(yù)處理,數(shù)據(jù)探索,數(shù)據(jù)分析等等。
推薦閱讀:
- Ted Kwartler: Text Mining in R: Are Pokémon GO Mentions Really Driving Up Stock Prices?
- Ted Kwartler: Text Mining: Bag of Words
- Neal Caren: An introduction to text analysis with Python
- Kaggle: Part 1: For Beginners – Bag of Words
- DataCamp: Learn Data Science – Resources for Python & R
詞語(yǔ),詞語(yǔ),詞語(yǔ) – 尋找你的數(shù)據(jù)
一旦你掌握了分析和展現(xiàn)數(shù)據(jù)所需的基本概念和方法,就可以開(kāi)始尋找你的數(shù)據(jù)了!
有非常多途徑可以找到你心儀的數(shù)據(jù),除了 google trends 和雅虎,你還可以從以下途徑獲取數(shù)據(jù):
- 推特!R 和 Python 都提供了連接推特 API 的包或庫(kù)。
- The Internet Archive, 一個(gè)非營(yíng)利性的資料庫(kù),包含上百萬(wàn)的免費(fèi)圖書、電影、軟件、音樂(lè)、網(wǎng)頁(yè)等等。
- Project Gutenberg, 提供超過(guò) 55000 本免費(fèi)電子書。大多數(shù)是成熟文獻(xiàn),如果你想要對(duì)如像莎士比亞、簡(jiǎn)·奧斯汀、愛(ài)倫坡這樣的作家的用詞進(jìn)行分析,它會(huì)是很好的資源。
- 在學(xué)術(shù)方面,你可以使用 JSTOR’s data for research。這是一個(gè)免費(fèi)的自助工具,允許計(jì)算機(jī)科學(xué)、數(shù)字人文主義者和其他研究者使用 JSTOR 上的內(nèi)容。
- 如果你打算像開(kāi)頭的例子中一樣對(duì)劇集或者電影進(jìn)行文本挖掘,你可能需要考慮下載字幕。只要谷歌一下就能得到你想要的文本挖掘語(yǔ)料。
- 你也可以從語(yǔ)料庫(kù)開(kāi)始。兩個(gè)著名的語(yǔ)料庫(kù)是:
The Reuters Text Corpus, 一些人對(duì)這個(gè)語(yǔ)料庫(kù)是不是最多樣化的語(yǔ)料庫(kù)有爭(zhēng)議,但是它仍然對(duì)你開(kāi)始學(xué)習(xí)文本挖掘很有幫助;
Brown Corpus, 包括500種來(lái)源的文本,并已經(jīng)根據(jù)類型分類。
如你所見(jiàn),文本來(lái)源有無(wú)限可能。任何包含文本的東西都可以成為你的文本挖掘案例學(xué)習(xí)的主題。
尋找合適的工具
現(xiàn)在你已經(jīng)找到了你的數(shù)據(jù)的來(lái)源,你可能需要使用合適的工具來(lái)對(duì)他們進(jìn)行處理。你已經(jīng)學(xué)習(xí)的教學(xué)課程應(yīng)該已經(jīng)為你提供了許多入門工具。
但是,如果你僅僅學(xué)習(xí)了教學(xué)課程,你可能錯(cuò)過(guò)了一些東西,比如下文會(huì)介紹的用 R 進(jìn)行文本挖掘時(shí)會(huì)用到的包:
- 在R中進(jìn)行文本挖掘時(shí)最常用的包毫無(wú)疑問(wèn)是 tm 包。這個(gè)包常被加入到其他包中,比如 twitterR 包,通過(guò)這個(gè)包你可以從推特的網(wǎng)頁(yè)上提取推文和關(guān)注者等。
- 在 R 中進(jìn)行網(wǎng)頁(yè)爬蟲(chóng)的時(shí)候你需要 rvest 包,這里有一個(gè)簡(jiǎn)短的 rvest 教程。
- 對(duì)于Python,你可以使用以下庫(kù):
- 自然語(yǔ)言工具箱,包含在 nltk 包中,這個(gè)包是極其實(shí)用的,因?yàn)樗峁┝顺^(guò) 50 種語(yǔ)料庫(kù)和詞匯資源的入口。你可以查看 nltk 數(shù)據(jù)列表。
- 如果你想要挖掘推特?cái)?shù)據(jù),你有許多包可以選擇。其中最廣泛被使用的是 tweey 包
- 對(duì)于網(wǎng)頁(yè)爬蟲(chóng),scrapy 包是最容易上手的,也可以考慮使用 urllib2,這是一個(gè)用來(lái)打開(kāi)網(wǎng)頁(yè)鏈接的包。有時(shí)候更推薦使用 requests, 因?yàn)槟承﹫?chǎng)合下它可能更方便使用。也有些人說(shuō)它更加人性化,因?yàn)橹T如設(shè)置 user-agent 和請(qǐng)求頁(yè)面都只需要一行代碼。偶爾你會(huì)看到有人提到并不太流行的 urllib包,大多數(shù)開(kāi)發(fā)者提到它只是因?yàn)樗麄冊(cè)诶锩嬲业揭粌蓚€(gè)他們覺(jué)得特別實(shí)用的函數(shù)。
充分的準(zhǔn)備是成功的一半——數(shù)據(jù)預(yù)處理
數(shù)據(jù)科學(xué)家工作中 80% 的時(shí)間用在數(shù)據(jù)清洗上,文本挖掘也不例外。
如果你不確定要怎么預(yù)處理,以下是一些標(biāo)準(zhǔn)流程中的步驟:
- 從文本中提取出你想要處理的格式和結(jié)構(gòu),
- 去掉如 “that” 和 “and” 這樣的停用詞,
- 詞干化(提取詞根)。這一步需要字典、語(yǔ)言學(xué)規(guī)則或算法(如 Porter 算法)的幫助。
這些步驟看起來(lái)很難,實(shí)際上你不用每一步都自己實(shí)現(xiàn)。大多數(shù)情況下,上文中提到的庫(kù)和包都能幫你實(shí)現(xiàn)這些步驟。比如 R 中的 tm 包可以讓你通過(guò)其內(nèi)置函數(shù)完成詞干化、去除停止詞、消除空白以及小寫轉(zhuǎn)換。類似的,Python 中的 nltk 庫(kù)也可以通過(guò)其內(nèi)置函數(shù)完成這些預(yù)處理過(guò)程。
然而,你可能仍然需要進(jìn)一步使用正則表達(dá)式來(lái)描述你需要的文本模式,以便進(jìn)一步預(yù)處理。這也可以加速你的數(shù)據(jù)清理過(guò)程。
對(duì)于 Python, 你可以使用 re 庫(kù),而在 R 中,有許多內(nèi)置函數(shù),如 grep(), grepl(), regexpr(), gregexpr(), sub(), gsub() 和 strsplit()。
如果你想要更加深入地了解這些函數(shù),或者 R 中的正則表達(dá)式,你可以查看這個(gè)正則表達(dá)式介紹網(wǎng)頁(yè)。
數(shù)據(jù)科學(xué)家的仙境冒險(xiǎn)——數(shù)據(jù)探索
到目前為止,你已經(jīng)摩拳擦掌準(zhǔn)備開(kāi)始分析了。但是,在分析之前最好還是先看看數(shù)據(jù)長(zhǎng)什么樣子。
利用上文提到的那些包和庫(kù),你可以快速地進(jìn)行一些數(shù)據(jù)探索工作:
- 創(chuàng)建一個(gè)文檔詞項(xiàng)矩陣:該矩陣中的元素表示語(yǔ)料庫(kù)中一篇文檔內(nèi),一個(gè)詞項(xiàng)(一個(gè)單詞或者一個(gè) n 元詞組)出現(xiàn)的頻繁程度。
- 當(dāng)你創(chuàng)建了文檔詞項(xiàng)矩陣,你可以繪制直方圖來(lái)可視化語(yǔ)料庫(kù)中的詞匯頻率。
- 你也可以計(jì)算語(yǔ)料庫(kù)中兩個(gè)或更多詞項(xiàng)之間的相關(guān)性。
- 你可以使用詞云圖來(lái)可視化你的語(yǔ)料庫(kù)。在 R 中你可以使用 wordcloud 包來(lái)繪制,Python 中也有一個(gè)同名的庫(kù)。
經(jīng)過(guò)數(shù)據(jù)探索過(guò)程,你會(huì)對(duì)你接下來(lái)分析中,要分析的對(duì)象有一定的了解。如果你看到文檔詞匯矩陣或者直方圖中有很多詞語(yǔ)是稀疏的,你可以考慮將他們?nèi)サ簟?/p>
提升你的文本挖掘技能
當(dāng)你使用上述工具完成了預(yù)處理和基本的文本分析等步驟,你可以考慮通過(guò)你的數(shù)據(jù)集,進(jìn)一步擴(kuò)展你的文本挖掘技能。因?yàn)榈浆F(xiàn)在,你看到的技巧提示都只是文本挖掘的冰山一角。
首先,你應(yīng)該考慮探索文本挖掘和自然語(yǔ)言處理(NLP)的區(qū)別。更多關(guān)于 NLP 的 R 包可以在這個(gè) NLP 的 R 包網(wǎng)頁(yè)找到。NLP 中,你會(huì)學(xué)習(xí)到命名實(shí)體識(shí)別、詞性標(biāo)注、篇章分析、情感分析等內(nèi)容。對(duì)于 Python, 你可以使用 nltk 庫(kù)。這個(gè)使用 nltk 庫(kù)進(jìn)行情感分析完全指南會(huì)對(duì)你有所幫助。
除了這些包,還有諸如深度學(xué)習(xí)、統(tǒng)計(jì)主題發(fā)現(xiàn)模型(如隱式狄利克雷分配,LDA)等工具等著你去學(xué)習(xí)。這些算法對(duì)應(yīng)的包有:
- Python 庫(kù):gensim,這個(gè)庫(kù)可以實(shí)現(xiàn) word2vec, GloVe, LDA 等算法。此外,如果你需要研究深度學(xué)習(xí),theano 是一個(gè)很值得考慮的庫(kù)。
- R 包:text2vec 包可以用于實(shí)現(xiàn)文本向量化和詞嵌入。如果你對(duì)情感分析感興趣,使用 syuzhet 和 tm 包可以完成這個(gè)任務(wù)。最后,topicmodes 包可以用于實(shí)現(xiàn)統(tǒng)計(jì)主題發(fā)現(xiàn)模型。
當(dāng)然,并不僅僅只有這些包。
不止是詞語(yǔ)——結(jié)果可視化
可視化是一種非常吸引人的表達(dá)方式,所以將結(jié)果可視化可能是你能做的最美妙的事情!注意,你要可視化的是你要講的故事,而不是將你分析中發(fā)現(xiàn)的關(guān)聯(lián)性或者話題可視化。
Python 和 R 中都有許多可視化包:
對(duì)于 Python, 你可以考慮使用 NetworkX 庫(kù)來(lái)可視化復(fù)雜網(wǎng)絡(luò),matplotlib 包可以用來(lái)解決其他可視化問(wèn)題。此外,plotly 包讓你可以發(fā)布可交互在線圖表。試著將 Python 和 D3 聯(lián)系起來(lái)會(huì)得到更好的效果。D3 是一個(gè)用于動(dòng)態(tài)數(shù)據(jù)操縱和可視化的 JavaScript 庫(kù),可以讓你的讀者和聽(tīng)眾參與到數(shù)據(jù)可視化的過(guò)程中來(lái)。
對(duì)于 R, 除了 ggplot2 等大家耳熟能詳?shù)陌?,你也可以使?igraph 包來(lái)分析關(guān)注、被關(guān)注以及轉(zhuǎn)發(fā)微博等關(guān)系。此外,plotly 和 networkD3 包可以把 R 和 JavaScript 鏈接起來(lái),LDAvis 包則可以將主題模型進(jìn)行可交互的可視化。