原文链接:风一带你一起使用Python的文本库制作词云图

碎碎念念: 大家好!我是风一;数据分析师在日常工作中有时需要和文本打交道,最常见的就是从评价或评论中提取一些关键字,比如电商的商品评价,短视频的用户评论等,以便对用户的态度能够有所掌握,协助业务方找到问题所在。

Python 提供了非常强大的包来解决此类问题,其中最重要的两个包是 jieba 和 wordcloud。这两个包分别用于分词和绘制词云图,这也是在数据分析中文本处理的两个步骤。

分词,顾名思义,就是将一句话切分成不同的词。这类涉及分词的三种模式:

  • 精确模式:试图将句子精确的切分开,适合文本分析。
  • 全模式:把句子中所有可以成词的词都扫描出来,速度非常快,但是不能解决歧义问题。
  • 搜索引擎模式:在精确模式的基础上,对长词再次进行切分,已提高召回率,适合搜索引擎分词。

以下进入正文:

import jieba  # 导入分词库

# 精确模式
rs_01 = jieba.lcut("大家好!我是在成长的风一", cut_all = False)
# ['大家', '好', '!', '我', '是', '在', '成长', '的', '风一']

# 全模式
rs_02 = jieba.lcut("大家好!我是在成长的风一", cut_all = True)
# ['大家', '好', '!', '我', '是', '在', '成长', '的', '风', '一']

# 搜索引擎模式
rs_03 = jieba.lcut_for_search("大家好!我是在成长的风一")
# ['大家', '好', '!', '我', '是', '在', '成长', '的', '风一']

由于不管使用哪一种模式进行分词时、都无法识别专属名称、如:在成长的风一;因此、就会涉及到两个词典,自定义词典和停用词典:

  • 自定义词典:以TxT文件形式输入,每个词占据一行。
# 自定义词典:这里自定义了 "在成长的风一"
jieba.load_userdict("user_dict.txt")
jieba.lcut("大家好!我是在成长的风一", cut_all = True)

# ['大家', '好', '!', '我', '是', '在成长的风一', '成长', '的', '风', '一']
  • 停用词典:可根据需要过滤掉所需的词。
# 停用词词典、这里停用了 "大家"
import sys
stop_words = []
with open('stop_words.txt', 'r', encoding='utf-8') as f:
    for line in f:
        stop_words.append(line.strip('\n').split(',')[0])

jieba.load_userdict("user_dict.txt")
[k for k in jieba.lcut("大家好!我是在成长的风一", cut_all = True) if k not in stop_words] 

# ['好', '!', '我', '是', '在成长的风一', '成长', '的', '风', '一']

有了分词的结果后、就可以绘制词云了,主要使用 wordcloud 包。这里要绘制的是一部电影的评论词云,代码如下:

# 导入相应的库
import jieba
# from scipy.misc import imread  # 这是一个处理图像的函数、但scipy已经将imread等命令删除,官方文档中有说明
import imageio # 解析图片
from wordcloud import WordCloud, ImageColorGenerator # 背景图
import matplotlib.pyplot as plt  # 作图
from collections import Counter  # 统计
import pandas as pd 


# 读取自定义词典
jieba.load_userdict("user_dict.txt")

# 读取停用词词典
stop_words = []
with open("stop_words.txt", 'r', encoding = 'utf8') as f:
    for line in f:
        stop_words.append(line.strip('\n').split(',')[0])
        
# 建立分词列表
tomato_com = pd.read_excel('西虹市首富.xlsx')
tomato_str = ''.join(tomato_com['comment'])
words_list = [k for k in jieba.lcut_for_search(tomato_str) if k not in stop_words]
words_list = [k  for k in words_list if len(k)>1]

分词列表由于不便于查看、将列表转换为 DataFrame格式、并进行字段的统计添加,便于一目了然的查看评论的情况:

# 列表转换为DF
words_df = pd.DataFrame(words_list, columns = ['词汇'])

# 统计词汇数量
words_df = words_df["词汇"].value_counts().reset_index(
).rename(columns = {"index": "词汇", "词汇": "数量"}    
).sort_values(by = "数量", ascending = False)

# 添加数量占比
words_df_TOP["占比"] = (words_df_TOP["数量"] / words_df.shape[0]).apply(lambda x: '%.2f%%' %(x * 100)) 

下图可直接看出、该影片的评论还是很不错的
在这里插入图片描述

通过 Python 提供的自定义背景图片,自定义的图片绘制词云:

# 解析图片
back_color = imageio.imread("西红柿.jpg")

# 词云图参数设置
wc = WordCloud(
    background_color = 'white', # 背景颜色
    max_words = 200, # 最大词数
    mask = back_color, # 以该参数值作图绘制词云,这个参数不为空时,width 和 height 会被忽略
    max_font_size = 300, # 显示字号的最大值
    font_path = "C:/Windows/Fonts/STFANGSO.ttf", # 解决现实 口 型字符串乱码问题
    random_state = 42, # 为每个词返回一个 PIL 颜色
    # width = 1000, # 图片的宽度
    # height = 860 # 图片的高度
)

tomato_count = Counter(words_list) # 分词列表统计
wc.generate_from_frequencies(tomato_count)
# 基于彩色图像生成相应的颜色
image_colors = ImageColorGenerator(back_color)

# 绘制词云图
plt.figure()
plt.imshow(wc.recolor(color_func=image_colors))
plt.axis('off')

# 图片的保存
wc.to_file('wc.jpg')

在这里插入图片描述

说明:文章大部分篇幅来源于徐老师(徐麟)所著书籍《拿下Offer数据分析师求职面试指南》的读书笔记以及相应的学习扩展补充。

作者:在成长的风一
文章首发:公众号【在成长的风一】
未经允许禁止转载,需要转载请微信联系授权(微信号:Fy180920)

更多推荐