常见的英文和中文文本词云图绘制 词云图最终效果
摘要:当我们手中有一篇文档,比如书籍、小说、电影剧本,若想快速了解其主要内容是什么,则可以采用绘制 WordCloud 词云图,显示主要的关键词(高频词)这种方式,非常方便。本文将介绍常见的英文和中文文本的词云图绘制,以及 Frequency 频词频词云图。
写在前面:由于文中有一些超链接,无法在公众号打开,建议点击底部「阅读原文」或者复制下面的博客链接到浏览器打开,体验更好。
在上一篇文章「pyspider 爬取并分析虎嗅网 5 万篇文章 」中的文本可视化部分,我们通过 WordCloud 和 jieba 两个包绘制了中文词云图,当时只是罗列出了代码,并没有详细介绍。接下来,将详细说明各种形式的词云图绘制步骤
【资料图】
1. 英文词云
我们先绘制英文文本的词云图,因为它相对简单一些。这里以《海上钢琴师》这部电影的剧本为例。
首先,准备好电影剧本的文本文件(如下图):
接下来,我们绘制一个最简单的矩形词云图,代码如下:
这里,通过 open() 方法读取文本文件,然后在 WordCloud 方法中设置了词云参数,再利用 generate_from_text() 方法生成该电影剧本的词云,最后显示和保存词云图。十几行代码就可以生成最简单的词云图:
通过上面的词云图,你可能会发现有几点问题:
可不可以更换背景,比如白色?
词云图能不能换成其他形状或者图片?
词云中最显眼的词汇 「ONE」,并没有实际含义,能不能去掉?
以上这些都是可以更改的,如果你想实现以上想法,那么需要先了解一下 WordCloud 的API 参数及它的一些方法。
这里,我们列出它的各项参数,并注释重要的几项:
关于更详细的用法,你需要到官网了解。
了解了各项参数后,我们就可以自定义想要的词云图了。比如更换一下背景颜色和整体风格,就可以通过修改以下几项参数实现:
结果如下:
接下来,我们提升一点难度,通过设置 StopWords 去掉没有实际意义的「ONE」字符,然后将词云图绘制在我们自定义的一张图片上。
代码实现如下:
这里,首先通过 open() 方法读取文本文件,Image.open() 方法读取了背景图片,np.array 方法将图片转换为矩阵。
接着设置了词云自带的英文 StopWords 停止词,用来分割筛除文本中不需要的词汇,比如:a、an、the 这些。
然后,在 WordCloud 方法中,设置词云的具体参数。generate_from_text() 方法生成该词云,recolor() 则是根据图片色彩绘制词云文字颜色。最终的词云绘制效果如下:
现在,我们还是看到了显眼的「ONE」,下面我们将它去除掉,方法也很简单,几行代码就可以实现:
首先,我们对文本词频进行排序,可以看到 「ONE」词频最高,就将它添加进 stopwords 中,这样就可以屏蔽该词从而不在词云中显示。
需要注意的是,这种手动添加停止词的方法适用于词数量比较少的情况。
另外,我们还可以将词云图颜色显示为黑白渐变色,也只需修改几行代码即可:
1def grey_color_func(word, font_size, position, orientation, random_state=None,2 **kwargs):3 return "hsl(0, 0%%, %d%%)" % random.randint(50, 100)4 # 随机设置hsl色值5wc.recolor(color_func=grey_color_func)
效果如下:
以上,就是英文词云图绘制的几种方法,下面我们介绍中文词云图的绘制。
2. 中文词云
相比于英文词云,中文在绘制词云图前,需要先切割词汇,这里推荐使用 jieba 包来切割分词。因为它可以说是最好的中文分词包了,GitHub 上拥有 160 K 的 Star 数。安装好 jieba 包后,我们就可以对文本进行分词然后生成词云。
这里,选取吴军老师的著作《浪潮之巅》作为中文文本的案例,仍然采用图片形式的词云图。素材准备好后,接下来就可以开始中文词云图绘制。
首先,需要读取文本文件,相比于英文,这里要添加文本编码格式,否则会报错,添加几行代码就可以识别文本的编码格式:
1text = open(path.join(d,"langchao.txt"),"rb").read()2text_charInfo = chardet.detect(text)3print(text_charInfo)4# 结果5{"encoding": "UTF-8-SIG", "confidence": 1.0, "language": ""}6text = open(path.join(d,r"langchao.txt"),encoding="UTF-8-SIG").read()
接着,对文本进行分词。jieba 分词有 3 种方式:精确模式、全模式和搜索引擎模式,它们之间的差别,可以用一个例子来体现。
比如,有这样的一句话:「"我来到北京清华大学"」,用 3 种模式进行分词,结果分别如下:
全模式: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
精确模式: 我/ 来到/ 北京/ 清华大学
搜索引擎模式: 我/ 来/ 来到/ 北京/ 清华/ 大学/ 清华大学/
根据结果可知,我们应该选择「精确模式」来分词。关于 jieba 包的详细用法,可以参考 GitHub 仓库链接:
分词完成后,还需要设置 stopwords 停止词,由于 WordCloud 没有中文停止词,所以需要自行构造。这里可以采取两种方式来构造:
通过 stopwords.update() 方法手动添加
根据已有 stopwords 词库遍历文本筛除停止词
2.1. stopwords.update() 手动添加
这种方法和前面的英文停止词构造的方法是一样的,目的是在词云图中不显示 stopwords 就行了 ,即先不设置 stopwords,而是先对文本词频进行排序,然后将不需要的词语添加为 stopwords 即可,代码实现如下:
1# 获取文本词排序,可调整 stopwords2process_word = WordCloud.process_text(wc,text)3sort = sorted(process_word.items(),key=lambda e:e[1],reverse=True)4print(sort[:50]) # # 获取文本词频最高的前50个词56[("公司", 1273), ("但是", 769), ("IBM", 668), ("一个", 616), ("Google", 429), ("自己", 396), ("因此", 363), ("微软", 358), ("美国", 344), ("没有", 334)...]
可以看到,我们先输出文本词频最高的一些词汇后,发现:「但是」、「一个」、「因此」这些词都是不需要显示在词云图中的。因此,可以把这些词用列表的形式添加到 stopwords 中,然后再次绘制词云图就能得出比较理想的效果,完整代码如下:
1import chardet 2import jieba 3text+=" ".join(jieba.cut(text,cut_all=False)) # cut_all=False 表示采用精确模式 4# 设置中文字体 5font_path = "C:\Windows\Fonts\SourceHanSansCN-Regular.otf" # 思源黑体 6# 读取背景图片 7background_Image = np.array(Image.open(path.join(d, "wave.png"))) 8# 提取背景图片颜色 9img_colors = ImageColorGenerator(background_Image)10# 设置中文停止词11stopwords = set("")12stopwords.update(["但是","一个","自己","因此","没有","很多","可以","这个","虽然","因为","这样","已经","现在","一些","比如","不是","当然","可能","如果","就是","同时","比如","这些","必须","由于","而且","并且","他们"])1314wc = WordCloud(15 font_path = font_path, # 中文需设置路径16 margin = 2, # 页面边缘17 mask = background_Image,18 scale = 2,19 max_words = 200, # 最多词个数20 min_font_size = 4, #21 stopwords = stopwords,22 random_state = 42,23 background_color = "white", # 背景颜色24 # background_color = "#C3481A", # 背景颜色25 max_font_size = 100,26 )27wc.generate(text)28# 获取文本词排序,可调整 stopwords29process_word = WordCloud.process_text(wc,text)30sort = sorted(process_word.items(),key=lambda e:e[1],reverse=True)31print(sort[:50]) # 获取文本词频最高的前50个词32# 设置为背景色,若不想要背景图片颜色,就注释掉33wc.recolor(color_func=img_colors)34# 存储图像35wc.to_file("浪潮之巅basic.png")36# 显示图像37plt.imshow(wc,interpolation="bilinear")38plt.axis("off")39plt.tight_layout()40plt.show()
stopwords 添加之前:
stopwords 添加之后:
可以看到,stopwords.update() 这种方法需要手动去添加,比较麻烦一些,而且如果 stopwords 过多的话,添加就比较费时了。下面介绍第 2 种自动去除 stopwords 的方法。
2.2. stopwords 库自动遍历删除
这种方法的思路也比较简单,主要分为 2 个步骤:
利用已有的中文 stopwords 词库,对原文本进行分词后,遍历词库去除停止词,然后生成新的文本文件。
根据新的文件绘制词云图,便不会再出现 stopwords,如果发现 stopwords 词库不全可以进行补充,然后再次生成词云图即可。
代码实现如下:
1# 对原文本分词 2def cut_words(): 3 # 获取当前文件路径 4 d = path.dirname(__file__) if "__file__" in locals() else os.getcwd() 5 text = open(path.join(d,r"langchao.txt"),encoding="UTF-8-SIG").read() 6 text = jieba.cut(text,cut_all=False) 7 content = "" 8 for i in text: 9 content += i10 content += " "11 return content1213# 加载stopwords14def load_stopwords():15 filepath = path.join(d,r"stopwords_cn.txt")16 stopwords = [line.strip() for line in open(filepath,encoding="utf-8").readlines()]17 # print(stopwords) # ok18 return stopwords1920# 去除原文stopwords,并生成新的文本21def move_stopwwords(content,stopwords):22 content_after = ""23 for word in content:24 if word not in stopwords:25 if word != "\t"and"\n":26 content_after += word2728 content_after = content_after.replace(" ", " ").replace(" ", " ")29 # print(content_after)30 # 写入去停止词后生成的新文本31 with open("langchao2.txt","w",encoding="UTF-8-SIG") as f:32 f.write(content_after)
网上有很多中文 stopwords 词库资料,这里选取了一套包含近 2000 个词汇和标点符号的词库:stopwords_cn.txt,结构形式如下:
遍历该 stopwords 词库,删除停止词获得新的文本,然后利用第一种方法绘制词云图即可。
首先输出一下文本词频最高的部分词汇,可以看到常见的停止词已经没有了:
1[("公司", 1462), ("美国", 366), ("IBM", 322), ("微软", 320), ("市场", 287), ("投资", 263), ("世界", 236), ("硅谷", 235), ("技术", 234), ("发展", 225), ("计算机", 218), ("摩托罗拉", 203)...]
词云图最终效果如下:
3. Frenquency 词云图
上面两种中英文词云图都是通过文本绘制的,而除了直接读入文本生成词云以外,比较常见的还有通过「词频」绘制词云图。这种词云图,则可以使用 DataFrame或者 字典格式来绘制。
下面,以此前我们爬过的一篇「近十年 世界大学排名 TOP500 强」教程的数据为例,介绍如何绘制词频词云图。
该份数据大小为 5001行 x 6 列,我们想根据各国 TOP 500 强大学的数量,来可视化地展示各国之间的大学数量差异。
1world_rank university score quantity year country 21 哈佛大学 100 500 2009 USA 32 斯坦福大学 73.1 499 2009 USA 43 加州大学-伯克利 71 498 2009 USA 54 剑桥大学 70.2 497 2009 UK 65 麻省理工学院 69.5 496 2009 USA 7... 8496 犹他州立大学 2018 USA 9497 圣拉斐尔生命健康大学 2018 Italy10498 早稻田大学 2018 Japan11499 韦恩州立大学 2018 USA12500 西弗吉尼亚大学 2018 USA
这里,有两种方式可以直接生成频率词云图,第一种是 利用 Series 列表生成,代码实现如下:
1import pandas as pd 2import matplotlib.dates as mdate 3from wordcloud import WordCloud 4import matplotlib.pyplot as plt 5 6df = pd.read_csv("university.csv",encoding = "utf-8") 7df = df.groupby(by = "country").count() 8df = df["world_rank"].sort_values(ascending = False) 9print(df[:10])10# 结果如下:11country12USA 145913Germany 38214UK 37915China 32016France 21017Canada 20918Japan 20619Australia 19920Italy 19521Netherlands 122
第二种方式是转换为 dict 字典生成,一行代码就可以完成:
1df = dict(df)2print(df)3# 结果如下:4{"USA": 1459, "Germany": 382, "UK": 379, "China": 320, "France": 210,..}
数据转换好以后,就可以生成词云图了,代码实现如下:
1font_path="C:\Windows\Fonts\SourceHanSansCN-Regular.otf" # 思源黑 2wordcloud = WordCloud( 3 background_color = "#F3F3F3", 4 font_path = font_path, 5 width = 5000, 6 height = 300, 7 margin = 2, 8 max_font_size = 200, 9 random_state = 42,10 scale = 2,11 colormap = "viridis", # 默认virdis12 )13wordcloud.generate_from_frequencies(df)14# or15# wordcloud.fit_words(df)16plt.imshow(wordcloud,interpolation = "bilinear")17plt.axis("off")18plt.show()
效果如下:
可以看到,美国最为突出,其次是德国、英国、中国等。看来,我们国内的大学还得加把劲啊。
以上,就是绘制词云图常见的几种方式。
本文完。
标签:
相关推荐:
最新新闻:
- 求正弦函数的值怎么算?python求正弦函数的值
- 常见的英文和中文文本词云图绘制 词云图最终效果
- 电脑数据损坏怎么办?用KV3000快速重建硬盘分区表-环球最新
- 全球最资讯丨神州行幸福卡是什么?神州行幸福卡详情介绍
- 即时看!第一章begining c语言中的变量与对象
- 工业机器人技术全解析 工业机器人的发展背景及应用场景
- 今日关注:怎么卸载驱动?网蚁摄像头驱动
- 环球最新:如何解决电脑弹窗问题?四种弹窗拦截工具的使用方法
- 电热水龙头什么品牌好?电热水龙头品牌推荐-每日精选
- 每日播报!怎么登入192.168.0.1路由器的管理页面?详细步骤
- 鼠标光标形态 人体工学鼠标到底值不值得买?_全球新资讯
- hplaserjetp1008打印机驱动安装失败怎么办?解决方法步骤
- 无线路由器怎么设置?TP-LINK无线路由器设置教程_当前观点
- 电脑只有浏览器可以上网其他软件都无法联网怎么办?解决措施
- 乒乓球十一分制比赛规则 2020最新乒乓球比赛规则
- 理想一体化速印机怎么样?理想一体化速印机性能-环球看点
- 华为鸿蒙系统怎么安装第三方软件?安装方法步骤
- 环球精选!在excel中如何将简体字变成繁体字?转换方法步骤
- 环球观速讯丨Simulink模块常用的设置有哪些?Simulink模块常用的设置
- 用Python3实现dota改建精灵——python库
- VR技术:打破传统呈现创新性的虚拟三维动画|当前滚动
- 吸尘器哪个牌子好?吸尘器扫地机器人有什么区别
- mac卡巴斯基激活码怎么用?免费领取教程来了
- 世界头条:JDK、JRE、JVM三者的联系与区别
- 厨卫十大品牌都有哪些?中国厨电行业最具影响力的十大品牌
- mysql设计总结 基于mysql的bbs设计总结|环球快报
- 全球报道:万利达电磁炉怎么样?万利达电磁炉相关介绍
- 充电提示音你GET了吗?教你用stp-by-step自定义充电提示音
- 热点评!各种常见排序算法实现 常见排序算法汇总
- 三星i458怎么样?报价多少?三星i458市场报价及测评
- 软件更新方法有哪些?软件更新方法远程更新:世界短讯
- 【全球速看料】win10开启OpenSSH服务及vps使用方法
- 天天速讯:两台未联网的Win7电脑怎么建立局域网游戏?操作步骤
- elasticsearch怎么安装插件?elasticsearch拼音分词插件安装教程
- 简讯:湿帘冷风机原理是什么?湿帘冷风机的作用与工作原理
- 维纳滤波是最优的线性滤波器 矩阵&向量的求导方法
- 最新:如何实现父子进程间通信?linux管道pipe详解
- 科龙空调遥控器怎么用?科龙空调遥控器使用方法
- 从虚拟化安全到容器安全:Docker容器的安全机制与解决方案-世界动态
- UNION指令怎么使用?UNION指令的用法
- 《龙文鞭影》里面写了啥?《二十四史》里的人物典故
- 山煤国际(600546)2月9日主力资金净买入4135.05万元
- 控制寄存器和命令寄存器的英文理解(一)_世界今头条
- hive中Buckets详解 Buckets指定列计算hash
- 天天视点!豆芽是怎么生长的?豆芽的生长过程观察日记
- 年货从不缺席!今年还是会有《使命召唤》游戏|当前热议
- 滚动:无双工作室带来《狂野之心》15分钟试玩演示
- 极限超频 撼讯科技Powercolor7900XTX水冷!|环球实时
- 林克坐上无人机?《塞尔达王国之泪》新预告片发布
- 美股市场反弹,华尔街几近冰冻的IPO开始回暖
- 三星最好的平板电脑_三星平板电脑推荐_三星平板推荐 环球报资讯
- 环球关注:性能炸裂!英特尔酷睿i9-13980HX登顶笔记本跑分榜
- Netflix的密码共享打击措施在加拿大、新西兰、葡萄牙和西班牙开始实施 热门看点
- 全国养老保险个人账户查询官网_个人养老保险查询个人账户查询官网 每日资讯
- 环球热门:模特王鲲鹏,王鲲鹏电影,王鲲鹏个人资料
- 微动态丨广州大道北华快节点跨线桥正式开放
- 被14岁粉丝表白 周星驰:年轻人不应过度沉迷我美色:全球热讯
- Fami通新一周销量榜 《精灵宝可梦朱/紫》再登顶_天天热讯
- 世界最新:网课留学,即将成为历史
- 「围攻」特斯拉:每日简讯
- 男士毛衣品牌推荐_男士毛衣品牌
- 安卓14发布首个版本:可双开APP了_世界最新
- 真我GT Neo5发布:240W快充 2499元起
- 华硕发布新路由器:首次加入双2.5G网口
- 新动态:38999元 雷蛇发新笔记本:24核i9+RTX 4090
- 大精神在基层(五十八)丨瀍河分局:民警真情救助群众暖人心
- 环球快看:外媒发起任天堂直面会观众投票:《塞尔达传说:王国之泪》不敌《银河战士Prime复刻版》屈居第三
- 漂移竞速游戏《Drift CE》公布 今春登陆主机
- 迪士尼裁员7000人 可降低55亿美元成本
- 我,黄山谷,出门一笑大江横,这人间来过了 世界资讯
- 如今爆火的AIGC,会成为下一个泡沫破灭的NFT嘛?
- 国外玩家猜测PS5新机型是否涨价:标准版价格与数字版一致 光驱单卖100美元-环球快资讯
- 玩家猜测:《塞尔达传说:王国之泪》新载具系统是受各种玩家在《旷野之息》骚操作的启发
- 【聚看点】“零成本”月入数10万,盗版ChatGPT成提款机
- Lattice Avant:拓展FPGA市场的广阔空间