Python 代码实现对《红楼梦》文本的词频统计和数据可视化

Python 代码主要实现了对《红楼梦》文本的词频统计和数据可视化

完整详细下载地址:https://download.csdn.net/download/huanghm88/89879439

python 复制代码
```python
"""  实训4 基于词频的篇章语义相似度与红楼梦内容分析   步骤3 针对红楼梦词频的数据可视化 """
# 引入 collections 包, json 包, codecs 包, jieba 包
import collections, json, codecs, jieba
# 引入tqdm循环可视化工具
from tqdm import tqdm
# 引入词云图绘制的 WordCloud 模块
from wordcloud import WordCloud
# 引入 matplotlib 的绘图模块,记作 plt
import matplotlib.pyplot as plt


# 步骤1 中实现的函数
# 定义一个函数,输入一个 文件路径 input_path, 以utf-8格式,读入并解析json文件。
def json_load (input_path) :
    return json.load(codecs.open(input_path, 'r', 'utf-8'))

# 实训2步骤3 中实现的函数
# 定义函数,输入为一个中文字串组成的list。利用jieba分词,对中文字串进行切分,并统计词频。
def word_count(document_words) :
    to_ret = collections.Counter()

    for word in document_words :
        word_cut = list(jieba.cut(word))
        word_cut_counter = collections.Counter(word_cut)
        to_ret = to_ret + word_cut_counter

    return to_ret

# 实训2步骤4 中实现的函数
# 定义函数,输入为一个collections.Counter格式的词频统计, word_count ,和一个路径, outut_path 。
# 基于 word_count 绘制词云图,并储存在地址 outut_path 中
def word_cloud(word_count, outut_path) :
    for word in word_count :
        if word_count[word] == 1 :
            word_count[word] = 0
        if len(word) == 1 :
            word_count[word] = 0

    wc = WordCloud(
        width=2000,                 # 绘图的宽度
        height=1200,                # 绘图的高度
        font_path='msyh.ttf',       # 中文字体的路径
        colormap='spring'           # 颜色风格,可以不设置
    ) 
    wc.generate_from_frequencies(word_count)
    wc.to_file(outut_path)

# 利用 json_load 函数,读入红楼梦的json文件
# 辅导老师也可以准备其它文本用于处理
# 我们这里只对红楼梦前80回做处理
data = json_load('红楼梦.json')[:80]

# 步骤1 中实现的内容
# 使用 word_count 函数,得到红楼梦每章的字数统计,存入word_counts。
# 同时使用tqdm循环可视化工具,可视化处理过程
word_counts = []
for chapter in tqdm(data) :
    count_t = word_count(chapter['content'])
    word_counts.append(count_t)


# 使用实训2步骤4的内容,绘制两章的词云图
# word_cloud(word_counts[5],  '红楼梦第6章.png')
# word_cloud(word_counts[15], '红楼梦第16章.png')

# 分别得到宝玉、贾母、刘姥姥四个词汇在各个章节的词频统计数据。
baoyu_count     = []
jiamu_count     = []
liulaolao_count = []
for wc in word_counts :
    baoyu_count.append(wc['宝玉'])
    jiamu_count.append(wc['贾母'])
    liulaolao_count.append(wc['刘姥姥'])
# 如果好奇的话,这里可以打印词频统计结果
# print(baoyu_count)
# print(jiamu_count)
# print(liulaolao_count)

# 第一部分:
# 使用plt工具画柱状图
def draw_bar_single(input_data, output_path) :
    # 每个柱子的位置
    position = list(range(1, len(input_data)+1))

    plt.bar(
        x = position,       # 每个柱子的位置
        height = input_data # 每个柱子的高度
    )
    # 保存路径
    plt.savefig(output_path)
    # 清空缓存,可以背下来
    plt.clf()

# 可以看到,宝玉通篇在提,刘姥姥只有来的几次被提。
draw_bar_single(liulaolao_count, '刘姥姥_bar.png')
draw_bar_single(baoyu_count, '宝玉_bar.png')


# 第二部分:
# 使用plt工具画多重柱状图,这里是绘制宝玉和贾母的词频
# 每个柱子的位置
position_1 = [t-0.2 for t in  range(1, len(baoyu_count)+1)]
position_2 = [t+0.2 for t in  range(1, len(jiamu_count)+1)]

plt.bar(
    x = position_1,     
    height = baoyu_count,
    width = 0.4,       # 柱子的宽度
    label = 'baoyu'  # 标签
)
plt.bar(
    x = position_2,     
    height = jiamu_count,
    width = 0.4,       # 柱子的宽度
    label = 'jiamu'   # 标签
)
# 绘制图例
plt.legend()
# 保存路径
plt.savefig('multi_bar.png')
# 清空缓存
plt.clf()


# width = 0.2
# plt.bar(x = [1-width, 2-width, 3-width, 4-width], height = [4, 3, 2, 1], width = width*2, label = 'sampleA')
# plt.bar(x = [1+width, 2+width, 3+width, 4+width], height = [1, 2, 3, 4], width = width*2, label = 'sampleB')
# # 
# plt.show()

# 第三部分:
# 使用plt工具画折线图,这里是绘制宝玉和贾母的词频
# 折现数据点的位置

position = list(range(1, len(baoyu_count)+1))

plt.plot(
    position,           # 数据点的位置
    baoyu_count,        # 词频统计数据
    label="baoyu",      # 标签
    color="blue",       # 颜色
    marker=".",         # 点的形状
    linestyle="-"       # 线的形状
    )
plt.plot(
    position,           # 数据点的位置
    jiamu_count,        # 词频统计数据
    label="jiamu",      # 标签
    color="green",      # 颜色
    marker=".",         # 点的形状
    linestyle="--"      # 线的形状
    )

# 横纵坐标标签
plt.xlabel("chapter")
plt.ylabel("word count")
# 绘制图例
plt.legend()
# 保存路径
plt.savefig('lines.png')
以下是对这段代码的分析:

**一、整体功能概述**

这段 Python 代码主要实现了对《红楼梦》文本的词频统计和数据可视化。具体功能包括:

1. 读取《红楼梦》的 JSON 文件,并对前 80 回的内容进行处理。
2. 使用 jieba 分词对每章的内容进行切分,并统计词频。
3. 绘制特定章节的词云图,展示章节中的高频词汇。
4. 统计特定人物(宝玉、贾母、刘姥姥)在各章节中的词频。
5. 分别绘制人物词频的柱状图、多重柱状图和折线图进行可视化展示。

**二、主要函数分析**

1. `json_load(input_path)`:
   - 功能:以 UTF-8 格式读入并解析 JSON 文件。
   - 参数:`input_path`是 JSON 文件的路径。
   - 返回值:解析后的 JSON 数据。

2. `word_count(document_words)`:
   - 功能:对输入的中文字串列表进行 jieba 分词,并统计词频。
   - 参数:`document_words`是一个由中文字串组成的列表。
   - 返回值:一个`collections.Counter`对象,包含了分词后的词频统计结果。

3. `word_cloud(word_count, output_path)`:
   - 功能:根据输入的词频统计结果绘制词云图,并保存到指定路径。
   - 参数:`word_count`是一个`collections.Counter`格式的词频统计结果,`output_path`是保存词云图的路径。

4. `draw_bar_single(input_data, output_path)`:
   - 功能:绘制单个的柱状图。
   - 参数:`input_data`是要绘制的柱子高度数据,`output_path`是保存柱状图的路径。

**三、代码执行过程**

1. 首先,使用`json_load`函数读入《红楼梦》的 JSON 文件,并只取前 80 回的数据。

2. 然后,使用`tqdm`循环可视化工具,对每一章的内容进行词频统计,将结果存入`word_counts`列表中。

3. 接着,分别统计宝玉、贾母、刘姥姥在各章节中的词频,并可以打印出来查看。

4. 之后,分别绘制刘姥姥和宝玉的词频柱状图,以及宝玉和贾母的词频多重柱状图和折线图进行可视化展示。

**四、应用场景**

1. 文本分析:通过对文学作品进行词频统计和可视化,可以了解作品中不同词汇的出现频率和分布情况,从而深入分析作品的主题、人物等方面。

2. 数据可视化教学:这段代码可以作为数据可视化的教学示例,展示如何使用 Python 的相关库进行词云图、柱状图和折线图的绘制。

3. 完整详细下载地址:https://download.csdn.net/download/huanghm88/89879439
相关推荐
御前一品带刀侍卫22 分钟前
elasticsearch基础
大数据·elasticsearch·搜索引擎
武子康1 小时前
大数据-191 Elasticsearch - ES 集群模式 配置启动 规划调优
java·大数据·elk·elasticsearch·搜索引擎·全文检索
落落落sss1 小时前
es实现自动补全
大数据·服务器·elasticsearch·搜索引擎·全文检索
小汤猿人类1 小时前
什么是Elasticsearch?
大数据·elasticsearch·搜索引擎
武子康1 小时前
大数据-187 Elasticsearch - ELK 家族 Logstash Filter 插件 使用详解
大数据·数据结构·elk·elasticsearch·搜索引擎·全文检索·1024程序员节
执键行天涯3 小时前
【工具使用】VSCode如何将本地项目关联到远程的仓库 (vscode本地新项目与远程仓库建立链接)
ide·vscode·elasticsearch
再拼一次吧7 小时前
Elasticsearch
大数据·elasticsearch·搜索引擎
、十一、11 小时前
Linux中ES的安装
linux·运维·elasticsearch
苏少朋16 小时前
Es概念理解 ▎Es索引库操作 ▎Es文档操作
大数据·elasticsearch·搜索引擎
小小工匠16 小时前
ElasticSearch - Bucket Selector使用指南
elasticsearch·bucket sort