一、大致思路
只统计主要人物的词云,并显示出人物出场次数最多的前10位和对应次数
主要人物
宁国府:贾珍、尤氏(珍大奶奶)、尤二姐、尤三姐、贾惜春(四姑娘)、贾蓉、秦可卿(秦氏、蓉大奶奶)
荣国府:贾母(史太君、老祖宗、老太太)、鸳鸯、琥珀、傻大姐、贾赦、贾政、王夫人、金钏、贾宝玉(宝二爷)、袭人、晴雯、麝月、秋纹、碧痕、春燕
贾琏、王熙凤(凤姐、琏二奶奶)、平儿、丰儿、林之孝、贾元春(娘娘)
贾迎春(二姑娘)、司棋、贾探春(三姑娘)、李纨(宫裁)、碧月、林黛玉(林姑娘、林妹妹)、雪雁
王家:王子腾
史家:史湘云(史大姑娘)、翠缕
薛家:薛姨妈(姨太太)、薛宝钗(宝姐姐、宝丫头、宝姑娘)、薛蟠、夏金桂、宝蟾、香菱、薛蝌、邢岫烟、薛宝琴
因为小说中对人物并不会总是直呼全名,比如贾宝玉,会称作宝玉,至于贾母的别称就更多了,史太君、老祖宗、老太太......
所以新建一个分词词典,包含人物姓名的别称,这样就尽可能的避免了人物出现,而未统计的情况。
最后显示在词云上的姓名要求都是人物的全名,不能有其他别称,所有需要把别称替换成全名。
新建分词词典:(省略了词频、词性)
贾珍
贾政
尤氏
珍大奶奶
尤二姐
尤三姐
惜春
四姑娘
贾蓉
可卿
秦氏
蓉大奶奶
贾母
史太君
老祖宗
老太太
鸳鸯
琥珀
傻大姐
贾赦
王夫人
金钏
宝玉
宝二爷
袭人
晴雯
麝月
秋纹
碧痕
春燕
贾琏
熙凤
凤姐
琏二奶奶
平儿
丰儿
林之孝
元春
娘娘
迎春
二姑娘
司棋
探春
三姑娘
李纨
宫裁
黛玉
林姑娘
林妹妹
雪雁
子腾
湘云
史大姑娘
翠缕
薛姨妈
姨太太
宝钗
宝姐姐
宝丫头
宝姑娘
薛蟠
金桂
宝蟾
香菱
薛蝌
岫烟
宝琴
因为需要把人物的别称替换成人物的全名,所以新建了一个字典文本,可以直接读取文本,然后用eval()函数转换成dict,转换后的dict:
{'珍大奶奶':'尤氏','惜春':'贾惜春','四姑娘':'贾惜春','秦氏':'秦可卿','可卿':'秦可卿','蓉大奶奶':'秦可卿','史太君':'贾母','老祖宗':'贾母','老太太':'贾母','宝玉':'贾宝玉','宝二爷':'贾宝玉','熙凤':'王熙凤','凤姐':'王熙凤','琏二奶奶':'王熙凤','之孝':'林之孝','元春':'贾元春','娘娘':'贾元春','二姑娘':'贾迎春','迎春':'贾迎春','探春':'贾探春','三姑娘':'贾探春','宫裁':'李纨','黛玉':'林黛玉','林姑娘':'林黛玉','林妹妹':'林黛玉','子腾':'王子腾','湘云':'史湘云','史大姑娘':'史湘云','姨太太':'薛姨妈','宝姐姐':'薛宝钗','宝丫头':'薛宝钗','宝姑娘':'薛宝钗','金桂':'夏金桂','岫烟':'邢岫烟','宝琴':'薛宝琴'}
全名为value,别称为key,为什么不反过来全名为key呢?因为全名对应了很多别称,而key不能重复,否则转换成列表时会自动删除重复。
二、程序结构图
红楼梦程序架构图.jpg三、程序源码
import jieba
from wordcloud import WordCloud
def getFile():
f = open('D:\\Python练习\\计算机二级教材(python)\\小说txt\\红楼梦.txt','r',encoding = 'utf-8')
txt = f.read()
f.close()
jieba.load_userdict('D:\\Python练习\\计算机二级教材(python)\\分词词典\\红楼梦分词.txt')
all_words = jieba.lcut_for_search(txt)
words = []
for i in all_words:
if i in keyWord():
words.append(i)
return words
def keyWord():
f = open('D:\\Python练习\\计算机二级教材(python)\\分词词典\\红楼梦分词.txt','r',encoding = 'utf-8')
txt = f.read()
f.close()
name = txt.split()
return name
def changeWord(words):
with open('D:\\Python练习\\计算机二级教材(python)\\分词词典\\红楼梦替换词典.txt','r',encoding = 'utf-8') as f:
txt = f.read()
word_dict = eval(txt)
keys = []
values = []
for k,v in word_dict.items():
keys.append(k)
values.append(v)
for i in words:
if i in keys:
words.append(values[keys.index(i)])
last_word = []
for ch in words:
if ch not in keys:
last_word.append(ch)
new_words = ' '.join(last_word)
return last_word,new_words
def wordCount(last_word):
counts = {}
for word in last_word:
counts[word] = counts.get(word,0) + 1
items = list(counts.items())
items.sort(key = lambda x:x[1],reverse = True)
for i in range(10):
word,count = items[i]
print("{0:<10}{1:>5}".format(word,count))
def wordCloud(new_words):
fontpath = 'STHUPO.TTF'
wc = WordCloud(font_path = fontpath,
width=800,
height=600,
max_words=50,
max_font_size=150,
background_color = 'white', #背景板颜色
collocations = False,#去除重复单词
).generate(new_words)
wc.to_file('D:\\Python练习\\计算机二级教材(python)\\红楼梦人物词云.png')
def main():
words = getFile()
last_word,new_words = changeWord(words)
wordCount(last_word)
wordCloud(new_words)
main()
输出图片:
输出前10位人物和出场次数:
贾宝玉 4050
贾母 2726
王熙凤 1774
林黛玉 1579
薛宝钗 1248
袭人 1131
王夫人 1011
贾政 927
贾琏 766
平儿 683
网友评论