【Python词云】手把手带你用python给《左耳》人物出现次数排个序

这是没有洗文本的结果,本文的目标,就是把人名给洗出来~~~【Python词云】手把手带你用python给《左耳》人物出现次数排个序_第1张图片

前置背景

基于这个程序需要用到下面三个库

import jieba
import wordcloud
from imageio import imread

所以,需要先在命令行窗口(cmd)安装第三方库

pip install jieba 
pip install wordcloud
pip install imageio
  • jieba是中文分词第三方库
  • wordcloud是优秀的词云展示第三方库

步骤分析

  1. 从《左耳》小说文件读入文本信息
  2. 处理文本,拿我所需
  3. 对文本内容进行排序
  4. 绘制词云

读入文本信息

这里采用一次性读取文件内容的方式,得到的是一个长字符串。

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")

运行结果

【Python词云】手把手带你用python给《左耳》人物出现次数排个序_第2张图片

词语重复输出问题解决

生成的图片一看,怎么词语会出现两次?

查询了一下,与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)

更改之后输出
【Python词云】手把手带你用python给《左耳》人物出现次数排个序_第3张图片

总代码

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")

文章结束,作者深鞠躬!
有错误或者有优化的地方,欢迎指出!

你可能感兴趣的