从NLP视角看电视剧《狂飙》,会有什么发现?

news2024/11/26 7:47:36

文章目录

    • 1、背景
    • 2、数据获取
    • 3、文本分析与可视化
      • 3.1 短评数据预处理
      • 3.2 词云图可视化
      • 3.3 top关键词共现矩阵网络
      • 3.4 《狂飙》演职员图谱构建
    • 4、短评相关数据分析与可视化
    • 5、总结


原文请关注:实用自然语言处理

作者:风兮

建议查看原文: https://mp.weixin.qq.com/s/nURcYKN6vRBKjbMXAUbEng


关键词: 爬虫、文本数据预处理、数据分析、可视化、自然语言处理、pyecharts

摘要: 本文主要内容,获取解析豆瓣《狂飙》的短评相关数据和演职员信息,在数据预处理后,进行简单的数据分析和可视化展示。

本文全部代码路径
https://github.com/fengxi177/pnlp2023/tree/main/chapter_1


1、背景

前文《文本数据预处理:可能需要关注这些点》分享了关于文本预处理的理论知识,本文将分享一份示例demo。正好,碰到了热议的电视剧《狂飙》。因此,本文打算从自然语言处理、数据分析和可视化的角度来凑个热闹(原本计划在大结局当天发出来文章,可惜,大结局有一段时间了。拖延了,哈哈哈)。

2、数据获取

既然要做电视剧《狂飙》相关的nlp数据分析,那么就先选定数据目标站。经过一圈搜寻对比,发现还是豆瓣中的评论更为客观,参与群体数量多,见解更丰富专业,哈哈哈。因此,本文将获取https://movie.douban.com/subject/35465232/ 页面中的相关数据。

截止2023年2月28日,豆瓣中电视剧《狂飙》的短评已经22w+(2023年2月6日13w+,评论热度依然很高)。通过翻看短评数据,可以发现不登录状态最多可以获取220条数据,登录后最多可以获取600条数据。一般,可以通过cookie和selenium的方式实现登录,网上有参考教程,自行搜集。

在这里插入图片描述
不过,在不登录状态下,通过URL参数设置分析,发现各参数下都可以获得220条数据。因此,本文只获取不登录状态下的数据。具体的,通过好评、中评和差评参数percent_type设置分别获取220条短评及其相关数据。(特别的,仔细观察URL的参数设置还可以获得更多的数据哦。)


def parse_comments(url):
    """
        解析HTML页面,获得评论及相关数据
    :param url:
    :return:
    """
    html = get_html(url)
    soup_comment = BeautifulSoup(html, 'html.parser')

    # 所有获取的一页数据
    data_page = []

    # 提取评论
    comments_all = soup_comment.findAll("div", "comment-item")
    for comments in comments_all:
        try:
            # 解析评论及相关数据
            comment_info = comments.find("span", "comment-info")  # 评论id相关信息
            comment_vote = comments.find("span", "comment-vote")  # 评论点赞信息
            comment_content = comments.find("span", "short").text.replace("\n", "")  # 评论内容

            # 提取需要的各字段信息
            info_list = comment_info.findAll("span")
            star_rating = info_list[1]

            user_name = comment_info.find("a").text
            video_status = info_list[0].text  # 电视剧观看状态
            comment_score = int(star_rating["class"][0][-2:])  # 评论分值
            comment_level = star_rating["title"]  # 评论等级
            comment_time = info_list[2].text.replace("\n", "").replace("    ", "")  # 评论时间
            # print(info_list)
            comment_location = info_list[3].text  # 评论位置

            comment_vote_count = int(comment_vote.find("span", "votes vote-count").text)  # 评论被点赞数

            # 获取的一条数据
            # ["用户名", "电视剧观看状态", "评论分数", "评论等级", "评论时间", "评论位置", "评论点赞数", "评论"]
            data_row = [user_name, video_status, comment_score, comment_level,
                        comment_time, comment_location,
                        comment_vote_count, comment_content]
            data_page.append(data_row)
        except:
            # 跳过解析异常的数据
            continue

    return data_page

完整代码:请查看get_comments_data.py文件

此外,本文还获取了《狂飙》的演职员信息数据,页面解析的代码片段如下。


    html = get_html(url)
    soup_info = BeautifulSoup(html, 'html.parser')

    # 获得的结果信息
    result_info_dict = {}

    # 提取评论
    info_all = soup_info.findAll("div", "info")
    for info in info_all:
        info_name = info.find("span", "name").text
        info_role = info.find("span", "role").text
        info_works_list = info.find("span", "works").findAll("a")

