R 和 Python 中的文本挖掘:8 個入門小貼士

你希望學習文本挖掘,卻發現大多數教程難度跨度很大?或者說你找不到心儀的數據集?

本文將會通過 8 個小貼士幫助你走進文本挖掘之門。

對文本保持好奇

在數據科學世界中,凡事的第一步都是「感到好奇」,文本挖掘也不例外。

就像 StackOverflow 的數據科學家 David Robinson 在他的博客中說的那樣,「當我看到一個假設 […] 我就迫不及待地想要用數據驗證它」。你也應該像他那樣對文本保持好奇心。

David Robinson 看到的假設是:

即使你並不打算真的去驗證它,你也應該對自己看到的詞雲圖感到好奇,並且有想要自己動手復現一遍的想法。

如果你還未能感受到文本挖掘的魅力,那就來看看這些最近在媒體上廣受關注的文本挖掘應用案例吧,比如 South Park dialogue, film dialogue 等等,你會從中得到啟發。

掌握你所需要的知識和技能

當你擁有了好奇心,是時候去學習關於文本挖掘的知識和技能了。你可以通過完成一些教學課程輕鬆地做到這一步。

在這些教程中你需要格外關注的是數據科學工作流中的基本步驟,比如數據預備和預處理,數據探索,數據分析等等。

推薦閱讀:

  • 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

詞語,詞語,詞語 – 尋找你的數據

一旦你掌握了分析和展現數據所需的基本概念和方法,就可以開始尋找你的數據了!

有非常多途徑可以找到你心儀的數據,除了 google trends 和雅虎,你還可以從以下途徑獲取數據:

  • 推特!R 和 Python 都提供了連接推特 API 的包或庫。
  • The Internet Archive, 一個非營利性的資料庫,包含上百萬的免費圖書、電影、軟體、音樂、網頁等等。
  • Project Gutenberg, 提供超過 55000 本免費電子書。大多數是成熟文獻,如果你想要對如像莎士比亞、簡·奧斯汀、愛倫坡這樣的作家的用詞進行分析,它會是很好的資源。
  • 在學術方面,你可以使用 JSTOR』s data for research。這是一個免費的自助工具,允許計算機科學、數字人文主義者和其他研究者使用 JSTOR 上的內容。
  • 如果你打算像開頭的例子中一樣對劇集或者電影進行文本挖掘,你可能需要考慮下載字幕。只要谷歌一下就能得到你想要的文本挖掘語料。
  • 你也可以從語料庫開始。兩個著名的語料庫是: The Reuters Text Corpus, 一些人對這個語料庫是不是最多樣化的語料庫有爭議,但是它仍然對你開始學習文本挖掘很有幫助; Brown Corpus, 包括500種來源的文本,並已經根據類型分類。

如你所見,文本來源有無限可能。任何包含文本的東西都可以成為你的文本挖掘案例學習的主題。

尋找合適的工具

現在你已經找到了你的數據的來源,你可能需要使用合適的工具來對他們進行處理。你已經學習的教學課程應該已經為你提供了許多入門工具。

但是,如果你僅僅學習了教學課程,你可能錯過了一些東西,比如下文會介紹的用 R 進行文本挖掘時會用到的包:

  • 在R中進行文本挖掘時最常用的包毫無疑問是 tm 包。這個包常被加入到其他包中,比如 twitterR 包,通過這個包你可以從推特的網頁上提取推文和關注者等。
  • 在 R 中進行網頁爬蟲的時候你需要 rvest 包,這裡有一個簡短的 rvest 教程。

對於Python,你可以使用以下庫:

  • 自然語言工具箱,包含在 nltk 包中,這個包是極其實用的,因為他提供了超過 50 種語料庫和辭彙資源的入口。你可以查看 nltk 數據列表。
  • 如果你想要挖掘推特數據,你有許多包可以選擇。其中最廣泛被使用的是 tweey 包
  • 對於網頁爬蟲,scrapy 包是最容易上手的,也可以考慮使用 urllib2,這是一個用來打開網頁鏈接的包。有時候更推薦使用 requests, 因為某些場合下它可能更方便使用。也有些人說它更加人性化,因為諸如設置 user-agent 和請求頁面都只需要一行代碼。偶爾你會看到有人提到並不太流行的 urllib包,大多數開發者提到它只是因為他們在裡面找到一兩個他們覺得特別實用的函數。

充分的準備是成功的一半——數據預處理

數據科學家工作中 80% 的時間用在數據清洗上,文本挖掘也不例外。

如果你不確定要怎麼預處理,以下是一些標準流程中的步驟:

  • 從文本中提取出你想要處理的格式和結構,
  • 去掉如 「that」 和 「and」 這樣的停用詞,
  • 詞幹化(提取詞根)。這一步需要字典、語言學規則或演算法(如 Porter 演算法)的幫助。

這些步驟看起來很難,實際上你不用每一步都自己實現。大多數情況下,上文中提到的庫和包都能幫你實現這些步驟。比如 R 中的 tm 包可以讓你通過其內置函數完成詞幹化、去除停止詞、消除空白以及小寫轉換。類似的,Python 中的 nltk 庫也可以通過其內置函數完成這些預處理過程。

然而,你可能仍然需要進一步使用正則表達式來描述你需要的文本模式,以便進一步預處理。這也可以加速你的數據清理過程。

對於 Python, 你可以使用 re 庫,而在 R 中,有許多內置函數,如 grep(), grepl(), regexpr(), gregexpr(), sub(), gsub() 和 strsplit()。

如果你想要更加深入地了解這些函數,或者 R 中的正則表達式,你可以查看這個正則表達式介紹網頁。

數據科學家的仙境冒險——數據探索

