用户评论文本挖掘
学习目标
- 知道评论文本挖掘的作用
- 掌握使用nltk和gensim来进行基本NLP处理
一、评论文本挖掘介绍
- 文本挖掘就是从文本信息中挖掘我们感兴趣的内容
- 数据分析师为什么要关注文本数据
- 在我们日常的产品和运营工作中,经常接触的数据分析方法、形式绝大部分是基于对数字(值)的描述性分析。这些又被称为结构化数据
- 除此之外,图片,文字,视频,这些统称为非结构化数据
- 非结构化数据蕴含信息量大,特别是文本信息(用户评论)是用户对产品、服务是否满意的重要了解手段
- 在产品和运营的实际工作中, 发掘出用户的喜好、购买/使用及流失的内在原因,对我们的工作至关重要
- 对于非自营电商类业务,文本数据显得异常重要
- 如果是自有APP,可以通过埋点获取我们想要的数据。但作为三方卖家触,达用户手段有限,只能通过平台暴露出的数据接口
- 我们能够通过平台获得的非结构化数据主要是指用户评论数据
- 用户评论数据包含了用户信息,对手信息,产品信息
- 大家都是电商品台的用户,对于用户评论的重要性都有认识,有关评论展开的营销也很多:刷好评,删除评论,红包索评等

- 通过评论文本挖掘可以实现如下目标:
- 运营优化:挖掘用户喜好,挖掘竞品动态,提升自身产品竞争力
- 产品更新:发掘产品更新动向,及时的从用户处发现产品问题
- 口碑管理:识别出自家产品和竞争对手的口碑差异
二、项目背景
-
我们想从用户的角度了解有关竞品以及市场的信息
-
Ukulele 属性简介
- 尺寸:Soprano 21寸 Concert 23寸 Tenor26寸
- 材质:椴木,乌木,桃花芯,塑料
- 颜色:原木色,红色,蓝色,黑色
-
看一下亚马逊评论的构成,我们主要的分析对象是评论正文
-
项目需求:
- 竞品销售情况细化:通过对竞品评论中分型号的历史评论数量,反推竞品的主要售卖产品的情况
- 竞品高分和低分的具体发声:高分4-5分的评论主要是说哪些,低分1-2分用户主要说什么,我们比较关注的方面又说了什么
-
技术实现:
- 竞品细化
- 高分、低分关键词提取
三、文本挖掘相关方法介绍
1、如何用数值来表示文本
-
机器不懂人类的自然语言,我们要将自然语言转换为机器易于理解的“语言”,NLP(Natural language processing)
-
NLP 里面,最细粒度的是词语,词语组成句子,句子再组成段落、篇章、文档。所以处理 NLP 的问题,首先要处理词语
-
词语处理的最终目标是用向量来表示词语
①获取原始文本 : Yes, Everjoys ukulele is the right Soprano Ukulele I have been looking for. It arrived earlier and very well packed, just the way I expected.
② 分词:[‘Yes’,’,’, ‘Everjoys’, ‘ukulele’, ‘is’, ‘the’, ‘right’, ‘Soprano’, ‘Ukulele’, ‘I’, ‘have’, ‘been’, ‘looking’, ‘for.’, ‘It’, ‘arrived’, ‘earlier’, ‘and’, ‘very’, ‘well’, ‘packed,’, ‘just’, ‘the’, ‘way’, ‘I’, ‘expected.’]
jieba
③ 向量化编码:[1,0,1,0,1,0,1,0……]
男[1,0]
女[0,1]
北京[1,0,0]
上海[0,1,0]
深圳[0,0,1]
onehot编码
pd.get_dummies()
-
分词阶段需要处理的内容:
-
首先将一句话拆分成一个一个单词,英文分词很简单,直接通过空格就可以,中文分词可以借助jieba这样的三方库
-
I’d I would
-
I have
-
接下来我们需要对有时态变化的单词还原成未变化的单词
-
词干提取 – Stemming
词干提取是去除单词的前后缀得到词根的过程。
大家常见的前后词缀有「名词的复数」、「进行式」、「过去分词」…
-
词形还原 – Lemmatisation
词形还原是基于词典,将单词的复杂形态转变成最基础的形态。
词形还原不是简单地将前后缀去掉,而是会根据词典将单词进行转换。比如「drove」会转换为「drive」。
-
-
获取原始单词之后还需要去掉停用词和一些助词,虚词,连词
- 停用词(stop word):可以手动指定那些单词经过处理之后不会保留在分词结果中 stop word
- 一般我们只关心名词,动词和形容词
-
上述过程都有三方库帮助我们实现
-
四、 代码实现
1、导包&载入数据
import pandas as pd
import re
import math
import datetime
import matplotlib.pyplot as plt
import seaborn as sns
plt.style.use('fivethirtyeight')
import warnings
# 忽略不必要的warnings
warnings.filterwarnings('ignore')
# nltk:文本处理的包
from nltk.stem.wordnet import WordNetLemmatizer # 词性还原
from nltk.corpus import wordnet as wn
from collections import Counter
import pyecharts.options as opts
from pyecharts.charts import WordCloud
%matplotlib inline
- 加载数据
df_reviews=pd.read_csv('data/reviews.csv')
df_reviews.head()

- 查看数据情况
df_reviews.info()

- 从上面结果中看出,short_d,content,name这三个字段有少量缺失,需要我们处理一下
2、数据处理
- 由于我们分析的就是评论的文本内容,所以content字段有确实的情况,我们直接做删除处理
# 对于评论内容空缺的,直接删除
df_reviews = df_reviews.dropna()
# 截取评论中的星级数据
def get_stars(n):
return float(n.replace(' out of 5 stars',''))
# 根据评星数量获取评价属性, 好评(4分及以上), 中评(3分), 差评(2分及以下)
def stars_cat(n):
'''
评分转换为好中差评 1分2分为差评, 3分中评, 4分5分好评
'''
if n<=2:
return '差评'
elif n ==3:
return '中评'
else:
return '好评'
# 获取评论中的日期信息,转换成日期时间格式
def get_date(x):
'''
处理评论日期 Reviewed in the United States on June 24, 2020
先用 'on ' 去拆分, 把日期文本拆分成两部分
再用', '拆分, 把后面的部分拆分成 ['月 日','年']
最后把前面的'月 日' 用空格拆分成 月 日
'''
x = x.split('on ')[1] # 把数据拆分成两部分 ['Reviewed in the United States on ','June 24, 2020']
x = x.split(', ')
y= x[1]
x = x[0].split(' ')
m,d = x[0],x[1]
if m=='January' or m=='Jan':
on_date='01-'+d+'-'+y
elif m=='February' or m==