完整代码:请查看get_celebrity_info.py文件。

3、文本分析与可视化

3.1 短评数据预处理

文本数据预处理的详细介绍,可以参考文章《文本数据预处理:可能需要关注这些点》。在实际的应用分析中,数据预处理并不是等数据完全收集完毕后一蹴而就的。通常,在合适的时候进行必要的处理是十分必要的,比如本文在解析爬取数据的时候会进行一些替换和数据转换操作。

3.2 词云图可视化

词云图作为一种直观、简洁、易于理解的数据可视化方法,通过词云图文字大小、颜色、字体等方式的展示,人们可以迅速了解文本数据中的关键词和主题等有用信息。

本文利用pyecharts生成短评的词云图,其他也可以通过wordcloud包绘制词云图。特别的,可以通过背景图设置生成各种形状的词云图。

在这里插入图片描述

3.3 top关键词共现矩阵网络

文本中关键词是很重要的特征,关键词共现矩阵网络是一组文本中词或短语之间的共现关系网。该网络可以帮助我们发现文本中的潜在主题、领域和关联性,也可以用于文本数据可视化和分析。共现网络中,每个关键词被表示为一个节点,词之间的共现关系被表示为边,关键词之间的共现频率表示权重。我们可以使用网络分析算法挖掘文本中的相关主题和模式。

利用pyecharts可视化短评top 2000关键词的词共现结果如图所示。
在这里插入图片描述
Gephi是一个常用的网络分析和可视化软件,本文同时用gephi可视化了一组top 2000关键词的词共现关系图如下。
在这里插入图片描述

在这里插入图片描述

**Gephi可视化结果**

3.4 《狂飙》演职员图谱构建

知识图谱是一种将实体、属性、关系等知识以图谱的形式进行表示和存储的技术,可以帮助人们更加直观地了解知识的关联和组织方式。在影视、音乐、文学等领域,知识图谱也被广泛应用于作品分析、人物关系探究方面。

知识图谱的构建需要经过多个阶段,包括实体识别、关系抽取、实体链接等步骤。本文通过爬取《狂飙》的演职员信息,进行数据清洗和处理后,使用pyecharts构建了一个包含演员、导演、编剧、代表作、《狂飙》中的饰演人物等实体,以及他们之间关系的《狂飙》演职员知识图谱,用于展示演职员、作品及饰演人物之间的关系。通过图谱关系展示,可以直观的了解到演员、导演、编剧等之间的合作关系。这些关系的分析可以帮助我们更好地了解影视行业的人际关系网络,感兴趣的朋友可以继续扩展该图谱,探索更多的应用场景。
在这里插入图片描述

《狂飙》演职员关系图谱(全部)

在这里插入图片描述

《狂飙》演职员关系图谱(姓名->角色)

在这里插入图片描述

《狂飙》演职员关系图谱(姓名->代表作)

图谱构建的代码如下:

def generate_celebrity_graph():
    """
        构建演职员关系图谱
    :return:
    """
    df = pd.read_csv("./data/狂飙演职员信息表.csv")
    data = df.values.tolist()

    # 转换格式
    nodes = []
    links = []
    nodes_name = []

    symbolSize_dict = {"姓名": 30, "角色": 20, "饰演人物": 20, "代表作": 20}
    categories = [{"name": x} for x in symbolSize_dict.keys()]

    for row in data:
        # 姓名、角色(";"分割多个)、饰演人物(可能为空)、代表作(";"分割多个)
        name, role, role_to_play, works = row
        role_list = role.split(";")
        works_list = works.split(";")

        if name not in nodes_name:
            nodes_name.append(name)
            # 一个节点
            node = {
                "name": name,
                "symbolSize": symbolSize_dict["姓名"],
                "category": "姓名",
            }
            nodes.append(node)

        for role_temp in role_list:
            if role_temp not in nodes_name:
                nodes_name.append(role_temp)
                node = {
                    "name": role_temp,
                    "symbolSize": symbolSize_dict["角色"],
                    "category": "角色",
                }
                nodes.append(node)

            link = {
                "source": name,
                "target": role_temp
            }
            links.append(link)

            if role_temp == "演员":
                if role_to_play not in nodes_name:
                    nodes_name.append(role_to_play)
                    node = {
                        "name": role_to_play,
                        "symbolSize": symbolSize_dict["饰演人物"],
                        "category": "饰演人物",
                    }
                    nodes.append(node)

                link = {
                    "source": name,
                    "target": role_to_play
                }
                links.append(link)

        for works_temp in works_list:
            if works_temp not in nodes_name:
                nodes_name.append(works_temp)
                if works_temp == "狂飙":
                    node = {
                        "name": works_temp,
                        "symbolSize": 50,  # 特别设置
                        "category": "代表作",
                    }
                else:
                    node = {
                        "name": works_temp,
                        "symbolSize": symbolSize_dict["代表作"],
                        "category": "代表作",
                    }
                nodes.append(node)

            link = {
                "source": name,
                "target": works_temp
            }
            links.append(link)

    c = (
        Graph(init_opts=opts.InitOpts(theme=ThemeType.CHALK, width="1500px", height="1000px"))
        .add(
            "",
            nodes,
            links,
            categories,
            repulsion=1000,
            linestyle_opts=opts.LineStyleOpts(curve=0.6),
        )
        .set_global_opts(
            legend_opts=opts.LegendOpts(pos_left=100, pos_top=350, orient="vertical"),
            title_opts=opts.TitleOpts(title="人物关系图谱"),
        )
        .render("./result/演职员图谱.html")
    )
    print("演职员关系图谱,保存路径为:./result/演职员图谱.html")

