使用Python分析《我不是藥神》豆瓣電影短評

小爬怡情,中爬傷身,強爬灰灰。爬蟲有風險,使用請謹慎,多是這兩天爬豆瓣電影爬多了,今天早上登陸的時候提示號被封了(我用本身賬號爬的,是找死呢仍是在找死呢 ...),好在後面發完短信後又解封了,^_^。html

以前的文章中,已把電影短評數據裝進了Mongo中,今天把數據取出來簡單分析一下,當下最火的作法是進行詞頻統計並生成詞雲,今天說的就是這個。python

讀取Mongo中的短評數據,進行中文分詞

不知道什麼緣由,我實際爬下來的短評數據只有1000條(很少很多,剛恰好),我總以爲有什麼不對,但我重複爬了幾回後,確實只有這麼多。多是我爬蟲寫的有什麼不對吧,文末附源碼連接,有興趣的去看看, 歡迎拍磚(輕拍)。git

import pymongo
import jieba
from jieba import analyse

# https://pypi.org/project/pymongo/
# http://github.com/mongodb/mongo-python-driver
from matplotlib import pyplot
from wordcloud import WordCloud

text = None

with pymongo.MongoClient(host='192.168.0.105', port=27017) as client:
    # 獲取集合
    comments = client.douban.movie_26752088_comments

    # 不知道爲何爬蟲只取到了1000條評論~
    print('count:', comments.estimated_document_count())

    # pymongo.cursor.Cursor
    cursor = comments.find()

    # 遍歷數據,這裏只遍歷短評數據(好在數據量並不太大)
    text = ''.join(map(lambda doc: doc.get('comment'), cursor))

# 對短語數據文本進行分詞
# 添加自定義分詞
[jieba.add_word(k) for k in []]

# 取Top50的詞生成詞雲
# https://github.com/fxsjy/jieba#基於-tf-idf-算法的關鍵詞抽取
tags = analyse.extract_tags(text, topK=50, withWeight=False)
new_text = ' '.join(tags)
print(new_text)

中文分詞部分,默認分詞效果已經很是好了,我未添加自定義字典,這裏感謝一下 結巴 的做者github

對分詞結果取Top50生成詞雲

也感謝一下 word_cloud 的做者,^_^算法

# 對分詞文本生成詞雲
# 生成詞雲,須要指定支持中文的字體,不然沒法生成中文詞雲
wc = WordCloud(
    # 設置詞雲圖片背景色,默認黑色
    # background_color='white',
    # 設置詞雲最大單詞數
    max_words=200,
    # 設置詞雲中字號最大值
    # max_font_size=80,
    # 設置詞雲圖片寬、高
    width=768,
    height=1024,
    # 設置詞雲文字字體(美化和解決中文亂碼問題)
    font_path=r'../example/fonts/FZXingKai-S04S.TTF'
).generate(new_text)

# 繪圖(標準長方形圖)
pyplot.imshow(wc, interpolation='bilinear')
pyplot.figure()
pyplot.axis('off')
# 將圖片輸出到文件
wc.to_file(r'./images/wc.png')

生成詞雲效果mongodb

wc.png

看來網上關於 我不是藥神 vs 達拉斯 的爭論很熱啊。關於詞頻統計就這些,代碼中也會完成一些其它的分析任務(其實都是一些很簡單的任務,純練手用),後續會持續更新。api

其它分析任務

點贊數Top10

import pymongo

