Python制作动态词频条形图的过程是怎样的

技术Python制作动态词频条形图的过程是怎样的这篇文章给大家介绍Python制作动态词频条形图的过程是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。前言”数据可视化“这个话题,相信大家并不陌

本文介绍Python如何制作动态词频条形图。内容非常详细,有兴趣的朋友可以参考一下,希望对你有帮助。

前言

“数据可视化”是一个相信大家都很熟悉的话题。在一些平台上,经常可以看到一些动态条形图的视频,大部分是某个国家GDP的变化或者不同国家的感染者数量等。

在本文中,我们将使用Python绘制一个动态词频条形图,顾名思义,就是以词频作为量化指标的动态条形图。

00-1010输入以下命令安装必要的库:

pipinstallJiashuResearchTools

pipinstalljieba

pipinstallpandas

Pinstallbar _ chart _ race

前期准备

我们这次使用的数据是短书文章的收入列表,日期范围是2020年6月20日到2021年9月18日。

Python制作动态词频条形图的过程是怎样的

从网页解析数据的过程很复杂,所以我们使用了一个简短的数据科学库JianshuResearchTools。

为了调试方便,我们使用Jupyter Notebook进行交互开发。

导入构建搜索工具并为它们设置别名:

Importjianthuresearch工具sasjrt调用接口获取2021年9月17日的数据:

Jr . rank . getarticlefprankdata(' 20210917 ')返回的数据如下:

