IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 【Python词云】手把手带你用python给《左耳》人物出现次数排个序 -> 正文阅读

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

这是没有洗文本的结果,本文的目标,就是把人名给洗出来~~~在这里插入图片描述

前置背景

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

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

运行结果

在这里插入图片描述

词语重复输出问题解决

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

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

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

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-10-06 12:11:29  更:2021-10-06 12:11:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 17:24:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码