Python文本处理—jieba & wordcloud
·
碎碎念念: 大家好!我是风一;数据分析师在日常工作中有时需要和文本打交道,最常见的就是从评价或评论中提取一些关键字,比如电商的商品评价,短视频的用户评论等,以便对用户的态度能够有所掌握,协助业务方找到问题所在。
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)
更多推荐



所有评论(0)