实验目的
1.掌握python第三方模块的安装和使用;
2. 培养学生动手查阅资料能力和解决实际问题的能力和团队合作能力。
一、安装jieba库与wordcloud库
在命令提示符中输入:pip install jieba
、pip install wordcloud
二、编程输出《三国演义》电子书中出场次数最高的10个人物名字,并生成三国人物词云图片
参考代码
import jieba # 优秀的中文分词第三方库
import wordcloud
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(50):
word, count = items[i]
print("{0:<10}{1:>5}".format(word, count))
name.append(word)
times.append(count)
# 词云部分
txt = " ".join(name)
w = wordcloud.WordCloud(
width=1000, height=700,
background_color="white",
font_path="msyh.ttc"
)
w.generate(txt)
w.to_file("ciyun.png")