• 影评分析第1篇 电影《无双》


    1.电影《无双》-写在前面

    本套教程,全部基于相同的套路,为的是告诉你python如何入门数据分析,所以每一篇博客的难度都不大,本系列的博客每周更新1~2篇。

    本篇文章仅供Python新手入门学习使用,展示一下求生欲。

    在这里插入图片描述
    今天爬取的是现在电影《无双》 目前评论数据最好爬取的应该还是猫眼,其他的限制太多。猫眼在爬取的时候,如果你去搜索,基本都是在爬取
    http://m.maoyan.com/mmdb/comments/movie/342166.json?_v_=yes&offset=30&startTime=2018-10-12%2010%3A14%3A20 这个地址。

    分析这个地址,324166.json 是影片ID,offset=30 这个非常重要是,是按照15的倍数进行叠加的,但是尴尬的是,当你不断叠加之后,发现到1000,他就叠加不下去了,应该是猫眼限制了一下数据。

    所以转变一下思路就好了

    我们把offset锁死在0 然后修改开始时间 startTime 每次获取15条就好,一直到影片的上映日期。写完这篇文章之后,这个口不会也被猫眼封死吧。

    数据的爬取代码,自己去github上面取就可以了,这部分采用的是单线程,爬被封IP,所以不再赘述
    主要展示一些图表分析。

    2.电影《无双》-拿到的数据

    首先给大家看一下,拿到的数据,分别是用户id 用户昵称 级别 城市 评论内容 评分 评论时间

    在这里插入图片描述

    3.电影《无双》-数据分析

    先看一下最直观能看到的,评星比例,下面的代码都是基于 pyecharts 编写的,官网教程在这个地方 http://pyecharts.org/#/zh-cn/prepare?id=%e5%ae%89%e8%a3%85-pyecharts
    数据有了 先看一下评星,这个最直观的能评价这部电影好不好了

    代码如下,里面我使用了pandas操作数据

    tips 如果报错,注意按照官网安装相关库,还有这个官网没有提到的 pip install pyecharts-snapshot
    下面的代码中,使用了主题,请安装 pip install echarts-themes-pypkg

    from pyecharts import Pie # 导入Pie组件,用于生成饼图
    import numpy
    import pandas as pd
    
    # pandas读取数据
    df = pd.read_csv("comments.csv",names =["id","nickName","userLevel","cityName","content","score","startTime"])
    
    attr = ["一星", "二星", "三星", "四星", "五星"]
    score = df.groupby("score").size()  # 分组求和
    
    value = [
        score.iloc[0] + score.iloc[1]+score.iloc[1],
        score.iloc[3] + score.iloc[4],
        score.iloc[5] + score.iloc[6],
        score.iloc[7] + score.iloc[8],
        score.iloc[9] + score.iloc[10],
    ]
    
    pie = Pie('《无双》评星比例', title_pos='center', width=900)
    pie.use_theme("dark")
    pie.add("评分", attr, value, center=[60, 50],radius=[25, 75], rosetype='raea', is_legend_show=True, is_label_show=True )
    pie.render('评星.html')
    
    

    很直观,无双这部电影不错,70%是5星好评
    在这里插入图片描述

    4.电影《无双》-地理位置分析

    就喜欢碰到数据中有地理坐标的,那样就可以套地图了,来吧,搞起。

    import json
    import pandas as pd
    
    from pyecharts import Style # 导入Style类,用于定义样式风格
    from pyecharts import Geo # 导入Geo组件,用于生成地理坐标类图
    df = pd.read_csv("comments.csv",names =["id","nickName","userLevel","cityName","content","score","startTime"])
    
    

    下面就开始写核心的方法,这个地方会遇到用pyecharts最常见的一个BUG
    BUG:

    报错:ValueError: No coordinate is specified for xxx(地名)
    

    原因:pyecharts的坐标文件中没有该地名,名称不一致导致的,如数据中地名为’万宁’,而坐标文件中为’万宁市’

    坐标文件所在路径:自己搜索,关键字 ........datasets/city_coordinates.json

    解决:修改坐标文件,在原位置下复制个同样的,然后修改下地名,或者自己去搜索引擎找答案,很多人可以帮助你解决。
    使用geo的时候,请注意提前把相应的模块安装好!在本文开头的位置,官方手册中有相应的提示信息。

    # 处理地名数据,解决坐标文件中找不到地名的问题
    def handle(cities):
        cities = cities.tolist()
    
        # 获取坐标文件中所有地名
        data = None
        with open(
                'C:/Users/你电脑的路径/datasets/city_coordinates.json',
                mode='r', encoding='utf-8') as f:
            data = json.loads(f.read())  # 将str转换为json
    
        # # 循环判断处理
        data_new = data.copy()  # 拷贝所有地名数据
        for city in set(cities):  # 使用set去重
            # 处理地名为空的数据
            if city == '':
                while city in cities:
                    cities.remove(city)
    
            count = 0
            for k in data.keys():
                count += 1
                if k == city:
                    break
                if k.startswith(city):  # 处理简写的地名,如 万宁市 简写为 万宁
                    # print(k, city)
                    data_new[city] = data[k]
                    break
                if k.startswith(city[0:-1]) and len(city) >= 3:  # 查找包含关系的关键字等
                    data_new[city] = data[k]
                    break
    
            # 处理不存在的地名
            if count == len(data):
                while city in cities:
                    cities.remove(city)
    
        # 写入覆盖坐标文件
        with open(
                'C:/Users/你电脑的路径/datasets/city_coordinates.json',
                mode='w', encoding='utf-8') as f:
            f.write(json.dumps(data_new, ensure_ascii=False))  # 将json转换为str
    
        return cities  # 把city返回
    
    # 生成效果图
    def render():
        city_counts = df.groupby("cityName").size()
        new_citys = handle(city_counts.index)
    
        tuple_city = list(city_counts.items())  # 将 Series 转写成 [(),(),()] 格式
    
        attr_values = []   # 为下面的绘图做准备工作
        for item in tuple_city:
            #print(item[0],end=' ')
            if item[0] in new_citys:
                attr_values.append(item)
    
    
        # 定义样式
        style = Style(
            title_color='#fff',
            title_pos='center',
            width = 1200,
            height = 600,
            background_color='#404a59',
            subtitle_color='#fff'
        )
        #
        # 根据城市数据生成地理坐标图  这个就是基本操作了
        geo = Geo('《无双》评星人位置分布', '图表来源:CSDN博客-梦想橡皮擦', **style.init_style)
        attr, value = geo.cast(attr_values)
    
        geo.add('', attr, value, visual_range=[0, 2500],type="scatter",
                visual_text_color='#fff', symbol_size=10,
                is_visualmap=True, visual_split_number=10)
        geo.render('评星人位置分布-地理坐标图.html')
    
    
    if __name__ == '__main__':
        render()
    
    

    一顿常规操作,得到如下所示图表
    在这里插入图片描述

    观影大概趋势排行,还是大城市看电影和写影评的比较多一些。

    在这里插入图片描述

    最后依旧是常规操作,看一下评论的词云就大概知道这个电影主题是干什么的了。

    import jieba # 导入jieba模块,用于中文分词
    import pandas as pd  # 导入pandas 用于数据处理
    import matplotlib.pyplot as plt # 导入matplotlib,用于生成图形
    
    from wordcloud import WordCloud, STOPWORDS,ImageColorGenerator# 导入wordcloud,用于制作词云图
    
    # 获取所有评论
    df = pd.read_csv("comments.csv",names =["id","nickName","userLevel","cityName","content","score","startTime"])
    comments = df["content"].tolist()
    
    
    # 设置分词
    comment_after_split = jieba.cut(str(comments), cut_all=False)  # 非全模式分词,cut_all=false
    words = " ".join(comment_after_split)  # 以空格进行拼接
    # # print(words)
    #
    # 设置屏蔽词
    stopwords = STOPWORDS.copy()
    stopwords.update({"电影","最后","就是","不过","这个","一个","感觉","这部","虽然","不是","真的","觉得","还是","但是"})
    
    
    bg_image = plt.imread('bg.jpg')
    #生成
    wc=WordCloud(
        width=1024,
        height=768,
        background_color="white",
        max_words=200,
        mask=bg_image,            #设置图片的背景
        stopwords=stopwords,
        max_font_size=200,
        random_state=50,
        font_path='C:/Windows/Fonts/simkai.ttf'   #中文处理,用系统自带的字体
        ).generate(words)
    
    #产生背景图片,基于彩色图像的颜色生成器
    image_colors=ImageColorGenerator(bg_image)
    #开始画图
    plt.imshow(wc.recolor(color_func=image_colors))
    #为背景图去掉坐标轴
    plt.axis("off")
    #保存云图
    plt.show()
    wc.to_file("评价.png")
    
    

    在这里插入图片描述

    总结:剧情翻转了,演技很不错,里面有画家角色等这些信息都可以直接读到,是不是看完电影,大家觉得也是如此?????

    本篇文章是 影评分析系列的第1篇,使用的套路是目前很多博主喜欢的分析方式,主要用来新手入门的,没有什么特别突出的地方。

    github地址 : https://github.com/wangdezhen/yingping.git

  • 相关阅读:
    材料订单不在IN_MO或者IN_SCFHEADER中
    FP ABPPMGR表 其它常用存储过程
    ORA-01578 ORACLE data block corrupted (file # 29, block # 2889087)
    PR合并回写
    MySQL优化
    分享一些JVM常见的面试题(转)
    怎么保证 redis 和 db 中的数据一致
    User space(用户空间) 与 Kernel space(内核空间)
    如何设计一个安全的对外接口?(转)
    Jstack命令详解
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13311588.html
Copyright © 2020-2023  润新知