设计一个程序,读出“三国演义.txt”文件中的三国演义全文,将常见人名进行去重后生成词云,并列出词频最高的10-20
import jieba # 优秀的中文分词第三方库
import wordcloud
from matplotlib import pyplot
mk = pyplot.imread('caochao.jpg')
txt = open('三国演义.txt','r',encoding='utf-8').read()
# 排除一些不是人名,但是出现次数比较靠前的单词
excludes = {"将军", "却说", "荆州", "二人", "不可", "不能", "如此", "商议", "如何", "主公", "军士", "左右", "军马", "引兵", "次日", "大喜", "天下", "东吴",
"于是", "今日", "不敢", "魏兵", "陛下", "一人", "都督", "人马", "不知", "汉中", "只见", "众将", "后主", "蜀兵", "上马", "大叫", "太守", "此人",
"夫人", "先主", "后人", "背后", "城中", "天子", "一面", "何不", "大军", "忽报", "先生", "百姓", "何故", "然后", "先锋", "不如", "赶来", "原来",
"令人", "江东", "下马", "喊声", "正是", "徐州", "忽然", "因此", "成都", "不见", "未知", "大败", "大事", "之后", "一军", "引军", "起兵", "军中",
"接应", "进兵", "大惊", "可以", "以为", "大怒", "不得", "心中", "下文", "一声", "追赶", "粮草", "曹兵", "一齐", "分解", "回报", "分付", "只得",
"出马", "三千", "大将", "许都", "随后", "报知", "前面", "之兵", "且说", "众官", "洛阳", "领兵", "何人", "星夜", "精兵", "城上", "之计", "不肯",
"相见", "其言", "一日", "而行", "文武", "襄阳", "准备", "若何", "出战", "亲自", "必有", "此事", "军师", "之中", "伏兵", "祁山", "乘势", "忽见",
"大笑", "樊城", "兄弟", "首级", "立于", "西川", "朝廷", "三军", "大王", "传令", "当先", "五百", "一彪", "坚守", "此时", "之间", "投降", "五千",
"埋伏", "长安", "三路", "遣使", "英雄","回见","大将军","是夜","小路","望见","无不","有人","马下","必然","将士","甘宁","下寨","杀出","诸葛","中原",
"屯兵","邓艾","蛮兵","之意","城下","前来","武士","城外","出迎","本部","两路","一阵","连夜","四面","奔走","交锋","冀州","细作","使者","江南","杀来",
"人报","而出","心腹","何处","皇叔","众人","当日","吴兵","兴兵","何以","如之奈何","先帝","江夏","前进","国家","城门","杀入","两军","来到","厮杀","两个","拜谢",
"岂可","慌忙","饮酒","为首","性命","进发","谋士","此言"}
# 精确模式,把文本精确的切分开,不存在冗余单词,返回列表类型
words = jieba.lcut(txt)
# 构造一个字典,来表达单词和出现频率的对应关系
counts = {}
# 逐一从words中取出每一个元素
for word in words:
# 已经有这个键的话就把相应的值加1,没有的话就取值为0,再加1
if len(word) == 1:
continue
elif word == "诸葛亮" or word == "孔明曰":
rword = "孔明"
elif word == "关公" or word == "云长":
rword = "关羽"
elif word == "玄德" or word == "玄德曰":
rword = "刘备"
elif word == "孟德" or word == "丞相":
rword = "曹操"
else:
rword = word
# 如果在里面返回他的次数,如果不在则添加到字典里面并加一
counts[rword] = counts.get(rword, 0) + 1
# 删除停用词
for word in excludes:
del counts[word]
# 排序,变成list类型,并使用sort方法
items = list(counts.items())
# 对一个列表按照键值对的2个元素的第二个元素进行排序
# Ture从大到小,结果保存在items中,第一个元素就是出现次数最多的元素
items.sort(key=lambda x: x[1], reverse=True)
# 将前十个单词以及出现的次数打印出来
name = []
times = []
for i in range(40):
word, count = items[i]
print("{0:<10}{1:>5}".format(word, count))
name.append(word)
times.append(count)
# 词云部分
w = wordcloud.WordCloud(
font_path='songti.TTF', # 设置字体
background_color="white", # 设置词云背景颜色
max_words=1000, # 词云允许最大词汇数
max_font_size=100, # 最大字体大小
random_state=50, # 配色方案的种数
mask=mk
)
txt = " ".join(name)
w.generate(txt)
w.to_file("ciyun.png")
个词,并形成词云(可以有不同的形状)