例子
对古典文学名著《红楼梦》进行文本分析,提取其中频数大于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()