import jieba as j
import xlwt # Excel库
import pandas as pd # pandas库
import matplotlib as mpl # matplotlib库由各种可视化类构成
from wordcloud import WordCloud # 词云
import matplotlib.pyplot as plt # matplotlib.pyplot是绘制各类可视化图形的命令字库,相当于快捷方式
# 建立一个保存主要人物名称的列表names
names = ['贾母', '贾珍', '贾蓉', '贾赦', '贾政', '袭人', '王熙凤', '紫鹃', '翠缕',
'香菱', '豆官', '薛蝌', '薛蟠','贾宝玉', '林黛玉', '平儿', '薛宝钗', '晴雯', '甄费', '林之孝']
# 打开红楼梦txt文档,并赋予读的权限
txt = open('红楼梦.txt', 'r', encoding='utf-8').read()
# 用应用jieba包中的lcut()方法进行分词,将分词结果保存在变量words中
words = j.lcut(txt)
# 设置字典counts用以保存人物出场的次数。
counts = {}
# 设置多分支条件,目的是将一个人物的不同称谓或别号所出现的次数归为这个人物的出场次数
for word in words:
if len(word) == 1:
continue
elif word in ["老太太", "老祖宗", "史太君", "贾母"]:
word = "贾母"
elif word in ["贾珍", '珍哥儿', '大哥哥']:
word = "贾珍"
elif word in ["老爷", '贾政']:
word = "贾政"
elif word in ["宝二爷", '宝玉', '贾宝玉']:
word = "贾宝玉"
elif word in ["王熙凤", "熙凤", "凤辣子", "贾琏"]:
word = "王熙凤"
elif word in ['紫鹃', '鹦哥']:
word = '紫鹃'
elif word in ['翠缕', '缕儿']:
word = '翠缕'
elif word in ['香菱', '甄英莲']:
word = '香菱'
elif word in ['豆官', '豆童']:
word = '豆官'
elif word in ["林黛玉", "潇湘妃子", "林丫头", "林妹妹", "黛玉"]:
word = "林黛玉"
elif word in ["薛宝钗", "宝姑娘", "宝丫头", "蘅芜君", "宝姐姐", '宝钗']:
word = "薛宝钗"
elif word in ["甄费", '甄士隐']:
word = "甄费"
# 进行人物的词频统计,这里只会统计保存在names列表里的人物名称的出场次数,可以自行添加需要统计出场次数的人物名称。
# counts[word]设置了字典的键,如果word在names人物名称列表中,则其在counts字典中的值加1
if word in names:
counts[word] = counts.get(word, 0) + 1
# 将字典counts的键值对转化成列表并保存在变量items当中
items = list(counts.items()) # 此时items变成了一个二维数据
# 建立一个保存循环结果的列表word_key
items.sort(key=lambda x: x[1], reverse=True) # 进行出场次数的排序,reverse=True指定降序排序
# 打开一个空文本,赋予写入权限,字符类型为utf-8
with open('红楼梦_词频.txt', mode='w', encoding='utf-8') as fw:
# 对人物出场次数进行格式化
for i in range(len(items)):
word, count = items[i]
word_key = ('{0:<3}{1:>5}'.format(word, count))
# print(word_key) # 此时结果可打印出来
# 写入到空文本中
fw.write(word_key + '\n')
# 关闭写入的文本
fw.close()
执行结果
贾宝玉 3886
贾母 2290
林黛玉 948
贾政 889
薛宝钗 707
王熙凤 689
平儿 592
袭人 584
晴雯 338
紫鹃 286
贾珍 280
香菱 258
薛蟠 194
贾赦 183
贾蓉 143
林之孝 143
翠缕 48
甄费 11
豆官 3