这是没有洗文本的结果,本文的目标,就是把人名给洗出来~~~
前置背景基于这个程序需要用到下面三个库
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")
文章结束,作者深鞠躬!
有错误或者有优化的地方,欢迎指出!