# 取點贊最多的前10條短評
with pymongo.MongoClient(host='192.168.0.105') as client:
    comments = client.douban.movie_26752088_comments

    for doc in comments.find().sort([('vote', -1)]).limit(10):
        print('author = {}, date = {}, vote = {}, comment = {}'.format(
            doc.get('author'),
            doc.get('date'),
            doc.get('vote'),
            doc.get('comment')
        ))
  1. author = 忻鈺坤, date = 2018-07-04 00:00:00, vote = 28129, comment = 「你敢保證你一生不得病?」純粹、直接、有力!經常感嘆:電影只能是電影。但每看到這樣的佳做,又感慨:電影不僅是電影!由衷的但願這部電影大賣!成爲話題!成爲榜樣!成爲國產電影最該有的可能。
  2. author = 沐子荒, date = 2018-07-03 00:00:00, vote = 27237, comment = 王傳君全部不被外人理解的堅持,都在這一刻獲得了完美釋放。他不是關穀神奇,他是王傳君。 你看,即便依舊爛片如雲,只要還有哪怕極少的人堅持,中國影視也終於仍是從中生出了茁壯的根。 我不是藥神,治很差這世界。但能改變一點,總歸是會好的。
  3. author = 凌睿, date = 2018-06-30 00:00:00, vote = 18304, comment = 別說這是「中國版《達拉斯買傢俱樂部》」了,這是中國的真實事件改編的中國電影,是屬於咱們本身的電影。不知道就去百度一下「陸勇」,他賣印度抗癌藥的時候《達拉斯買傢俱樂部》還沒上映呢。因此別提《達拉斯買傢俱樂部》了,只會顯得你無知。(別私信我了,我800年前就知道《達拉斯》也是真事改編)
  4. author = 徐若風, date = 2018-06-06 00:00:00, vote = 16426, comment = 放豆瓣語境下,是部時至今日終於拍出來的國產「高分韓國電影」——拿現實題材拍商業類型片,社會性意義擺在那,羣戲也處理得至關不錯。對咱們國家而言,這樣的電影多一部是一部,走一步是一步。
  5. author = 桃桃淘電影, date = 2018-06-19 00:00:00, vote = 13337, comment = 最大的病,實際上是窮病。真的被感動了,總體都很成熟,也有些許韓片的影子。幾個演員表演都很是出色。可看性和內在的表達都不錯。這個世界最荒誕在於,越貼近真實,真實越荒誕。人這一輩子,太不易了。最後,王傳君,加油哦!
  6. author = 遠世祖, date = 2018-06-30 00:00:00, vote = 9102, comment = 文牧野眼睛太毒了,觀衆的笑點、淚點、痛點被他緊緊抓住,徐崢如今不拼演技開始掏心炸肺放脫自我了,藥物在中國絕對是個「不可說」,但這個電影說了它能說的,也不顯山不漏水的說了它所不能說的,講的是現實,但看過電影以後纔會明白實際上是超現實,2018最佳!
  7. author = 影志, date = 2018-06-19 00:00:00, vote = 7076, comment = 「從此都會愈來愈好吧,但願這一天早點來」口罩成爲符號,不是霧霾,而是人性的儀式,結尾居然看到《辛德勒名單》同樣的救贖。通俗感人,上海電影節首映哭倒一片,基於真實事件改編的社會意義加分,或許《我不是藥神》之於中國,就像《摔跤吧爸爸》之於印度吧…能看到就不錯。「其實只有一種病:窮病」
  8. author = Noodles, date = 2018-07-03 00:00:00, vote = 6926, comment = 人生建議:別買零食,吃不下的。
  9. author = 哪吒男, date = 2018-06-25 00:00:00, vote = 6211, comment = 最喜歡王傳君的表演啊,幾乎全部淚點都給他了!!而他曾經的同伴們,下月繼續拿《愛情公寓》電影版面對觀衆。這個圈子裏仍是有不愛賺快錢的年輕演員,真好。
  10. author = 開開kergelen, date = 2018-07-04 00:00:00, vote = 5549, comment = 小時候路過一家藥店,門口的對聯寫着「只願世間無疾病,何愁架上藥染塵」

15天評論量分佈、走勢

# 每日評論數,基於今生成日期評論走勢圖(用Excel生成的 ^_^)
from datetime import datetime

import pymongo
from bson import Code

# http://api.mongodb.com/python/current/
# http://api.mongodb.com/python/current/api/pymongo/collection.html#pymongo.collection.Collection.map_reduce

with pymongo.MongoClient(host='192.168.0.105') as client:
    comments = client.douban.movie_26752088_comments

    fn_map = Code("""
        function () {
            if (this.date != null) {
                emit(this.date, 1);
            }
        }
    """)

    fn_reduce = Code("""
        function (key, values) {
            var total = 0;
            for (var i = 0; i < values.length; i++) {
                total += values[i];
            }
            return total;
        }
    """)

    # pymongo.collection.Collection
    results = comments.map_reduce(fn_map, fn_reduce, out="mr_results")
    # 取最近15天數據
    for col in results.find().sort([('_id', -1)]).limit(15):
        # 格式化輸出
        print(col['_id'].strftime('%Y-%m-%d'), '\t', int(col['value']))

    # 刪除生成的結果集合
    client.douban.mr_results.drop()

工程源碼,歡迎 Star / Fork

相關文章
相關標籤/搜索