资讯详情

高效构建基于Python的商品评论文本挖掘网页APP

在这里插入图片描述

CDA数据分析师 出品

作者:CDALevel Ⅰ持证人

职位:数据分析师

行业:大数据

背景

近年来,电子商务行业发展迅速。许多在传统行业工作但薪水不理想的人在网络电子商务行业工作。这一趋势使越来越多的人使用电子商务价值下的产品,不言而喻,如网上购物等行为。换句话说,大量网购的结果是数据量的增加。面对这种大数据,且时非结构化的数据如商品评论,怎么处理呢?如何从中提取有用的信息?自然语言处理技术给出了答案,从规则提取到统计建模再到非常热门的深度学习,无论是商家还是买家,都可以从文本中提取有用的商业价值。本文介绍了一个电商平台AirPods情感分析和快速词云图构建智能耳机产品的销售及相关商品信息。情感分析也是自然语言处理的一个方向

除了挖掘文本,本文还想建立一个网页APP。Python是目前流行的编程语言,使用Python构建网页APP常用的是Python结合Flask或者Django通过前后端构建网页的框架。这种方法通常需要一定的前端经验来修改CSS、HTML、JAVASCRIPT这些文件。对于没有前端经验的人来说,coder,读者在此推荐友好的全过程Python的库streamlit,也就是本文使用的库。利用streamlit可以轻松快速地构建网页APP,添加文本挖掘功能。就这样,做了一个小产品。下面,进入正题。

本文采用Anaconda进行Python主要涉及编译Python模块:

streamlit pandas cnsenti stylecloud time

本章分为三部分:

1.数据探索分析和商品评论文本提取

2.商品评论词云图可视化和情感分析

3.网页结构设计与实现

4.功能整合和效果呈现

01.数据探索分析和商品评论文本提取 本文采用的数据是宁电子商务平台上的商品评论数据。数据字段包括商品标题、价格和评估内容。其中,价格是最近4月份的实时价格。评估内容按时间顺序从近到远显示。以下是前五个元素的显示:

需要注意的是,上述五行显示AirPods第二代商品信息。原因是数据最初分为三个表,每个表的字段相同,共3个,2个维度字段和1个测量字段(这是CDA I课程中的数据结构会有提及)。因此,这份数据是3张表通过纵向合并方式对记录进行拼接。最后生成的Index是新表生成的主键。

然后,我们可以对数据进行适当的探索性分析。首先,我们可以习惯性地观察数据的形状、类型以及是否有缺失值、异常值和重复值。缺失值利用pandas库的isnull().sum()函数可以查阅。重复值利用duplicated().sum()即可。由于本文探索的是商品评论文本,数据量较少,因此本文忽略了它。以下是各部分的结果

数据形状为(1020,3),很容易理解为1020条记录行,3个字段。数据类型的使用info()函数可以,结果如下:

以上结果分析:Non-NULL Count非空值和每个字段。可以看出,评价内容的维度字段有两个空值。右边Dtype表示三个字段都是字符串object类型。memory usage占用这张商品信息表的字节空间有24个kb。这里有一个额外的提醒,如果一张表格有5G以上,即Excel当软件难以打开时,可以用另一种种实现方式dask库,是一种分布式的数据处理package。

从上图info信息中可以知道,这张商品信息表的空处有2个,也就是缺失值为2。重复值计算为19。下一步是解决缺失值和重复值的方法。考虑到重复值的多次出现会影响后续词频统计,本文考虑消除重复值。缺失值会影响后面评估内容分词的步骤,所以选择在这里替换空间。整段代码如下,刚开始转换Python每次数据分析几乎都必须记住这个代码。

import pandas as pd

读取数据

df = pd.read_excel(苏宁易购_airpods系列.xlsx’)

df.isnull().sum() # 缺失值汇总 df.duplicated().sum() # 重复值汇总 df.info() # 表格信息abstract df.dtypes #数据类型