4、短评相关数据分析与可视化

在获取评论的时候,顺便获取了关于评分、评论时间、评论位置和评论点赞数等相关数据。本文对评论位置与评论数量进行了统计分析,并将结果利用pyecharts进行了可视化展示。由柱状图可以直观看到获取评论数据量与地域之间的分布。此外,如感兴趣,还可以对“评分与时间”、“评分与位置”、“评分与点赞数”等关系进行分析,绘制折线图、饼图、地图等可视化效果。

在这里插入图片描述

5、总结

本文通过获取和解析豆瓣电视剧《狂飙》的短评和演职员信息,对这部电影进行了简单的数据分析和可视化展示。感兴趣的朋友,可以继续发散思维、扩展数据,探索发现更多的数据分析和可视化结果。


欢迎关注:实用自然语言处理

原文首发于:https://mp.weixin.qq.com/s/nURcYKN6vRBKjbMXAUbEng


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/384994.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux下软件部署安装管理----rpmbuild打包rpm包部署安装

来源:微信公众号「编程学习基地」 文章目录1.安装rpmbuild2.rpm包制作打包rpm包3.rpm包安装4.rpm包卸载1.安装rpmbuild yum install rpmbuild yum install rpmdevtools创建rpm包管理路径,生成rpm相关目录 RPM打包的时候需要编译源码,还需要…

基于Cortex-M7内核STM32F767NIH6,STM32F767VGT6,STM32F767VIT6嵌入式技术资料

STM32F7 32 位 MCUFPU 基于高性能的 ARMCortex-M7 32 位 RISC 内核,工作频率高达 216MHz。Cortex-M7 内核具有单浮点单元(SFPU)精度,支持所有 ARM 单精度数据处理指令与数据类型。同时执行全套 DSP 指令和存储保护单元(MPU)&#…

【完美解决】应用程序无法正常启动(0xc000007b)请单击“确定”关闭应用程序

年期安装CorelDRAW X8 (64-Bit),安装完成之后运行一点毛病都没有,可是过了两三个月,再打开就出现“应用程序无法正常启动(0xc000007b)请单击“确定”关闭应用程序”这个提示框,如下图示 出现这个问题我就上网查找,无非…

Java学习笔记 --- JavaScript

一、JavaScript介绍 JavaScript语言诞生主要是完成页面的数据验证。因此它运行在客户端,需要运行浏览器来解析执行JavaScript代码。JS是Netcape网景公司的产品,最早取名为LiveScript;为了吸引更多java程序员。更名为 JavaScript JS是弱类型&…

File 文件操作

File 文件操作: 一、常用方法: 方法类型描述public File(String pathname)构造给定一个要操作文件的完整路径public File(File parent, String child)构造给定要操作文件的父路径和子文件名称public boolean createNewFile() throws IOExce…

hexo部署github搭建个人博客 完整详细带图版(更新中)

文章目录0. 前置内容1. hexo创建个人博客2. GitHub创建仓库3. hexo部署到GitHub4. 常用命令newcleangenerateserverdeploy5. 添加插件5.1 主题5.2 博客基本信息5.3 创建新的菜单5.4 添加搜索功能5.5 添加阅读时间字数提示5.6 打赏功能5.7 切换主题5.8 添加不蒜子统计5.9 添加百…

小程序的拉流组件live-player的使用

