文章目录
点击此处下载数据
1 数据预处理
1.1 准备工作
引入需要的模块,设置显示方式,修改工作路径,如未安装jieba包需要在命令行中输入pip install jieba安装
import os
import re
import jieba
import json
import matplotlib.pyplot as plt
import matplotlib as mpl
import pandas as pd
import numpy as np
from wordcloud import WordCloud,ImageColorGenerator
import matplotlib.image as mpimg
from sklearn.feature_extraction.text import CountVectorizer,TfidfTransformer
from sklearn.decomposition import LatentDirichletAllocation
from scipy.interpolate import spline
import random
from scipy.cluster import hierarchy
from sklearn import decomposition as skldec
# 设置字体
font = mpl.font_manager.FontProperties(fname='C:\Windows\Fonts\STXINWEI.TTF')
# 设置pandas显示方式
pd.set_option("display.max_rows",10)
pd.options.mode.chained_assignment = None # default='warn'
# 设置显示图像的方式
%matplotlib inline
%config InlineBackend.figure_format = "retina"
%config InlineBackend.figure_format = "retina"
os.chdir("C:\Aruc\learning\大四上\贝叶斯\LDA")
print(os.getcwd())
C:\Aruc\learning\大四上\贝叶斯\LDA
1.2 读入文本
首先读入红楼梦文本,并按照章节处理为列表,再读入停用词表(合并了红楼梦停用词表、哈工大停用词表、四川大学停用词表、中文停用词表等)
# 读入红楼梦文本
f = open('红楼梦.txt',encoding='utf-8')
quanwen = f.read()
quanwen.replace('\n','')
# 出现“第xx回 ”则断开
quanwen_list = re.split('第[\u4e00-\u9fa5]{1,3}回 ',quanwen)[1:121]
# 读入停用词表
f = open('stopword1.txt')
stop_words = f.readlines()
for i in range(len(stop_words)):
stop_words[i] = stop_words[i].replace('\n','')
print('红楼梦共有{}章,{}个停用词'.format(len(quanwen_list),len(stop_words)))
红楼梦共有120章,1604个停用词
1.3 分词、去停词
每章分别分词、去停词,同时将长度为1的字符删掉,将结果分章节保存
# 分词、去停词
jieba.load_userdict('红楼梦分词词典.txt')
quanwen_fenci = []
for i in range(len(quanwen_list)):
temps = list(jieba.cut(quanwen_list[i]))
quanwen_fenci.append([])
for temp in temps:
# 将长度为1的字符删掉
if len(temp) > 1 and temp not in stop_words:
quanwen_fenci[i].append(temp)
# 将结果分章节保存
for i in range(len(quanwen_fenci)):
with open('红楼梦分章节分词/{}.json'.format(i),'w',encoding='utf-8') as f:
json.dump(quanwen_fenci[i],f)
# 查看第一章前100分分词结果
print(quanwen_fenci[0][0:100])
['甄士隐', '梦幻', '识通灵', '贾雨村', '风尘', '闺秀', '开卷', '第一回', '作者', '自云', '因曾', '历过', '梦幻', '之后', '真事', '隐去', '通灵', '撰此', '石头记', '一书', '故曰', '甄士隐', '但书中', '所记', '何事', '何人', '自又云', '风尘碌碌', '一事无成', '念及', '当日', '女子', '细考', '觉其', '行止', '见识', '之上', '堂堂', '须眉', '诚不若', '裙钗', '实愧', '有余', '无益', '之大', '无可如何', '之日', '自欲', '已往', '所赖', '天恩祖', '锦衣', '纨绔', '饫甘餍肥', '父兄', '教育', '之恩', '师友', '规谈', '之德', '今日', '一技无成', '半生', '潦倒', '之罪', '编述', '一集', '以告', '天下人', '罪固', '闺阁', '中本', '历历', '有人', '不可', '不肖', '自护己', '一并', '泯灭', '今日', '之茅', '椽蓬', '瓦灶', '绳床', '晨夕', '风露', '阶柳庭花', '未有', '襟怀', '笔墨', '未学', '下笔', '无文', '假语', '村言', '演出', '一段', '故事', '亦可', '闺阁']
# 绘制各章节分词后词数
chapter_lens = [len(fenci) for fenci in quanwen_fenci]
p1 = plt.bar(range(len(chapter_lens)),chapter_lens)
plt.title("各章节分词后词数", fontproperties=font,size = 15)
plt.show()
每个章节的词数在1500上下波动
2 基本情况
2.1 全文词频及词云图
统计全文的词频并展示结果,绘制全文及部分章节的词云图
# 统计全文的词频
word_df = pd.DataFrame({
'word':np.concatenate(quanwen_fenci)})
word_stat = word_df.groupby(by = 'word')['word'].agg({
'number':np.size})
# 调整为按词频由高到低展示
word_stat = word_stat.reset_index().sort_values(by='number',ascending=False)
word_stat
word | number | |
---|---|---|
14253 | 宝玉 | 3653 |
34618 | 贾母 | 1233 |
7490 | 凤姐 | 1184 |
33165 | 袭人 | 1108 |
39821 | 黛玉 | 1007 |
... | ... | ... |
16876 | 得备 | 1 |
16875 | 得善缘 | 1 |
16874 | 得十来 | 1 |
16872 | 得力 | 1 |
39910 | 龟大 | 1 |
39911 rows × 2 columns
全文共有39882个词语,宝玉、贾母、凤姐、袭人、黛玉等主角人物出现次数最多
# 将词频数据框转化为字典
word_dict = {
}
for key,value in zip(word_stat.word,word_stat.number):
word_dict[key] = value
# 绘制词云
back_coloring = mpimg.imread('词云图片.jpg')
wc = WordCloud(font_path='C:\Windows\Fonts\STXINWEI.TTF',
margin=5, width=2000, height=2000,
background_color="white",
max_words=800,
mask=back_coloring,
max_font_size=400,
random_state=42,
).generate