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')
上一篇:2024年项目管理新风向:敏捷开发与瀑布开发,哪个更优?


下一篇:DDD重构-实体与限界上下文重构