例子

对古典文学名著《红楼梦》进行文本分析,提取其中频数大于500的词语,绘制词云图进行展示。

文件下载红楼梦文本分析附件

附件内容

background.jpg                  # 自定义的词云图背景
Dream_of_the_Red_Mansion.txt    # 《红楼梦》原文
Red_Mansion_Dictionary.txt      # 自定义的红楼梦词典,用于提高文本分析精确度
SimHei.ttf                      # 中文字体文件,用于绘图时显示中文
stop_words.txt                  # 停用词表,用于剔除文本分析中的生僻词和非词语字符

附件使用说明

  • 下载上述附件

  • 解压附件,确保解压后的附件文件夹“text”和代码处于同一目录下

  • 运行代码(如果代码运行有误,请检查代码中的路径设置部分)。

代码部分

# lec10
# 计量实验专题:文本分析-代码部分
# 红楼梦的文本分析

import pandas as pd
import matplotlib.pyplot as plt  # 数据可视化
import jieba  # 词语切割
from wordcloud import WordCloud, ImageColorGenerator  # 词云,颜色生成器,停止词
import numpy as np  # 科学计算
from PIL import Image  # 处理图片

# 路径设置
path_content = "./text/Dream_of_the_Red_Mansion.txt"    # 待分析文本路径
path_stopword = "./text/stop_words.txt"                 # 停用词路径
path_background_image = "./text/background.jpg"         # 背景图路径
path_font = "./text/SimHei.ttf"                         # 词云字体路径
path_wordcloud_image = "./text/wordcloud.jpg"           # 词云图存储路径

# 导入用户词典(可选)
jieba.load_userdict("./text/Red_Mansion_Dictionary.txt")

# 停用词列表
file = open(path_stopword, 'r', encoding='utf-8')   # 读取停用词文件
stopword = file.readlines()                         # 读取所有行
list_stopword = []                                  # 定义空列表
for word in stopword:
    word = word.strip('\n')                         # 删除停用词尾部的换行符'\n'
    list_stopword.append(word)                      # 结果存入列表

# 分词
file = open(path_content, 'r', encoding='utf-8')     # 读取待分析文本
textfile = file.read()                               # 读取文本内容
cut_list = jieba.cut(textfile)                       # 切割词语
wordlist = []                                        # 定义空列表
for word in cut_list:
    if len(word) > 1:                                # 筛选2字以上的词语
        wordlist.append(word)                        # 筛选结果存入列表
text_str = ' '.join(wordlist)                        # 用空格将词语连接为字符串

# 词云图
# 导入词云图背景图片
background = np.array(Image.open(path_background_image))
# 生成词云图
wc = WordCloud(width=1400, height=2200,
               background_color='white',
               mode='RGB',
               mask=background,            # 添加背景
               max_words=500,              # 最大词数
               stopwords=list_stopword,    # 屏蔽词
               font_path=path_font,        # 词云图字体
               max_font_size=150,
               relative_scaling=0.5,       # 设置字体大小与词频的关联程度为0.5
               random_state=50,
               scale=2
               ).generate(text_str)
# 自定义词云图颜色,颜色和形状来自背景(可选)
image_color = ImageColorGenerator(background)
wc.recolor(color_func=image_color)
# 显示词云
plt.imshow(wc)                       # 显示词云
plt.axis('off')                      # 关闭x,y轴
plt.show()                           # 显示

# 保存词云图到本地
wc.to_file(path_wordcloud_image)

# 统计词频
df = pd.DataFrame()
df["wordlist"] = wordlist

df01 = pd.DataFrame(columns=["word", "frequency"])
df01["frequency"] = df.groupby("wordlist")["wordlist"].agg(np.size)  # 对df按“wordlist”分组,并计算频数,赋值给df01
df01["word"] = df01.index
df01 = df01.reset_index(drop=True)                                # 重置索引,删除原来索引
df01 = df01.sort_values(by="frequency")                           # 按“frequency”(升序)排序
df01 = df01[df01["frequency"] > 500]                              # 筛选出“frequency”大于500的词语和频数
df01 = df01.reset_index(drop=True)                                # 重置索引,删除原来索引
print(df01)

# 绘制词频图
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
y = df01["word"]
x = df01["frequency"]
plt.figure(figsize=(8, 10))
plt.barh(y, x)
plt.title("红楼梦词频分析", fontsize="xx-large", fontweight="bold")
plt.ylabel("关键词", fontsize="large", fontweight="bold")
plt.xlabel("频数", fontsize="large", fontweight="bold")
plt.show()
分类: 教程笔记

管理员

管理员

SEIT资源站