这是没有洗文本的结果,本文的目标,就是把人名给洗出来~~~
前置背景
基于这个程序需要用到下面三个库
import jieba
import wordcloud
from imageio import imread
所以,需要先在命令行窗口(cmd)安装第三方库
pip install jieba
pip install wordcloud
pip install imageio
- jieba是中文分词第三方库
- wordcloud是优秀的词云展示第三方库
步骤分析
- 从《左耳》小说文件读入文本信息
- 处理文本,拿我所需
- 对文本内容进行排序
- 绘制词云
读入文本信息
这里采用一次性读取文件内容的方式,得到的是一个长字符串。
t = open("左耳.txt", "r").read()
处理文本信息
这里我试了三种方法。
- 定义一个
excludes
的集合,来放我们需要排除的信息。为了获得这个集合内容,首先就要找出小说中出现的高频词,来看下面代码。
import jieba
import wordcloud
from imageio import imread
t = open("左耳.txt", "r").read()
words = jieba.lcut(t) # 中文分词,返回列表类型
counts = {} # 空字典:记录人名出现次数
for word in words:
if len(word) == 1:
continue
else:
counts[word] = counts.get(word, 0)+1 # word数为0时,补充字典
# 把字典转换成列表类型,进行排序
items = list(counts.items())
items.sort(key=lambda x:x[1], reverse=True)
# 筛选文本信息
# 输出100个方便排除非人名文本
for i in range(100):
word, count = items[i]
print("{0:<10}{1:>5}".format(word, count))
输出了前100个出现高频词:
一个 442
没有 352
我们 344
知道 333
时候 288
什么 253
自己 250
许弋 248
张漾 223
看着 193
起来 191
看到 184
已经 175
蒋皎 153
那个 149
这样 142
这个 141
然后 140
不是 140
黑人 133
可以 129
忽然 124
还是 124
一下 123
怎么 119
喜欢 118
有些 117
真的 115
一直 113
不会 113
眼睛 112
就是 109
地说 108
一样 102
手机 102
这里 101
这么 101
电话 100
样子 98
开始 93
出来 92
女生 92
他们 91
告诉 88
海生 87
只是 86
夏米 84
不要 83
李珥 82
小耳朵 82
心里 79
终于 78
北京 78
学校 76
可是 75
不过 75
那里 72
应该 71
回来 71
哪里 70
一起 70
好像 69
晚上 69
于是 68
离开 67
推开 67
过去 67
过来 65
一定 65
为什么 64
觉得 62
面前 62
声音 61
男生 61
因为 61
两个 61
那天 60
是不是 60
微笑 60
爱情 59
酒吧 59
如果 58
很快 58
一切 58
妈妈 57
下来 57
一次 57
其实 57
一把 57
东西 57
所以 56
感觉 56
永远 56
相信 55
到底 55
很多 54
发现 54
现在 54
跟着 53
说完 53
一看,事情不太对,100个词里面的人名寥寥无几,所以我战术性放弃这种方法。
- 采用人名筛选的方法,定义了一个
includes
集合,存放小说里出现的人物。
李珥(小耳朵)
张漾
黎吧啦(吧啦)
许弋(许帅)
夏米米
夏吉吉
蒋皎 (蒋雅希)
直接根据人物特点进行查找,但是又发现了一个问题(是我学艺太浅了hhh),对不在includes集合里的词块进行删除,是件很绕的事情,还出现了下标越界的错误。
所以,转变思路,again!
我只统计我要的词块不就好了吗~
- 取我所需
使用字典进行统计。
当然,一个人总有昵称啥的,所以我进行了名字关联。
elif word == "李珥" or word == "珥" or word == "小耳朵" or word == "耳朵":
rword = "李珥"
elif word == "张漾" or word == "漾":
rword = "张漾"
elif word == "许弋" or word == "许帅" or word == "帅哥" or word == "弋":
rword = "许弋"
elif word == "黎吧啦" or word == "黎" or word == "吧啦" or word == "吧" or word == "啦":
rword = "黎吧啦"
elif word == "夏米米" or word == "夏米" or word == "米米" or word == "米":
rword = "夏米米"
elif word == "夏吉吉" or word == "夏吉" or word == "吉吉" or word == "吉":
rword = "夏吉吉"
elif word == "蒋皎" or word == "蒋雅希" or word == "雅希":
rword = "蒋皎"
文本排序
处理文本信息完毕后,得到的是一个字典。为了调用列表库里的sort
排序函数,使用list()
把字典转为列表类型。
# 把字典转换成列表类型,进行排序
items = list(counts.items())
items.sort(key=lambda x:x[1], reverse=True)
这里先对列表内容进行打印,好像有那么点味道了~
for i in range(7):
word, count = items[i]
print("{0:<10}{1:>5}".format(word, count))
运行结果
张漾 9917
许弋 8674
李珥 8490
蒋皎 5580
夏米米 3252
夏吉吉 2890
黎吧啦 157
绘制词云
对于这个程序,我们处理的是一个中文字符串,所以中文需要先分词并组成空格分隔字符串。
s = ""
for i in range(len(counts)):
word, count = items[i]
s += (str(word)+" ") * count
使用这段代码创建词块间有空格的长字符串。
接下来是经典的词云操作三部曲。
w = wordcloud.WordCloud(font_path="msyh.ttc",\
background_color="white")
w.generate(s)
w.to_file("左耳8.png")
运行结果
词语重复输出问题解决
生成的图片一看,怎么词语会出现两次?
查询了一下,与collocations参数有关,默认collocations=True,会统计搭配词。比如你的text是“我在拜访客户”,当collocations为True时,就会把“拜访客户”也当作一个词进行统计,所以会出现重复。
wcd=WordCloud(font_path='simsun.ttc', collocations=False,width=900,height=400,background_color='white',max_words=100,scale=1.5).generate(text)
更改之后输出
总代码
import jieba
import wordcloud
from imageio import imread
t = open("左耳.txt", "r").read()
words = jieba.lcut(t) # 中文分词,返回列表类型
counts = {} # 空字典:记录人名出现次数
rword = "黎吧啦"
for word in words:
# 名字关联
if len(word) == 1:
continue
elif word == "李珥" or word == "珥" or word == "小耳朵" or word == "耳朵":
rword = "李珥"
elif word == "张漾" or word == "漾":
rword = "张漾"
elif word == "许弋" or word == "许帅" or word == "帅哥" or word == "弋":
rword = "许弋"
elif word == "夏米米" or word == "夏米" or word == "米米" or word == "米":
rword = "夏米米"
elif word == "夏吉吉" or word == "夏吉" or word == "吉吉" or word == "吉":
rword = "夏吉吉"
elif word == "蒋皎" or word == "蒋雅希" or word == "雅希":
rword = "蒋皎"
elif word == "黎吧啦" or word == "黎" or word == "吧啦" or word == "吧" or word == "啦":
rword = "黎吧啦"
counts[rword] = counts.get(rword, 0)+1 # word数为0时,补充字典
counts["左耳"] = 500
counts["情话"] = 400
counts["离心脏最近的地方"] = 400
counts["伤痛文学"] = 300
# print(counts.keys())
# 把字典转换成列表类型,进行排序
items = list(counts.items())
items.sort(key=lambda x:x[1], reverse=True)
# 创建词云
s = ""
for i in range(len(counts)):
word, count = items[i]
s += (str(word)+" ") * count
w = wordcloud.WordCloud(font_path="simsun.ttc",collocations=False, \
background_color="white", width = 300, height = 150)
w.generate(s)
w.to_file("左耳.png")
文章结束,作者深鞠躬!
有错误或者有优化的地方,欢迎指出!