df[评价内容]] = df[评价内容]].fillna(’ ') # 空格填充 df = df.drop_duplicates() # 剔除重复值 在三个字段中,评估内容是最重要的,因为本文的目的是建立一个包括情感分析和词云图可视化在内的商品评论文本信息挖掘系统。每个用户ID评价内容不一致,需要做聚合操作。整合所有评价内容,同时删除停止单词,最后形成一个句子。虽然这句话不流畅,但对后面的词频统计没有影响。

采用综合评价内容Python的内置函数split()完成,先用Pandas库中的tolist()函数将评估内容字段的记录转换为列表,然后将列表转换为字符串,这里需要使用split()函数完成。以空格字符串作为连接符,连接列表里的每一个元素。最终形成的效果截取一部分如下:

然后是删除停用词,停用词是否是中文NLP任务是英语NLP所有这些任务都需要使用。这一步不仅可以去除大部分噪音,还可以节省更高效的计算资源。删除停用词的算法实际上非常简单,即需要统计挖掘的文本,如果文本中的单词属于指定的停用词,则删除。显然,这里有很多词库需要停用,包括百度停用词表、哈尔滨工业大学停用词表、四川大学机械智能实验室停用词表等。本文选择了哈尔滨工业大学停止使用的词表,因为与其他表相比,它在电子商务领域有更好的词。如果读者想做一个理想的项目,他们可以考虑在电子商务领域建立一个停用词表。

去除停用词具体的代码及做法将在情感分析处讲解。

02.商品评论词云图的可视化和情感分析 在上一部分,我们提取了商品信息表中的每个部分ID商品评价内容,同时整合去停词,得到清洁txt数据集。然后就可以挖掘文本了。一是构建商品评论词云图。

在Python中词云图构建的库很多,常用的是Wordcloud标准词云图可视化库,以及pyecharts的词云图API。前者在构建词云图时,新手用户往往会出现很多问题,比如pip另外,安装失败、编码错误、字体使用错误等,其实使用难度也相当大。后者通常用于浏览器上的交互式图表。它以其高代码和高包装而闻名。听起来更符合本文的主题,但本文没有考虑,因为后面使用的网页开发库streamlit通常不需要显示交互式图表pyecharts。

因此,本文引出了新兴的词云图可视化库stylecloud,这个库是基于的wordcloud是的。使用这个数据库,新手可以画出最少的代码,以支持形状设置。不要说太多,直接使用代码:

start = time.time() #记录初始时间

首先在内部画出词云图并保存image文件夹

stop_words = open(‘哈工大停用词表.txt’,‘r’,encoding=‘utf8’).readlines() # 读取停用词

stylecloud.gen_stylecloud(text=txt, collocations=True, # 是否包括两个单词的搭配(二字组) font_path=r’C:\Windows\Fonts\simkai.ttf’, # 指定字体 icon_name=‘fab fa-jedi-order’,size=(2000,2000), # 指定样式 output_name=r’img\词云图.png’, #指定输出图像文件路径 custom_stopwords=stop_words) # 指定停用词表 end = time.time() # 记录结束时间 spend = end-start # 画画时间总长 代码解析:

首先引入stylecloud然后使用.gen_stylecloud()对象初始化绘图对象(类)。

text参数代表着目标文本,即我们已经处理好的商品评论txt文本。 collocations默认代表两个单词的搭配(二字组)True。 font_path默认位置是本机自带的字体C:\Windows\Fonts\用户可以根据自己的喜好选择文件夹中的任何字体,也可以下载额外的字体。 icon_name这个参数可以说是stylecloud它可以设置蒙版图的形式。当然,这个参数不能乱写。创作过单词云图的朋友都知道,自己设置蒙版图是有趣的,但分辨率很低。要解决这个问题,Font Awesome实现了一套以矢量形式存储图标字体库的优秀方案CSS用户调用框架。用户不仅可以调出高清图标,还可以定制其中CSS添加或修改文件以满足您的胃口。而stylecloud本库调用本网站使用的内容,用户可以stylecloud\static找到文件夹fontawesome.min.cssCSS包含许多矢量图标的文件。 读者会问,如何知道这些图标?name?以下两个网站: https://fontawesome.dashgame.com/。这是存储各种矢量图标的名称。用户可以使用不同类型的图标样式,手势相关样式如下图所示:

size图片大小。 output_name输出图片的路径和名称 custom_stopwords引用我们自定义的停用词库,即在开始时使用open函数代码调出哈尔滨工业大学的停用词表。以下是停用词表的一部分为展示,可以看到一开始都是去除无用的标点负号

除此之外,本文还设置了时间间隔,因为众说周知词云图的刻画需要较长时间,如果文本较长,一分钟也有可能。所以加上时间的概念,对使用者进行数据调入也会友好一些。

这样,我们就构建好了词云图,将在下一部分网页端应用,这里以Airpods第二代举例,先上效果图

词云图构建完以后就是轮到情感分析,对干净的商品评论信息做情感分析是非常有用的。对商家而言可以清楚知道买方使用此产品的感觉与评价,以便后面优化产品,而对想要买此产品的人更加有借鉴。本文将对AirPods商品评论进行情感词正负情感词统计。

利用到的库是cnsenti,这个库是中文情感分析库。在NLP任务领域中,大多库与例子都是英文的,因此这个中文库对于经常对中文文本进行挖掘的人是个好消息!

首先先介绍下这个库把吧,cnsenti模块中分为两大部分,一个是本文用到的情感分析对象Sentiment,另一个是没有用到的情绪分析对象Emotion。情感分析使用的词典是知网Hownet,支持自定义。情绪分析使用的是大连理工大学情感本体库,可以计算文本中的七大情绪词分布。由于本文只使用情感分析对象类,因此感兴趣的读者可以自行学习情绪分析类。

对AirPods商品评论信息进行情感分析,在默认条件下,只用2句代码即可。是的,就是那么方便!

senti = Sentiment() result = senti.sentiment_count(txt) txt为我们的目标文本,首先需要调用情感分析类Sentiment(),如果不设置任何参数,即表明以默认条件初始化。接着使用sentiment_count()函数计算正负情感词统计,以AirPods第二代举例,实现结果如下:

上面结果说明:总共单词有18128个,句子有625句。积极的情感词语有2221,消极的情感词语有322个。

在情感分析类中,除了sentiment_count()函数,还有sentiment_calculate()函数,有什么区别呢?这个可更加精准的计算文本的情感信息。相比于sentiment_count只统计文本正负情感词个数,sentiment_calculate还考虑了情感词前后是否强度副词去修饰,情感词前后是否有否定词的情感语义反转作用。同样以AirPods产品举例,使用这个函数,得到的结果为

可以看到,识别出来的积极词汇应该是使用了加权的手段将频率升维到数值。

03、网页结构设计与实现 接下来就是网页结构设计,做网页首先就是构造出一个思路图,确定功能是什么,有哪些控件,控件摆放位置如何。对于功能,本文的主题是商品评论信息文本挖掘,先对商品评论初始文本进行整合于去停用词。而后利用stylecloud库进行词云图构建,最后进行情感分析。除此之外,作者还希望完成一下功能:

各类产品(3代AirPods智能耳机)分开进行分析,即不同于上面部分步骤,不需要通过字段进行记录纵向合并。 可以在网页端显示原本的表结构类型数据。 加入一些由markdown编写的简介 通过一个dataframe原表格和文本挖掘结果分开显示 确定功能就是以上这些了。通过上面的功能,本文可以确定有哪写控件:

文本控件,用来存储简介、正负情感词数值比、词云图构建花费时间second。 图像(graph)控件,用来存储本地存储好的词云图,以在web 端展示。 dataframe控件,用来显示原始表结构类型数据 sidebar侧边栏控件,相当于平时我们在各大网站看到的侧边栏目录一样,不过本文在侧边栏的功能是不一样的。 侧边栏下的文本控件。 selectbox单项下拉选择框控件,存储AirPods各型号,相当于完成分类型分析的功能 radio单选按钮控件,存储显示类型:原表结构数据类型或者文本挖掘结果显示。 按照常规的网页构建,控件位置的空间摆设是一定要设计的。但是对于新手来说,接下来讲的超级web app建设streamlit则不需要考虑了。

streamlit的官方(https://streamlit.io/)简介如下:

以最快的方式建立于分享数据app,将数据显示在可分享的web app上,以python编程语言实现,无需前端经验。Streamlit是第一个专门针对机器学习和数据科学团队的应用程序开发框架,它是开发自定义机器学习工具的最快的方法,可以帮助机器学习工程师快速开发用户交互工具。同时它是基于tornado框架,封装了大量互动组件,同时也支持大量表格、图表、数据表等对象的渲染,并且支持栅格化响应式布局。Streamlit的默认渲染语言就是markdown;除此以外,Streamlit也支持html文本的渲染,这意味着你也可以将任何html代码嵌入到streamlit应用里。

读者可能会疑惑做网站,以为前后端都用Python+streamlit是一件普通的事情。其实不然,在streamlit建立之前,web creator with python一般采用的是前端使用html、css、JavaScript,后端使用python、Flask、Django。如果不用Python,则是前后端都使用D3。

因此,本文所使用的Python+streamlit前后端贯穿创建web app对新手是多么的友好!

接着,先展示streamlit的快速使用方法:

首先pip install streamlit安装这个库,而后在命令行输入streamlit hello。这时会弹出一个窗口,这个是内置的打开帮助文档,里面有各种实例,下面为一部分截图:

首先是,记录着帮助信息的页面,里面存放着各种连接

而后在下拉框选择plotting demo,点击后显示如下:

这是一个加载了记录条的画图程序,可以是交互式的。

综上,就可以发现,运行streamlit不是在anaconda等python编译器里面运行的,而是在命令框cmd中输入streamlit run .py文件来运行程序的。

有兴趣的读者可以多泡一下streamlit的官网,可以学习到很多东西。

04、功能整合与效果呈现 最后就是本文的web app构建与功能整合部分。先上代码

import streamlit as st import pandas as pd from cnsenti import Sentiment import stylecloud import time

st.title(‘AirPods智能耳机商品评论分析系统’) st.markdown(‘这个数据分析系统将以可视化形式挖掘某电商公司下苹果三种AirPods型号的商品评论信息’) st.markdown(‘Apple AirPods是苹果品牌的无线耳机。目前有市场上销售主流是3中机型:。这款耳机的主要特点是:耳机内置红外传感器能够自动识别耳机是否在耳朵当中进行自动播放,通过双击可以控制Siri控制。带上耳机自动播放音乐,波束的麦克风效果更好,双击耳机开启Siri,充电盒支持长时间续航,连接非常简单,只需要打开就可以让iPhone自动识别。’) st.sidebar.title(‘数据分析系统控件’) st.sidebar.markdown(‘选择一款型号/可视化类型:’)

DATA_URL=(‘苏宁易购_airpods系列.xlsx’)

@st.cache(persist=True) #如果只有一份数据,就可以用这个持久化,加快效率

def load_data(): data=pd.read_excel(DATA_URL) return data

df = load_data() df[‘评价内容’] = df[‘评价内容’].fillna(’ ') # 填充缺失值

select = st.sidebar.selectbox(‘选择一款型号’,df[‘商品标题’].unique())

在下拉框中得到选择的型号值

state_data = df[df[‘商品标题’] == select]

创建单项按钮选项值

select_status = st.sidebar.radio(“可视化类型”, (‘表结构数据’,‘文本挖掘’))

if select_status == ‘表结构数据’: st.text(‘该电商公司近期售卖产品的相关数据(以表结构化显示)’) st.dataframe(state_data)

if select_status == ‘评论可视化’:

# 判断商品正负情感值
txt_list = state_data['评价内容'].tolist()
txt = ' '.join(txt_list)

senti = Sentiment()
result = senti.sentiment_count(txt)

start = time.time()
# 先在内部画出词云图并保存到image文件夹
stop_words = open('哈工大停用词表.txt','r',encoding='utf8').readlines()
stylecloud.gen_stylecloud(text=txt, collocations=True,
                          font_path=r'‪C:\Windows\Fonts\simkai.ttf',
                          icon_name='fab fa-jedi-order',size=(2000,2000),
                          output_name=r'img\词云图.png',
                          custom_stopwords=stop_words)
end = time.time()
spend = end-start


# 显示情感正负值在网页端
if result['pos'] > result['neg']:
    st.markdown("#### 该商品的正负情感值比为{}:{},呈积极信号".format(result['pos'],result['neg']))

if result['pos'] < result['neg']:
    st.markdown("#### 该商品的正负情感值比为{}:{},呈消极信号".format(result['pos'],result['neg']))


# 显示词云图
st.image(r'img\词云图.png',caption = '词云图')
st.text('运行时长:{} s'.format(spend))

代码解析:

首先引入包之后的前五行,是设置这个web app的标题,为AirPods智能耳机商品评论分析系统。然后下面为记录该程序的简要信息作为副标题。同时存储一些AirPods这款苹果公司旗下的智能手机简介与它的功能独特之处。除此之外,st.sidebar()这个函数是将目标从主页面转到侧边栏中,在侧边栏填入需要填入的信息。

之后就是第一部分讲解的加载数据、数据探索性分析,去除重复值,填充缺失值等操作。

select = st.sidebar.selectbox(‘选择一款型号’,df[‘商品标题’].unique())这句话就是将商品信息表中的去重商品标题,即AirPods三代的机型作为下拉框单选选择的值。选择这个值后,就可以利用pandas进行条件筛选,最后用st.dataframe()函数将这个表结构类型进行显示。

select_status = st.sidebar.radio(“可视化类型”, (‘表结构数据’,‘文本挖掘’))代表的是设置单选选择按钮的值,即主页面显示哪种页面,是表格类型数据,还是文本挖掘结果:词云图与情感分析结果。

if语句的设定如下:根据state_data结果,抽取的数据为为AirPods三代中的一代,那么记下来主页显示的表格数据类型或是情感分析都是基于这一代机型的相关商品信息。接着if语句是判定select_status是表结构数据还是文本挖掘,因为在本文的初始设定中,主页面上是只显示两种可视化的。

而后一个if语句时提供给文本挖掘,也即情感分析用的。在第二部分中有讲到,本文时计算正负情感词的比例。如果正面情感词(积极情感词汇),则运行st.markdown(“#### 该商品的正负情感值比为{}:{},呈积极信号”.format(result[‘pos’],result[‘neg’])),显示积极信号。反之,为消极信号。

这里有一个time模块引用,这个引用时计算词云图构建的时间,大约在30s左右。这种性能测试与评估在工作中也是经常用到,因为工作中的数据可不像本文实例中的大小一般。

词云图构建的代码在第二部分也提及到,这里直接嵌入到里面即可。同时利用st.image函数进行本地图片读取与显示。

除此之外,streamlit还有一个友好的点就是,可以支持写markdown代码,上面的文本控件大部分都是用markdown编写,常使用markdown的读者可以研究一波。

标签: 传感器重复性的正负

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台