這篇短文的目的是分享我這幾天裡從頭開始學習python爬蟲技術的經驗,並展示對爬取的文字進**感分析(文字分類)的一些挖掘結果。 不同於其他專注爬蟲技術的介紹,這裡首先闡述爬取網路資料動機,接著以豆瓣影評為例介紹文字資料的爬取,最後使用文字分類的技術以一種機器學習的方式進**感分析。由於內容覆蓋面巨大,無法詳細道盡,這篇文章旨在給那些對相關領域只有少量或者沒有接觸的人乙個認知的視窗,希望激發讀者自行探索的興趣。
以下的樣本**用pyhton寫成,主要使用了scrapy, sklearn兩個庫。
所以,什麼是情感分析(sentiment analysis)?
情感分析又叫意見挖掘(opinion mining), 是乙個研究人們對某種事物,例如產品,話題,政策的意見,情緒或者態度的領域。 隨著網路上意見型資料的爆發,情感分析也被廣泛研究和應用。bing liu 的 sentiment analysis and opinion mining 對此做了比較全面的概括和案例研究,另一篇bo pang 的經典** opinion minning and sentiment analysis 則著重研究了情感分類這一問題。
python爬蟲
當然,情感分析的第一步是獲取資料,而網路尤其是社交網路是存在著豐富而易於獲得的意見型資料資源。python的開源爬蟲庫scrapy就很好用,這也是作為乙個新手上手的首選工具。scrapy wiki 提供了全面的學習資源,甚至有中文的資料和說明文件。就像我一直強調的,資料科學家是乙個要具備多領域技能的職位,以練代學不失為一種很好的途徑。我鼓勵對python爬蟲躍躍欲試的讀者不要擔心自己知識不足,這裡沒有門檻,直接上就是了。
當你讀完了上述介紹文件之後,你應該知道乙個scrapy專案的組成,抓取流程,scrapy裡每種spider的應用場景,大致了解xpath的語法規則。這樣之後你就了解到編寫乙個簡單爬蟲只需四步:
1.scrapy startproject project_name
2.定義乙個爬蟲類:
3. 在item類裡想要抓取的內容
4. scrapy crawl spider_name
我上手的第乙個例子是爬取豆瓣的影評資料,選擇豆瓣一是因為其豐富的語料資源和配備的打分體系,便於分類問題的標籤獲得。 二是可以避開賬戶登入,限制少。思路是選取一部特定的電影,然後爬取其所有的短評和評分。這樣後期文字就可以作為分類特徵,評分則作為分類標籤。 我選了繡春刀(2023年最喜歡的電影)作目標,定義的爬蟲類如下:
簡短幾十行**之後你已經能夠開始抓取一部電影的全部短評和評分了。在這之前,記得在settings裡加乙個download_delay = 2,不然的話爬不到一半就會被豆瓣給禁了。
情感分類
特徵轉化
當我們得到一條影評時,能夠通過某種演算法自動地**出該影評是否時積極還是消極?計算機不會理解人類的文字元號,有沒有一種方法能夠將文字轉化為機器能夠理解的資訊?舉簡單的線性回歸的例子,在作回歸分析時我們都會利用對回歸**有幫助的變數作為特徵(features), 這裡我們主要將文字作為含有可用資訊的特徵。 通常多是的分類演算法都需要量化的具有固定長度的特徵向量,原始文字需要一步轉換之後才能「餵給」這些分類演算法。這也是情感分類問題與一般的分類問題相比不同的地方。
最直接也最常規的一種轉化方法是計算單詞(單個字) 在文字中的出現頻率,也就是:
將一段文字劃分成若干其組成詞語,比如對英文我們可以以空格和標點符號分割單詞,對中文我們可以利用一些完備的詞語庫。
計算每個詞語在一段文字中的出現次數
這樣,每單個詞語的頻率就代表乙個變數(特徵), 每一條短評代表乙個樣本。
成功將文字轉化為特徵陣之後,你可能會想,一些經常用到的詞例如「的「,」我「,實際上對判斷喜好的幫助應該不大,但是它們的高頻率可能會蓋過那些真正重要的詞,從而降低特徵的**能力。tf-idf 是一種常用的再權重方法。主要思想是:如果某個詞或短語在一篇文章**現的頻率tf高,並且在其他文章中很少出現,則認為此詞或者短語具有很好的類別區分能力,適合用來分類。
n-grams
即使是加了權重以後,這種以單個詞語作特徵的方式還是沒辦法很好的傳遞句意啊。一段文字的意思不僅取決於其組成的詞語,也在於這些詞語間的排列和依賴關係。就像「我愛她」和「她愛我」由三個相同的字組成,但是字的順序不同表達的意思也不一樣。
一種解救的方法是利用n-gram。這裡的n指的是一組詞語的數量。與其用乙個詞語代表乙個特徵,我們可以將兩個甚至更多的詞語連在一起組成乙個特徵。背後的思路也很簡單:比較兩個文字,如果它們有更多的子集相同,那它們就更加相似。上面的例子裡,除了「我」,「有」,「小毛驢」,「北京」之外,對乙個2-gram,我們還會有「我有」,」有小毛驢「,」有北京「這樣的組合出現在特徵矩陣中。
重新回到 繡春刀…
我一共爬取了16587條短評,比總的短評數量要少,因為中途斷網實際上爬取了一半左右的短評,更重要的原因是一些短評沒有評級所有並沒有使用。根據打星的數量,三個星及以下視為消極評價,四個星及以上是為積極評價。
基本的操作流程是:
使用了幾個文字分類裡表現較好的分類器:***** bayes, stochastic gradient descent, support vector machine, random forest.
最好的分類器是bernoulli ***** bayes,交叉驗證估計的**準確率為0.67。
至於分類器的比較,變數篩選,引數選擇等內容已經超出了這篇文章覆蓋的範圍。
總結
1. 介紹了情感分析的動機和定義
3. 文字分類的乙個困難在於將文字轉化為能「餵給」分類演算法的特徵陣,最直接的方法是將文字分隔成一組詞語並計算詞語出現的頻率
4. 利用n-gram試圖抓取詞語間的順序和依賴關係,盡可能減少語義的流失
Python 情感分析
今天修改了情感分析的程式發現之前有一些不足。這個最簡單的實現乙個string情感分析的小函式,載入了積極詞典,消極詞典,程度詞典,以及一些反轉詞等的詞典。這裡我沒有做符號的分析和判斷,因為的東西暫時用不到,需要的童鞋可以自己新增。import jieba import cpickle as pick...
python 情感分析
使用庫 用python 進行機器學習及情感分析,需要用到兩個主要的程式包 nltk 和 scikit learn nltk 主要負責處理特徵提取 雙詞或多詞搭配需要使用nltk 來做 和特徵選擇 需要nltk 提供的統計方法 scikit learn 主要負責分類演算法,評價分類效果,進行分類等任務...
Python爬蟲簡介
爬蟲 一段自動抓取網際網路資訊的程式,從網際網路上抓取對於我們有價值的資訊。網頁解析器 將乙個網頁字串進行解析,可以按照我們的要求來提取出我們有用的資訊,也可以根據dom樹的解析方式來解析。網頁解析器有正規表示式 直觀,將網頁轉成字串通過模糊匹配的方式來提取有價值的資訊,當文件比較複雜的時候,該方法...