這篇短文的目的是分享我這幾天里從頭開始學(xué)習(xí)Python爬蟲技術(shù)的經(jīng)驗,并展示對爬取的文本進行情感分析(文本分類)的一些挖掘結(jié)果。 不同于其他專注爬蟲技術(shù)的介紹,這里首先闡述爬取網(wǎng)絡(luò)數(shù)據(jù)動機,接著以豆瓣影評為例介紹文本數(shù)據(jù)的爬取,最后使用文本分類的技術(shù)以一種機器學(xué)習(xí)的方式進行情感分析。由于內(nèi)容覆蓋面巨大,無法詳細道盡,這篇文章旨在給那些對相關(guān)領(lǐng)域只有少量或者沒有接觸的人一個認知的窗口,希望激發(fā)讀者自行探索的興趣。 以下的樣本代碼用Pyhton寫成,主要使用了scrapy, sklearn兩個庫。 所以,什么是情感分析(Sentiment Analysis)? 情感分析又叫意見挖掘(Opinion Mining), 是一個研究人們對某種事物,例如產(chǎn)品,話題,政策的意見,情緒或者態(tài)度的領(lǐng)域。 隨著網(wǎng)路上意見型數(shù)據(jù)的爆發(fā),情感分析也被廣泛研究和應(yīng)用。Bing Liu 的 Sentiment Analysis and Opinion Mining 對此做了比較全面的概括和案例研究,另一篇Bo Pang 的經(jīng)典論文 Opinion Minning and Sentiment Analysis 則著重研究了情感分類這一問題。 簡單的一個應(yīng)用的例子,某公司想調(diào)查自己在淘寶上銷售的產(chǎn)品的受喜愛程度,就可以從產(chǎn)品評論入手, 用一個訓(xùn)練好的分類器判斷每個留下評論用戶的對此產(chǎn)品的喜好態(tài)度,積極的或者是消極的評價,以此展開,充分挖掘文本內(nèi)容。 Python爬蟲 當然,情感分析的第一步是獲取數(shù)據(jù),而網(wǎng)絡(luò)尤其是社交網(wǎng)絡(luò)是存在著豐富而易于獲得的意見型數(shù)據(jù)資源。Python的開源爬蟲庫scrapy就很好用,這也是作為一個新手上手的首選工具。scrapy wiki 提供了全面的學(xué)習(xí)資源,甚至有中文的資料和說明文檔。就像我一直強調(diào)的,數(shù)據(jù)科學(xué)家是一個要具備多領(lǐng)域技能的職位,以練代學(xué)不失為一種很好的途徑。我鼓勵對Python爬蟲躍躍欲試的讀者不要擔心自己知識不足,這里沒有門檻,直接上就是了。 當你讀完了上述介紹文檔之后,你應(yīng)該知道一個scrapy項目的組成,抓取流程,scrapy里每種Spider的應(yīng)用場景,大致了解XPATH的語法規(guī)則。這樣之后你就了解到編寫一個簡單爬蟲只需四步: 1.scrapy startproject PROJECT_NAME 2.定義一個爬蟲類: 選擇爬蟲種類(Spider, CrawlSpider), 取決于目標和爬蟲各自合適的應(yīng)用場景 有一個初始url,或者一個生成初始url的方法 有一個能夠生成請求(request)的“解析(parse)”方法 3. 在item類里想要抓取的內(nèi)容 4. scrapy crawl SPIDER_NAME 我上手的第一個例子是爬取豆瓣的影評數(shù)據(jù),選擇豆瓣一是因為其豐富的語料資源和配備的打分體系,便于分類問題的標簽獲得。
二是可以避開賬戶登錄,限制少。思路是選取一部特定的電影,然后爬取其所有的短評和評分。這樣后期文本就可以作為分類特征,評分則作為分類標簽。
我選了繡春刀(2014年最喜歡的電影)作目標,定義的爬蟲類如下:
簡短幾十行代碼之后你已經(jīng)能夠開始抓取一部電影的全部短評和評分了。在這之前,記得在settings里加一個DOWNLOAD_DELAY = 2,不然的話爬不到一半就會被豆瓣給禁了。 情感分類 特征轉(zhuǎn)化 當我們得到一條影評時,能夠通過某種算法自動地預(yù)測出該影評是否時積極還是消極?計算機不會理解人類的文字符號,有沒有一種方法能夠?qū)⑽淖洲D(zhuǎn)化為機器能夠理解的信息?舉簡單的線性回歸的例子,在作回歸分析時我們都會利用對回歸預(yù)測有幫助的變量作為特征(features), 這里我們主要將文字作為含有可用信息的特征。 通常多是的分類算法都需要量化的具有固定長度的特征向量,原始文本需要一步轉(zhuǎn)換之后才能“喂給”這些分類算法。這也是情感分類問題與一般的分類問題相比不同的地方。 最直接也最常規(guī)的一種轉(zhuǎn)化方法是計算單詞(單個字) 在文本中的出現(xiàn)頻率,也就是: 將一段文本劃分成若干其組成詞語,比如對英文我們可以以空格和標點符號分割單詞,對中文我們可以利用一些完備的詞語庫。 計算每個詞語在一段文本中的出現(xiàn)次數(shù) 這樣,每單個詞語的頻率就代表一個變量(特征), 每一條短評代表一個樣本。
成功將文本轉(zhuǎn)化為特征陣之后,你可能會想,一些經(jīng)常用到的詞例如“的“,”我“,實際上對判斷喜好的幫助應(yīng)該不大,但是它們的高頻率可能會蓋過那些真正重要的詞,從而降低特征的預(yù)測能力。TF-IDF 是一種常用的再權(quán)重方法。主要思想是:如果某個詞或短語在一篇文章中出現(xiàn)的頻率TF高,并且在其他文章中很少出現(xiàn),則認為此詞或者短語具有很好的類別區(qū)分能力,適合用來分類。 N-grams 即使是加了權(quán)重以后,這種以單個詞語作特征的方式還是沒辦法很好的傳遞句意啊。一段文字的意思不僅取決于其組成的詞語,也在于這些詞語間的排列和依賴關(guān)系。就像“我愛她”和“她愛我”由三個相同的字組成,但是字的順序不同表達的意思也不一樣。 一種解救的方法是利用N-gram。這里的N指的是一組詞語的數(shù)量。與其用一個詞語代表一個特征,我們可以將兩個甚至更多的詞語連在一起組成一個特征。背后的思路也很簡單:比較兩個文本,如果它們有更多的子集相同,那它們就更加相似。上面的例子里,除了“我”,“有”,“小毛驢”,“北京”之外,對一個2-gram,我們還會有“我有”,”有小毛驢“,”有北京“這樣的組合出現(xiàn)在特征矩陣中。 重新回到 繡春刀… 我一共爬取了16587條短評,比總的短評數(shù)量要少,因為中途斷網(wǎng)實際上爬取了一半左右的短評,更重要的原因是一些短評沒有評級所有并沒有使用。根據(jù)打星的數(shù)量,三個星及以下視為消極評價,四個星及以上是為積極評價。 基本的操作流程是:
使用了幾個文本分類里表現(xiàn)較好的分類器:Naive Bayes, Stochastic Gradient Descent, Support Vector
Machine, Random Forest.
最好的分類器是Bernoulli Naive Bayes,交叉驗證估計的預(yù)測準確率為0.67。 至于分類器的比較,變量篩選,參數(shù)選擇等內(nèi)容已經(jīng)超出了這篇文章覆蓋的范圍。 總結(jié) 1. 介紹了情感分析的動機和定義 2. 情感分析的前提是意見型數(shù)據(jù),而爬蟲能夠獲取大量評論及文本型數(shù)據(jù),于是我們介紹了流行的Python爬蟲工具scrapy,嘗試從頭開始學(xué)起寫一個簡單的爬蟲 3. 文本分類的一個困難在于將文本轉(zhuǎn)化為能“喂給”分類算法的特征陣,最直接的方法是將文本分隔成一組詞語并計算詞語出現(xiàn)的頻率 4. 利用N-gram試圖抓取詞語間的順序和依賴關(guān)系,盡可能減少語義的流失。 本文出自大數(shù)據(jù)技術(shù)檸檬派http://www. 請務(wù)必保留此出處 ,否則將追究法律責任! |
|