[{ '排名' :0,

aslug':'a03adf9d5dd5 ',

标题' : '幸好你的心和我的一样',

作者_姓名' : '严阵被寒冷震惊了',

author _ avatar _ URL ' : ' https://upload . jishu . io/users/upload _ avatar/26225608/682 b 892 e-6661-4f 98-9 aab-20 b 4038 a 433 b . jpg ',

fp_to_author':3123.148,

fp_to_voter':3123.148,

total_fp':6246.297},

{ '排名' :1,

aslug':'56f7fe236842 ',

标题' : '伤疤',

作者_姓名' : '李',

author _ avatar _ URL ' : ' https://upload . jishu . io/users/upload _ avatar/26726969/058 e 18 C4-908 f-4710-8df 7-1d 34d 05 d61e 3 . jpg ',

fp_to_author':1562.198,

fp_to_voter':1562.198,

total_fp':3124.397},

(以下省略)可以看到返回的数据包括排名、标题、作者姓名、作者头像链接以及一些关于简化图书资产的信息。

我们只需要文章的标题进行统计,因此我们将上面获得的数据分配给变量raw_data,然后:

[item ['title'] foritemraw _ data]利用列表推导,我们得到文章标题的列表。

为了便于处理,我们用中间的空格连接这些数据:

quot; ".join([item["title"] for item in raw_data])

但是我们遇到了报错:

TypeError: sequence item 56: expected str instance, NoneType found

从报错信息中可以看出,我们获取到的文章标题列表中有空值,导致字符串的连接失败了。

(空值是因为作者删除了文章)

所以我们还需要加入去除空值的逻辑,代码编程这样:

" ".join(filter(None, [item["title"] for item in raw_data]))

filter 函数在第一个参数为 None 时,默认过滤掉列表中的空值。

现在我们获取到的数据如下:

'幸得君心似我心 伤痕 短篇|阿生 “我最喜爱的友友”大评选|理事会 · 中秋嘉年华,等你来! 是缘是劫无须问,石火穷年一蝶迷 职业日记|从蜜月到陌路:我和美国外教的一点事 红楼||浅谈《红楼梦》开篇一顽石 城市印象|走笔八卦城 花豹与狗的爱情终结在人与动物的战争里(以下省略)

接下来,我们需要获取时间范围内的所有数据。

查询 JRT 的函数文档可知,我们需要一个字符串类型,格式为”YYYYMMDD“的参数表示目标数据的日期。

所以我们需要写一段程序,用于实现这些日期字符串的生成,代码如下:

from datetime import date, timedelta
def DateStrGenerator():
    start_date = date(2020, 6, 20)
    after = 0
    result = None
    while result != "20210917":
        current_date = start_date + timedelta(days=after)
        result = current_date.strftime(r"%Y%m%d")
        yield result
        after += 1

接下来,我们编写一段代码,实现对这些数据的获取:

result = []
for current_date in tqdm(DateStrGenerator(), total=455):
    raw_data = jrt.rank.GetArticleFPRankData(current_date)
    processed_data = " ".join(filter(None, [item["title"] for item in raw_data]))
    result.append({"date": current_date, 
                   "data": processed_data})

这里使用 tqdm 库显示了一个进度条,非必须。

使用 Pandas 库,将我们采集到的数据转换成 DataFrame:

df = pandas.DataFrame(result)

Python制作动态词频条形图的过程是怎样的

Python制作动态词频条形图的过程是怎样的

分词

我们使用 jieba 库实现分词,先尝试对第一条数据进行处理:

jieba.lcut(df["data"][0])

使用 Python 标准库 collections 中的 Counter 进行词频统计:

Counter(jieba.lcut(df["data"][0]))

简单画个条形图:

Python制作动态词频条形图的过程是怎样的

可以看到,空格和一些标点符号,包括”的“、”我“之类无意义词汇出现频率很高,我们需要将它们剔除出去。

我们构建一个存放停用词的 txt 文档,之后使用如下代码将其读取,并转换成一个列表:

stopwords_list = [item.replace("\n", "") for item in open("stopwords.txt", "r", encoding="utf-8").readlines()]

接下来,编写一个函数,实现停用词的剔除,为了方便后续的数据处理,我们也一并剔除单字和只出现一次的词语:

def process_words_count(count_dict):
    result = {}
    for key, value in count_dict.items():
        if value < 2:
            continue
        if len(key) >= 2 and key not in stopwords_list:
            result[key] = value
    return result

另外,我们使用 jieba 库的 add_word 函数将一些简书中的组织名和专有名词添加到词库中,从而提高分词的准确性,代码如下:

keywords_list = [item.replace("\n", "") for item in open("keywords.txt", "r", encoding="utf-8").readlines()]
for item in keywords_list:
    jieba.add_word(item)

经过一番处理,现在分词效果有了明显的改善:

Python制作动态词频条形图的过程是怎样的

最后,用这段代码对所有数据进行分词,并将结果保存到另一个 DataFrame 中:

data_list = []
date_list = []
for _, item in df.iterrows():
    date_list.append(datetime(int(item["date"][0:4]), int(item["date"][4:6]), int(item["date"][6:8])))
    data_list.append(process_words_count(Counter(jieba.lcut(item["data"]))))
processed_df = pandas.DataFrame(data_list, index=date_list)

我最终得到的结果是一个 455 行,2087 列的 DataFrame。

Python制作动态词频条形图的过程是怎样的

筛选与可视化

这样多的数据,其中很大一部分都不能代表整体情况,所以我们需要进行数据筛选。

使用以下代码,统计所有列数值的总和,即每个关键词在全部数据中出现的次数,存储到名为 sum 的行中:

try:
    result = []
    for i in range(3000):
        result.append(processed_df.iloc[:, i].sum())
except IndexError:
    processed_df.loc["sum"] = result

Python制作动态词频条形图的过程是怎样的

运行以下代码,只保留在数据集中出现 300 次以上的关键词:

maller_df = processed_df.T[processed_df.T["sum"] >= 300].T
smaller_df = smaller_df.drop(labels="sum")
smaller_df.columns

现在,数据集中的列数减少到了 24 个,可以进行可视化了。

不要忘记先导入模块:

import bar_chart_race as bcr

使用此模块需要先安装 ffmpeg,这方面教程可以自行查找。

另外,为了支持中文显示,我们需要打开这个模块下的 _make_chart.py 文件,在 import 之后增加以下两行代码:

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

这两行代码将会把 matplotlib 的默认字体替换成支持中文显示的字体。

最后,使用一行代码完成可视化:

bcr.bar_chart_race(smaller_df, steps_per_period=30, period_length=1500, title="简书文章收益排行榜可视化", bar_size=0.8, fixed_max=10, n_bars=10)

在这行代码中,我们使用 smaller_df 作为数据集,输出文件为 output.mp4,帧率设置为 30,每行数据显示 2 秒。

由于数据较多,这一步时间较长,而且会占用较多内存。运行结束后,即可在目录中找到输出的文件。

Python制作动态词频条形图的过程是怎样的

关于Python制作动态词频条形图的过程是怎样的就分享到这里了,希望

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/84021.html

(0)

相关推荐

  • 计算机速成课 第八集 指令和程序

    技术计算机速成课 第八集 指令和程序 计算机速成课 第八集 指令和程序1. 给 CPU 一些指令来运行CPU 强大,是因为可编程
    写入不同指令,就会执行不同任务
    是一块硬件,可以被软件控制2. 举例:0

    礼包 2021年12月9日
  • 不胫而走的拼音,成语里最后一个字是走的有哪些

    技术不胫而走的拼音,成语里最后一个字是走的有哪些不胫而走:【基本解释】:没有腿却能跑不胫而走的拼音。比喻事物无需推行,就已迅速地传播开去。【拼音读法】:bù jìng ér zǒu
    【使用举例】:袁伯珍慌忙把家里所

    生活 2021年10月29日
  • php png失真的解决办法是什么

    技术php png失真的解决办法是什么这篇文章主要介绍“php png失真的解决办法是什么”,在日常操作中,相信很多人在php png失真的解决办法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望

    攻略 2021年10月23日
  • debug R命令如何修改寄存器的值

    技术debug R命令如何修改寄存器的值这期内容当中小编将会给大家带来有关debug R命令如何修改寄存器的值,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。    IDE : Masm

    攻略 2021年11月11日
  • 毛线鞋,3岁小孩毛线棉鞋怎么织

    技术毛线鞋,3岁小孩毛线棉鞋怎么织你好毛线鞋:很高兴回答“3岁小孩毛线棉鞋怎么织”这个问题。1.准备工具/原料:棒针、毛线。2、方法/步骤:起针30针,双色线交替编织20行.织21行的时候,鞋口留5针不织,从织22行开始

    生活 2021年10月31日
  • java移位运算是什么意思(java中位运算必须是什么类型)

    技术Java中的位运算与移位运算有哪些本篇内容介绍了“Java中的位运算与移位运算有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,

    攻略 2021年12月23日