前言: 我们在小程序中实现音视频-直播/录播 的播放时候,会使用到微信官方提供的两个组件,推流组件和拉流组件,这里来分享下他的拉流组件的使用和具体需要注意的点。 效果图: 1、拉流状态code日志 2、代码使用截图&am…

深度学习 Day26——利用Pytorch实现天气识别

深度学习 Day26——利用Pytorch实现天气识别 文章目录深度学习 Day26——利用Pytorch实现天气识别一、前言二、我的环境三、前期工作1、导入依赖项和设置GPU2、导入数据3、划分数据集四、构建CNN网络五、训练模型1、设置超参数2、编写训练函数3、编写测试函数4、正式训练六、结…

前端利用emailjs发送邮件

最近有一个需求,前端发送一个form表单到一个邮箱,找了一圈发现emailjs还不错就使用他了。首先emailjs官网注册一个账号注册完之后创建一个邮件服务(我这里使用的是谷歌邮箱)链接谷歌邮箱账户 然后创建服务接下来就要创建一个邮件的…

浅谈入门Servlet注解式开发

Servlet3.0版本之后,推出了Servlet基于注解式开发。 优点:开发效率高,直接在java类上使用注解进行标注,可直接省略WEB.xml文件配置import javax.servlet.annotation.WebServlet; WebServlet 使用WebServlet注解标注 WebServlet的…

五子棋的设计与实现

术:Java等摘要:五子棋是一种两人对弈的纯策略型棋类游戏,非常容易上手,老少皆宜。为了更好的推广五子棋,研究简单的人工智能方式,运用Java开发五子棋游戏。主要包含了人机对战,棋盘初始化&#…

中国跻身量子计算第一梯队,为何它是硬科技必争之地?丨两会唠科

科技云报道原创。 “两会唠科”是由腾讯科技推出的两会特别策划,重点讲述中国科技名片。本期与科技云报道联合出品,聚焦中国量子计算研究成果和相关进展。 全球越来越多的国家加入到量子科技领域的竞赛当中,争夺下一步的技术战略制高点。 今…

【论文随笔】Transfer of temporal logic formulas in reinforcement learning

Zhe Xu and Ufuk Topcu. 2019. Transfer of temporal logic formulas in reinforcement learning. In Proceedings of the 28th International Joint Conference on Artificial Intelligence (IJCAI’19). AAAI Press, 4010–4018. 这是一篇将inference和learning结合起来的文章…

Selenium如何隐藏浏览器页面?

Selenium隐藏浏览器页面 背景 在工作,学习中,我们常常会使用selenium来获取网页上的数据,编完完整程序之后,实现真正意义上的自动化获取,此时我们会发现在运行中往往会弹出浏览器页面,在调试过程中&…

Java程序的逻辑控制

一、顺序结构 顺序结构比较简单,如果我们按照代码书写的顺序一行一行执行,将会是这样的: System.out.println("aaa"); System.out.println("bbb"); System.out.println("ccc"); // 运行结果 aaa bbb ccc 如…

网络基础服务器 与SMP、NUMA、MPP 三大体系结构科普

OSI和TCP/IP是很基础但又非常重要的知识,很多知识点都是以它们为基础去串联的,作为底层,掌握得越透彻,理解上层时会越顺畅。今天这篇网络基础科普,就是根据OSI层级去逐一展开的。01计算机网络基础01 计算机网络的分类按…

JVM—类加载子系统

JVM细节版架构图 ​ 本文针对Class Loader SubSystem这一块展开讲解类加载子系统的工作流程 类加载子系统作用 1.类加载子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识即16进制CA FE BA BE; 2.加载后的Class类信息…

Flink SQL Checkpoint 学习总结

前言 学习总结Flink SQL Checkpoint的使用,主要目的是为了验证Flink SQL流式任务挂掉后,重启时还可以继续从上次的运行状态恢复。 验证方式 Flink SQL流式增量读取Hudi表然后sink MySQL表,任务启动后处于running状态,先查看sin…

IDEA 断点总是进入class文件没有进入源文件解决

前言 idea 断点总是进入class文件没有进入源文件解决 问题 在源文件里打了断点,断点模式启动时却进入了class文件里的断点,而没有进入到java源文件里的断点。 比如:我在 A.java 里打了断点,调试时却进入到了 jar 包里的 A.clas…

基于ensp的小型局域网网络搭建及需求分析

一 需求分析本实验的目的在于建立小型局域网。由于公司由财政部、人事部、科技部三个部门组成,分布在同一个交换机下。设计以下网络:三个个部门使用两台交换机连接,然后连接到汇聚交换机,再通过路由器与外网以及其他部门网络相连。…