到目前為止,你已經摩拳擦掌準備開始分析了。但是,在分析之前最好還是先看看數據長什麼樣子。

利用上文提到的那些包和庫,你可以快速地進行一些數據探索工作:

  • 創建一個文檔詞項矩陣:該矩陣中的元素表示語料庫中一篇文檔內,一個詞項(一個單詞或者一個 n 元片語)出現的頻繁程度。
  • 當你創建了文檔詞項矩陣,你可以繪製直方圖來可視化語料庫中的辭彙頻率。
  • 你也可以計算語料庫中兩個或更多詞項之間的相關性。
  • 你可以使用詞雲圖來可視化你的語料庫。在 R 中你可以使用 wordcloud 包來繪製,Python 中也有一個同名的庫。

經過數據探索過程,你會對你接下來分析中,要分析的對象有一定的了解。如果你看到文檔辭彙矩陣或者直方圖中有很多詞語是稀疏的,你可以考慮將他們去掉。

提升你的文本挖掘技能

當你使用上述工具完成了預處理和基本的文本分析等步驟,你可以考慮通過你的數據集,進一步擴展你的文本挖掘技能。因為到現在,你看到的技巧提示都只是文本挖掘的冰山一角。

首先,你應該考慮探索文本挖掘和自然語言處理(NLP)的區別。更多關於 NLP 的 R 包可以在這個 NLP 的 R 包網頁找到。NLP 中,你會學習到命名實體識別、詞性標註、篇章分析、情感分析等內容。對於 Python, 你可以使用 nltk 庫。這個使用 nltk 庫進行情感分析完全指南會對你有所幫助。

除了這些包,還有諸如深度學習、統計主題發現模型(如隱式狄利克雷分配,LDA)等工具等著你去學習。這些演算法對應的包有:

  • Python 庫:gensim,這個庫可以實現 word2vec, GloVe, LDA 等演算法。此外,如果你需要研究深度學習,theano 是一個很值得考慮的庫。
  • R 包:text2vec 包可以用於實現文本向量化和詞嵌入。如果你對情感分析感興趣,使用 syuzhet 和 tm 包可以完成這個任務。最後,topicmodes 包可以用於實現統計主題發現模型。

當然,並不僅僅只有這些包。

不止是詞語——結果可視化

可視化是一種非常吸引人的表達方式,所以將結果可視化可能是你能做的最美妙的事情!注意,你要可視化的是你要講的故事,而不是將你分析中發現的關聯性或者話題可視化。

Python 和 R 中都有許多可視化包: 對於 Python, 你可以考慮使用 NetworkX 庫來可視化複雜網路,matplotlib 包可以用來解決其他可視化問題。此外,plotly 包讓你可以發布可交互在線圖表。試著將 Python 和 D3 聯繫起來會得到更好的效果。D3 是一個用於動態數據操縱和可視化的 JavaScript 庫,可以讓你的讀者和聽眾參與到數據可視化的過程中來。

對於 R, 除了 ggplot2 等大家耳熟能詳的包,你也可以使用 igraph 包來分析關注、被關注以及轉發微博等關係。此外,plotly 和 networkD3 包可以把 R 和 JavaScript 鏈接起來,LDAvis 包則可以將主題模型進行可交互的可視化。

相關鏈接:

David Robinson 的博客: Text analysis of Trumps tweets confirms he writes only the (angrier) Android half

South Park dialogue Text Mining South Park

film dialogue The Largest Analysis of Film Dialogue by Gender, Ever

Ted Kwartler: Text Mining in R: Are Pokémon GO Mentions Really Driving Up Stock Prices? Text Mining in R: Are Pokémon GO Mentions Really Driving Up Stock Prices?

Ted Kwartler: Text Mining: Bag of Words Text Mining: Bag of Words Neal Caren: An introduction to text analysis with Python An introduction to text analysis with Python, Part 1

Kaggle: Part 1: For Beginners - Bag of Words Part 1: For Beginners - Bag of Words

DataCamp: Learn Data Science - Resources for Python & R Learn Data Science - Resources for Python & R

The Internet Archive archive.org

Project Gutenberg Project Gutenberg

JSTOR』s data for research Data for Research The Reuters Text Corpus Reuters-21578 Text Categorization Test Collection Brown Corpus Brown Corpus Manual tm tm package | R Documentation rvest rvest package | R Documentation

rvest 教程 Web Scraping with R and PhantomJS

nltk Natural Language Toolkit

nltk內容列表 nltk.org/nltk_data/

tweey Tweepy

scrapy A Fast and Powerful Scraping and Web Crawling Framework

urllib2 20.6. urllib2 - extensible library for opening URLs - Python 2.7.13 documentation re 6.2. re - Regular expression operations - Python 3.6.1 documentation

正則表達式介紹網頁 regex function | R Documentation

wordcloud wordcloud package | R Documentation

NLP 的 R 包網頁 RDocumentation

使用 nltk 庫進行情感分析完全指南 Text Classification for Sentiment Analysis – Naive Bayes Classifier

genism gensim: topic modelling for humans

GloVe Global Vectors for Word Representation

theano Welcome - Theano 0.9.0 documentation

text2vec text2vec package | R Documentation

topicmodes topicmodels package | R Documentation

NetworkX Overview - NetworkX

matplotlib matplotlib 1.5.3

plotly(python) Python Package Index

ggplot2 ggplot2 package | R Documentation

igraph igraph package | R Documentation

plotly(R) plotly package | R Documentation

networkD3 networkD3 package | R Documentation

LDAvis LDAvis package | R Documentation

推薦閱讀:

PPT分享|40頁PPT勘破三生三世數據奧秘,坐觀十里桃花之美

TAG:文本数据挖掘 |