Python数据分析_广告投放及评论挖掘
【模块一:广告投放分析案例】
【理解】广告投放分析需求
-
目标:理解广告投放分析需求
-
实施
-
背景:XXX广告公司,广告运营公司负责为客户提供全方位的广告服务,以实现客户的营销目标。
-
广告策划与投放:为客户制定广告策略,并负责在各种媒体平台上进行广告投放。
-
数据分析与优化:通过分析广告效果数据,优化广告投放策略,提高广告ROI投资回报率。
-
跨平台推广:负责将广告内容在不同的媒体平台上进行推广,包括社交媒体、搜索引擎、应用程序等。
在这里插入图片描述
-
品牌营销:协助客户进行品牌宣传与推广,提升品牌知名度和美誉度。
-
-
需求
- 1、通过Pandas对近一年(2023年)的品牌投放数据进行分析,汇总每个品牌在这一年的搜索人数、点击人数、支付人数
- 2、对需求1的结果按照搜索人数进行降序排序,并计算每个品牌点击转化率及支付转化率
- 点击转化率 = 点击人数 / 品牌搜索人数
- 支付转化率 = 支付人数 / 点击人数
- 3、对需求2的结果取出Top15,然后基于Top15分析各个公司的转化情况,辅助制定不同品牌后续的推广策略
-
目标
-
-
小结:理解广告投放分析需求
【理解】广告投放数据探索
-
目标:理解广告投放数据探索
-
实施
-
原始数据:现有近两年【2022&2023】每个月的品牌推广的数据结果
-
数据内容:每份数据中记录了每个品牌在当前年的当前月的品牌搜索人数、点击人数、支付人数信息
-
分析思路
-
需求1:对品牌进行分组,对搜索人数、点击人数、支付人数按月进行上卷得到2023年的结果
-
step1:读取数据
-
step2:数据清洗,需要构造一列:年, 并将2023年的数据筛选出来
-
step3:数据分析:按照维度对指标进行上卷聚合:原子指标
-
-
需求2:对需求1的结果按照搜索人数降序排序,基于搜索人数、点击人数、支付人数实现漏斗分析
- 排序:df.sort_values(by=搜索人数, asc=False)
- 搜索-点击转化率 = 点击人数 / 品牌搜索人数
- 点击-支付转化率 = 支付人数 / 点击人数
- 复合指标:基于多个原子指标进行复合计算
-
需求3:对需求2的结果筛选出前15名,使用绘图工具进行绘图,查看不同品牌在不同转化率下分布情况
-
-
-
小结:理解广告投放数据探索
【实现】广告投放数据分析
-
目标:实现广告投放数据分析
-
实施
-
流程
- step1:读取数据,通过Pandas读取Excel的数据到程序中,并增加时间列:年
- step2:筛选数据,筛选出需要使用的2023年的数据
- step3:构建需求1,按照品牌分组,统计每个品牌的总搜索人数、点击人数、支付人数
- step4:构建需求2,对需求1降序排序,并基于漏斗模型增加两列:点击转化率、支付转化率
- step5:构建需求3,基于需求2的Top15,用Matplotlib实现散点图,按照点击转化率和支付转化率查看品牌分布情况
-
问题:怎么实现多个DataFrame的数据的行拼接?
-
方式一:append
-
方式二:concat
-
功能:将多个数据框按照指定的轴进行连接,可以是按行(axis=0)连接或者按列(axis=1)连接。
-
语法:pandas.concat(objs, axis, join, ignore_index, verify_integrity, sort)
-
参数
参数 功能 取值 objs 要连接的pandas对象列表 DataFrame或Series对象组成的列表 axis 指定连接的轴 0表示沿着行的方向进行连接,1表示沿着列的方向进行连接,默认为0 join 指定连接方式 "inner"表示内连接,"outer"表示外连接 ignore_index 是否忽略原始索引并生成新的整数索引 True表示忽略原始索引,False表示不忽略,默认为False
| verify_integrity | 验证结果对象是否重复 | 如果为True,检查结果对象是否重复,默认为False |
| sort | 对非常大的DataFrame对象,禁用排序可能会带来更好的性能 | 默认为False,如果为True,则在将数据添加到结果之前对其进行排序 |-
示例
import pandas as pd
创建示例数据
data1 = {‘A’: [1, 2, 3], ‘B’: [4, 5, 6]}
data2 = {‘A’: [7, 8, 9], ‘B’: [10, 11, 12]}df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
print(df1)
print(df2)合并行
result_row = pd.concat([df1, df2])
result_rowimport pandas as pd
创建示例数据
data3 = {‘A’: [1, 2, 3], ‘B’: [4, 5, 6]}
data4 = {‘C’: [7, 8, 9], ‘D’: [10, 11, 12]}df3 = pd.DataFrame(data3)
df4 = pd.DataFrame(data4)
print(df3)
print(df4)合并列
result_column = pd.concat([df3, df4], axis=1)
result_column -
-
-
分析
-
step1:读取数据
# 导包 import pandas as pd import os# 测试读取一个文件,并构造日期列 = '2022' df = pd.read_excel('..data/01.adv_data/2022-01.xlsx', engine='openpyxl') df['日期'] = '2022-01.xlsx'[:4] df# 定义数据所在的目录路径 data_dir = '../data/01.adv_data/'# 定义一个空的DataFrame final_df = pd.DataFrame() # 遍历文件夹,取出每个文件的文件名 for name in os.listdir(data_dir):# 读取当前文件的数据,放入DataFrame中df = pd.read_excel(data_dir + name, engine='openpyxl')# 截取年份作为日期类的值df['日期'] = name[:4]# 将当前读取到的文件的数据放入最终的DataFrame中final_df = pd.concat([final_df, df])# 输出最终拼接的DataFrame final_df
-
step2:筛选数据
# 筛选出2023年的数据 final = final_df[final_df['日期']=='2023'] final
-
-
- step3:构建需求1
# 计算每个品牌的搜索人数、点击人数、支付人数,并按照搜索人数降序排序
result_df = final.groupby('品牌',as_index=False)[['品牌搜索人数','点击人数','支付人数']].sum()
result_df
- step4:构建需求2
# 计算点击转化率与支付转化率
result_df_sort = result_df.sort_values('品牌搜索人数',ascending = False)
result_df_sort['搜索-点击转化率'] = result_df_sort['点击人数']/result_df_sort['品牌搜索人数']
result_df_sort['点击-支付转化率'] = result_df_sort['支付人数']/result_df_sort['点击人数']
result_df_sort.head(10)
- 小结:实现广告投放数据分析
【实现】广告投放分析报表
-
目标:实现广告投放分析报表
-
实施
from matplotlib import pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] #筛选出TOP15的品牌 draw_data = result_df_sort.head(15)#设置画布大小 plt.figure(figsize=(16,9))#筛选对应的x,y值和标签名 x = draw_data['搜索-点击转化率'].to_list() y = draw_data['点击-支付转化率'].to_list() z = draw_data['品牌搜索人数'] text = draw_data['品牌'].to_list()#绘制气泡图 plt.scatter(x, y, s=z / 300, c=x, cmap="Reds", alpha = 0.7, edgecolors = "green", linewidth = 1)#为每个值打上对应品牌名 for i,txt in enumerate(text):plt.text(x=x[i], y=y[i], s=txt, size=18, horizontalalignment='center', verticalalignment='center')# 添加黑色虚线水平辅助线 plt.axhline(y=0.12 ,color='black', linestyle='--',alpha = 0.5)# 添加黑色虚线垂直辅助线 plt.axvline(x=0.465,color='black', linestyle='--',alpha = 0.5)plt.xlabel("搜索-点击转化率") plt.ylabel("点击-支付转化率") plt.title("TOP15品牌搜索分布",size = 15) plt.show()
- 搜索-点击转化率高,代表搜索结果的精准度高,搜索后展示页面的吸引力大等
- 点击-支付转化率高,更可能受产品详情页面、活动力度等影响
- 小结:实现广告投放分析报表
【模块二:评论挖掘分析案例】
【理解】评论挖掘分析需求
-
目标:理解评论挖掘分析需求
-
实施
- 背景:XXX电商公司【主营乐器】,希望能够通过用户商品的评价数据进行分析,可以帮助其提高运营效率、增强市场竞争力,并更好地满足用户需求。
-
了解用户喜好与行为:通过评价数据分析,可以深入了解用户对产品和服务的喜好、购买习惯以及使用体验,从而调整经营策略和产品设计。
-
改进产品和服务:通过分析评价数据,电商公司可以获得产品的优点和不足之处,有针对性地改进产品质量,并提供更好的售后服务,以满足客户需求。
-
建立声誉和信任:积极回应用户评价,解决用户问题并改进产品能够增强品牌声誉,树立信誉良好的形象,促进用户忠诚度。
述 -
指导营销策略:分析评价数据可以帮助电商公司了解产品或服务的优势,从而指导市场营销策略的制定,精准推广产品。
-
需求
- 非文本分析需求:统计用户评价基础指标
- 1、统计每个商品的评价数、好评数、中评数、差评数
- 维度:商品
- 指标:评价数、好评数、中评数、差评数
- 2、统计每个商品在每个月的评价数、好评数、中评数、差评数
- 维度:商品、月份
- 指标:评价数、好评数、中评数、差评数
- 文本分析需求:对评价内容进行分析
- 3、统计所有商品的评价中好评的关键词及差评的关键词,并将核心关键词提取展示出来,用于提供AI模型训练
- 转化:统计每个评价词语出现次数
- 难点:从每句评价中,将出现每个词取出 => 分词器
- 非文本分析需求:统计用户评价基础指标
-
目标一:非文本内容分析
-
目标二:文本内容分析
-
小结:理解评论挖掘分析需求
【理解】评论挖掘数据探索
-
目标:理解评论挖掘数据探索
-
实施
-
原始数据:基于公司后台的CRM系统导出了所有商品的评分信息,生成了评论信息的CSV文件
-
数据内容:评分、日期、产品规格类型、整体评价、内容、商品名称、用户名称
-
分析思路
-
需求
1: 统计每个商品的评价数、好评数、中评数、差评数select product_name, count(1) as eval_cnt, sum(case when substr(stars, 0, 1) in (4,5) then 1 else 0 end) as great_eval_cnt, sum(case when substr(stars, 0, 1) = '3' then 1 else 0 end) as mid_eval_cnt, sum(case when substr(stars, 0, 1) in (1,2) then 1 else 0 end) as bad_eval_cntfrom tablegroup by product_name 2: 统计每个商品在每个月的评价数、好评数、中评数、差评数select product_name, func(date) as y_m, count(1) as eval_cnt, sum(case when substr(stars, 0, 1) in (4,5) then 1 else 0 end) as great_eval_cnt, sum(case when substr(stars, 0, 1) = '3' then 1 else 0 end) as mid_eval_cnt, sum(case when substr(stars, 0, 1) in (1,2) then 1 else 0 end) as bad_eval_cntfrom tablegroup by product_name, func(date) as y_m 3: 统计所有商品的评价中好评的关键词及差评的关键词,并将核心关键词提取展示出来,用于提供AI模型训练selectexplode(split(content, ' ')) as wordfrom tablecontent words word I love China [I, love, China] I I am in Shanghai [I, am, in, Shanghai] love||word I love China I am in Shanghai||word cnt I 2 love 1 China 1 ……-- 难点:Python中怎么分词?时态?
-
准备
- 对数据进行转换:将评分信息中具体的分数抽取成单独的分数列
- 对数据进行补全:根据评分分数转换评价字段,1,2 差评 3 中评 4 5 好评
- 对数据进行补全:获取每个评分的年月信息
-
分析
- 按照商品分组对评价数据进行聚合,统计个数,好评数、中评数、差评数
- 按照商品和月份分组对评价数据进行聚合,统计个数、好评数、中评数、差评数
- 按照好评和差评,提取所有评论,解析出评论中所有关键词,构建词云图
-
-
安装依赖(免安装)
# 安装NLP的文件解析工具nltk以及图表工具pyecharts pip install nltk -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip install pyecharts -i https://pypi.tuna.tsinghua.edu.cn/simple/
-
安装模块:将今日资料下的
nltk_data
文件夹放入ANACONDA_HOME/share
目录下
-
-
小结:理解评论挖掘数据探索
【了解】NLP自然语言处理
-
目标:理解NLP自然语言处理
-
实施
-
问题1:什么是NLP?
- 自然语言处理(Natural Language Processing,NLP)是人工智能和计算机科学领域中的一个分支,致力于使计算机能够理解、解释、操作语言。NLP 的目标是促使计算机能够有效地与人类语言进行交互。
- NLP 超越了简单的语言翻译;它还涉及到文本分析、语音识别、情感分析、自动摘要、问答系统等方面。其应用范围包括自动翻译、信息检索、文档分类、智能客服、自然语言对话系统(如聊天机器人)、语音识别和合成等各个领域。
- 在NLP 中,常见的任务包括标记词性、实体识别、句法分析、语义理解和生成自然语言。当结合机器学习和深度学习技术时,NLP 可以更准确地理解和处理大规模文本数据,并从中提取有价值的信息。
- 总之,NLP 是涉及计算机和人类语言交互的技术领域,其应用广泛,将自然语言与计算机科学相结合,为文本处理和语义理解带来了巨大的潜力。
-
问题2:怎么做NLP?
-
文本预处理:包括词条化(tokenization)、去除停用词(stop words removal)、词干提取(stemming)和词型还原(lemmatization)。
-
特征提取:使用词袋模型(Bag of Words)或 TF-IDF 等方法从文本中提取特征,以便进行机器学习模型的训练。
-
词向量嵌入:应用诸Word2Vec、GloVe等算法来将单词映射到一个连续的向量空间中,以便更好地表达语义和上下文关联。
-
模型选择:选择合适的机器学习模型或深度学习模型来处理特定 NLP 任务,例如文本分类、情感分析、命名实体识别等等。
-
模型训练与调优:在大规模数据集上训练所选的模型,并进行参数调优以获得最佳性能。
-
应用领域:将已经训练好的模型应用到具体的 NLP 任务中,如机器翻译、文本摘要、信息检索、问答系统等。
-
评估与迭代:对模型的性能进行评估,如果需要,可以进一步迭代改进模型和流程。
-
在实现 NLP 时,还有许多具体的工具和库可供选择,比如 NLTK(Natural Language Toolkit)、SpaCy、Gensim 和 TensorFlow 等计算机语言和深度学习框架,它们都提供了强大的功能来帮助实现 NLP 相关的任务。
-
-
问题3:常见的NLP处理有哪些?
-
语言分词-Tokenizer
- 根据语义,从句子中提取所有核心词语
- 需要去除一些符号,语气词等
- 英文:按照空格切分即可
- 常见:NLTK(英文)、jieba(中文)
-
词干提取 – Stemming
-
词干提取是去除单词的前后缀得到词根的过程。
-
大家常见的前后词缀有「名词的复数」、「进行式」、「过去分词」…
-
-
词形还原 – Lemmatisation
-
词形还原是基于词典,将单词的复杂形态转变成最基础的形态。
-
词形还原不是简单地将前后缀去掉,而是会根据词典将单词进行转换。比如「drove」会转换为「drive」。
-
-
停用词:获取原始单词之后还需要去掉停用词和一些助词,虚词,连词
- 停用词(stop word):可以手动指定那些单词经过处理之后不会保留在分词结果中 stop word
- 一般我们只关心名词,动词和形容词
-
-
-
-
小结:了解NLP自然语言处理
【实现】评论挖掘数据清洗:评分处理
-
目标:实现评论挖掘数据清洗评分处理
-
实施
-
step1:导入依赖
# 导入 Pandas import pandas as pd# 导入正则库 import re# 导入数据库 import math# 导入时间库 import datetime# 导入 Matplotlib import matplotlib.pyplot as plt# 导入 Seaborn import seaborn as sns plt.style.use('fivethirtyeight') # Seaborn 中的 fivethirtyeight 风格来呈现数据可视化图表# 导入PyEcharts # PyEcharts中用于配置图表的选项对象。它提供对图表外观、数据、标题等各个方面进行详细配置的功能。 import pyecharts.options as opts # PyEcharts中用于创建词云图的类或模块。词云图是一种以词频来展示文本数据的可视化方式。 from pyecharts.charts import WordCloud# 这个命令的作用是将 Matplotlib 绘制的图表嵌入到 Notebook 中的单元格中,使得图表可以直接显示在 Notebook 中而不需要额外的窗口。PyCharm中不需要,可以注释掉。 # %matplotlib inline# 导入 Warning,忽略不必要的warnings import warnings warnings.filterwarnings('ignore')# 导入 nltk:自然语言文本处理的包 import nltk # 是 NLTK 中用于执行词型还原(lemmatization)的类。词型还原是将单词转换为它们的基本形式的过程,而不仅仅是简单地截断词尾或前缀。这有助于将相关的词形归并到同一个标准形式。 from nltk.stem.wordnet import WordNetLemmatizer # 是一个英语词汇数据库,也是 NLTK 库中的一个模块,提供了从文本中提取含义和关系的结构化信息。它具有同义词集合、层次结构以及与单词相关的语义信息等内容。 from nltk.corpus import wordnet as wn # 是 Python 标准库中的一个类,位于 collections 模块中,而在 NLTK 中也可以使用。它提供了对可哈希对象进行计数的支持,对于统计词汇、频率分布等非常有用。通过 Counter 可以轻松地统计词汇、字符或其他有效的哈希对象的出现次数,为进一步的分析提供数据支持。 from collections import Counter
-
step2:加载数据
# 加载用户评论数据 reviews = pd.read_csv('../data/02.evl_data/reviews.csv') reviews
-
step3:数据清洗:删除空评论的数据
# 删除缺失值, 我们要做评论文本分析, 如果评论缺失把对应数据删除 reviews_df = reviews.dropna(subset=['short_d','content']) reviews_df
-
step3:数据清洗:从stars 中 抽取评分
# 定义一个函数 get_stars,传递一个参数 evl_stars , 截取 第1位 并转换为 float类型 返回 def get_stars(evl_stars):return float(evl_stars[:1])# 构建 stars_num 列,值为 df_reviews 对 stars 列调用 get_stars 函数 reviews_df['stars_num'] = reviews_df['stars'].apply(get_stars) reviews_df
-
-
step3:数据清洗:转换成好评、中评、差评
# 依据评星的数量 划分 好中差评 1,2 差评 3 中评 4 5 好评 # 使用 cut 函数 对 star_num 列的值进行划分 # bins:前开后闭区间 reviews_df['reviews_cate'] = pd.cut(reviews_df['stars_num'], bins=[0,2,3,5], labels=['差评','中评','好评']) reviews_df
# 处理之后查看结果reviews_df['reviews_cate'].value_counts()
- 小结:实现评论挖掘数据清洗评分处理
【实现】评论挖掘数据清洗:时间处理
-
目标:实现评论挖掘数据清洗时间处理
-
实施
-
step3:数据清洗:获取日期年月
# 测试处理时间逻辑 test_str = 'Reviewed in the United States on June 24, 2020' print("原始数据:", test_str) test_str_date = test_str.split('on ')[1] print("日期数据:", test_str_date) year_str = test_str_date.split(', ')[1] month_str = test_str_date.split(',')[0].split(' ')[0] day_str = test_str_date.split(',')[0].split(' ')[1] print("年、月、日:", year_str, month_str, day_str)
# 获取评论中的日期信息,转换成日期时间格式 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 = y + '-01-' + delif m == 'February' or m == 'Feb':on_date = y + '-02-' + delif m == 'March' or m == 'Mar':on_date = y + '-03-' + delif m == 'April' or m == 'Apr':on_date = y + '-04-' + delif m == 'May':on_date = y + '-05-' + delif m == 'June' or m == 'Jun':on_date = y + '-06-' + delif m == 'July' or m == 'Jul':on_date = y + '-07-' + delif m == 'August' or m == 'Aug':on_date = y + '-08-' + delif m == 'September' or m == 'Sep':on_date = y + '-09-' + delif m == 'October' or m == 'Oct':on_date = y + '-10-' + delif m == 'November' or m == 'Nov':on_date = y + '-11-' + delif m == 'December' or m == 'Dec':on_date = y + '-12-' + dreturn on_date# # 对评论时间列应用get_date 函数,获取date_d时间 reviews_df['date_d']=reviews_df['date'].apply(get_date) reviews_df.head(5)
# 从 date_d 中提取年月,zfill(2),保持2位,不够使用0填充 reviews_df['year_month'] = reviews_df['date_d'].dt.year.astype(str) +\reviews_df['date_d'].dt.month.astype(str).str.zfill(2)# 查看数据 reviews_df.head()
-
-
小结:实现评论挖掘数据清洗时间处理
【实现】评论非文本分析报表
-
目标:实现评论非文本分析报表
-
实施
-
需求1:统计每个商品的评论数
# 统计每个商品的评论数 reviews_df['product_name'].value_counts().plot(kind='bar')
-
需求1:统计每个商品的好评数、中评数、差评数
# 不同产品 everjoys ranch kala donner # 构建结构化多绘图网格,不同子集上绘制同一图的多个实例, --> FacetGrid() # FacetGrid 参数说明 data 绘图用到的数据 col每一个小图 利用哪一列来截取数据 col_wrap 小图有几列 sharex是否共享x轴 sharey 是否共享Y轴 height图片高度 aspect 宽高比例 g = sns.FacetGrid(data = df_reviews,col = 'product_name',col_wrap = 2,sharex=False,sharey=False,height = 5, aspect= 1.2) # g.map 绘制分面图中的小图,利用 sns.countplot 绘图 , 从reviews_df 利用 product_name分组 每组画 reviews_cate 不同类别的数量order 指定柱子的顺序 g.map(sns.countplot,'reviews_cate',order=['好评','差评','中评'])
-
-
需求2:统计每个商品每个月的评论数
# 统计不同产品(‘product_name’)不同年月(‘year_month’)的评论数量 df_content = reviews_df.groupby(['product_name','year_month'])[['content']].count().reset_index() df_content
g=sns.FacetGrid(data=df_content,col='product_name',col_wrap=2,sharey=False,sharex=False,height=4,aspect =2) # 第一个参数传入的是 要调用哪个API 绘图, 后面几个参数传的是 调用 (plt.plot 的时候需要用到哪些参数, 具体的数据传入列名就行了 g.map(plt.plot,"year_month",'content',marker='1')#marker='1' 折线图每一个点会一条短线来表示
-
需求2:统计每个商品每个月的好评数、中评数、差评数
# 统计每个商品每个月的好评数、中评数、差评数 df_content = reviews_df.groupby(['product_name','year_month','reviews_cate'])[['content']].count().reset_index() df_content
g = sns.FacetGrid(data=df_content,col='product_name',col_wrap=2,sharey=True,sharex=False,height = 4,aspect=2,hue ='reviews_cate') g.map(plt.plot,'year_month','content',marker='1') g.add_legend()
-
小结:实现评论非文本分析报表
【实现】评论文本挖掘数据分析
-
目标:实现评论挖掘数据分析
-
实施
-
流程
- step1:对数据进行去空的操作
- step2:筛选出所有好评的数据和差评的数据
- step3:对所有数据进行分词,拆分评论中出现的每个词
-
实现
# 现有数据 reviews_df
# 去重 df_data = reviews_df.drop_duplicates(subset=['product_name','type','content','name','date_d']) df_data
# 抽取一句评价 df_data['content'][0]
# positive 积极的, 这里表示好评 sample_positive = df_data[(df_data['product_name']=='everjoys-Soprano')&(df_data['reviews_cate']=='好评')] sample_positive
-
# negative 负面的消极的 这里表示差评sample_negative = df_data[(df_data['product_name']=='everjoys-Soprano')&(df_data['reviews_cate']=='差评')]sample_negative
# 准备一个英文文本处理的pipeline 分词 → 词性还原 → 过滤停用词def get_lemma(word):# 进行时 过去式的动词 还原成原来的形式lemma = wn.morphy(word)# 如果不是动词, 会返回Noneif lemma is None:# 返回None 就把原来的单词返回去return wordelse:return lemma# 标点符号也作为停用词punctuation = [",", ":", ";", ".", "!", "'", '"', "’", "?", "/", "-", "+", "&", "(", ")",'I','It','My','The']stop_words_list = nltk.corpus.stopwords.words('english')+punctuation# 准备文本处理的pipelinedef prepare_text(txt):# 分词tockens = nltk.word_tokenize(txt) # 这里返回的是经过了分词之后的单词列表# 词性还原tokens =[get_lemma(token) for token in tockens] # 遍历了tockens 这个列表, 没个单词都调用了get_lemma 返回的结果再拼成列表# 过滤停用词tokens = [ i for i in tokens if i not in stop_words_list]return tokens
# 对评论列的series apply使用自定义函数, 返回一个series 转换成列表 clean_text_positive = sample_positive['content'].apply(prepare_text).to_list()clean_text_positive
clean_text_negative = sample_negative['content'].apply(prepare_text).to_list()clean_text_negative
- 小结:实现评论挖掘数据分析
【实现】评论文本挖掘分析报表
-
目标:实现评论挖掘分析报表
-
实施
-
流程
- step4:统计每个词在每个句子中出现的次数
- step5:获取每个词在整体中出现的总次数
- step6:取出好评和差评中出现频率最高的前100个词
- step7:构建词云图
-
实现
-
测试
# 传入一个列表, 统计列表中元素出现的次数, 返回的是 [('元素',次数)] # most_common 出现次数最多的 Counter(clean_text_positive[0]).most_common(2)
-
step1:定义一个函数统计每个次在整体评论中出现的次数
def get_words(clean_text): # 创建一个列表 用来保存所有评论的单词words_all = []# 取出 好评 或者 差评中的每条评论for words in clean_text:# 取出每条评论中的每个词for word in words:# 将评论中的单词放入列表中words_all.append(word)# 统计每个单词出现了多少次words_all_count = Counter(words_all)# 返回最终结果return words_all_count# 对好评调用get_words 获取四个指标 words_all_positive=get_words(clean_text_positive)# 对差评调用get_words 获取四个指标 words_all_negative=get_words(clean_text_negative)
-
step2:取出好评和差评中出现频率最高的前100个词
# 取出前100个频率最高的单词 positive_words_wordcloud=words_all_positive.most_common(100) positive_words_wordcloud
# 取出前100个频率最高的单词 negative_words_wordcloud=words_all_negative.most_common(100) negative_words_wordcloud
-
step3:基于Pyecharts构建词云图
(WordCloud().add(series_name="好评词云",data_pair=positive_words_wordcloud, #传入绘制词云图的数据word_size_range=[16, 80]) #word_size_range 字号大小取值范围.set_global_opts(title_opts=opts.TitleOpts(title="好评词云", title_textstyle_opts=opts.TextStyleOpts(font_size=23) # 设置标题字号),tooltip_opts=opts.TooltipOpts(is_show=True), # 设置为True 鼠标滑过文字会弹出提示框).render() )
(WordCloud().add(series_name="差评词云", data_pair=negative_words_wordcloud, word_size_range=[16, 80]).set_global_opts(title_opts=opts.TitleOpts(title="差评词云", title_textstyle_opts=opts.TextStyleOpts(font_size=23)),tooltip_opts=opts.TooltipOpts(is_show=True),).render_notebook() )
-
-
-
小结:实现评论挖掘分析报表