一、大致思路
1、引用的库:jieba,WordCloud,matplotlib
2、先建立主要人物姓名的词典(包括人物的字),词典格式 姓名 频率 词性
3、打开三国演义txt,输出一个只有主要人物姓名和字的列表
4、将字转换成对应的姓名,并以字符串形式输出,空格分割:
这一步挺绕的,因为三国里面的人物有时候称呼对方的字号,比如关羽,也被叫成关云长,云长即是他的字。但是显示的词云要求只出现一个姓名,如此的话就需要找出列表中的字,然后将字替换成对应的姓名。
我的方法是:
创建一个字典,key为姓名,value为字,由于人物姓名和字很多,所以以字符串形式创建,采用了特殊格式,如:'{'曹操':'孟德','赵云':'子龙'}'。采用字典格式的好处是,用eval()函数即可将str转换成dict。
然后遍历字典,将key和value添加到各自列表中,再遍历文本分词之后的列表,找出那一个元素属于value的列表,找到后append对应的key,使用index函数。然后删除列表中所有的value。(不会直接替换,只能用这种先添加后删除的笨办法了)
5、显示词云
二、程序架构图
程序结构图.png三、编写程序
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
def main():
ls_f = getFile()
wc_f = changeFile(ls_f)
wordCloud(wc_f )
def onlyName(): #返回一个只有人物姓名和字的列表
a = open('D:\\Python练习\\计算机二级教材(python)\\分词词典\\三国演义分词.txt','r',encoding = 'utf-8')
b = a.read().split()
a.close()
name = []
for ch in b:
if '\u4e00' <= ch <= '\u9fff':
name.append(ch)
return name
def getFile(): #获得一个三国演义文本,并分词。剔除除姓名以外的所有词
a = open('D:\\Python练习\\计算机二级教材(python)\\三国演义.txt','r',encoding = 'utf-8')
b = a.read()
a.close()
jieba.load_userdict('D:\\Python练习\\计算机二级教材(python)\\分词词典\\三国演义分词.txt')
c = jieba.lcut(b,cut_all = True)
ls_f = []
for ch in c:
if ch in onlyName():
ls_f.append(ch)
return ls_f
def changeFile(ls_f): #将列表中的人物字更换成对应的姓名
a = open('D:\\Python练习\\计算机二级教材(python)\\分词词典\\三国演义人物字.txt','r',encoding = 'utf-8').read()
b = eval(a)
key_list = []
values_list = []
for key,values in b.items():
key_list.append(key)
values_list.append(values)
for ch in ls_f:
if ch in values_list:
ls_f.append(key_list[values_list.index(ch)])
f = []
for ch in ls_f: #去除人物字
if ch not in values_list:
f.append(ch)
wc_f = ' '.join(f)
return wc_f
def wordCloud(wc_f): #生产词云
fontpath = 'STHUPO.TTF'
wc = WordCloud(font_path = fontpath,
scale = 6, #值越大字体越清晰
background_color = 'white', #背景板颜色
random_state = 10, #随机样式,
collocations = False,)#去除重复单词
wc.generate(wc_f)
plt.figure(dpi=200) #通过这里可以放大或缩小
plt.imshow(wc,interpolation='catrom',vmax=1000)
plt.axis("off")
plt.show()
main()
网友评论