python商品评论分析_NLP实战:用主题建模分析网购评论(附Python代码)

现在电商行业势头正好,对在线零售商来说,他们不受库存或空间的限制,而实体店则必须在有限的空间中存储产品。

但是,在线购物也有它的局限之处,最大的难题之一就是检验产品的真伪。它的质量是否如宣传所说的那么好?消费者留言的评价是真实的吗还是虚假宣传?这是消费者决定购买的重要因素。

所以,我们决定用NLP技术在这一主题中进行探索,本文将帮助你了解用主题建模分析在线产品评论的重要性。

商品评论的重要性

前几天,我从某网站买了一部智能手机,价格符合我的预期,并且评分为4.5分(满分为5)。

但是,拿到手之后我才发现,电池续航远不及平均水平。在购买时我只看了评分,却没关注评论,所以我知道肯定不只我一个人不满意!

所以网购看评论应该是必不可少的参考,可以,如果评论有成百上千条,根本看不过来怎么办?这就需要用到自然语言处理技术了。

明确问题

我们应该如何用NLP分析大量商品评论呢?首先让我们明确这一问题。

从卖家角度,他们可以从评论中估计顾客对商品的反应。想从大量评论中找到关键信息,这样的智能系统需要做到两点:能让顾客从中迅速提取出关键主题

卖家也能通过这些主题获得用户反馈

为什么用主题建模

和这项技术的名称一样,主题建模是自动确定文本目标中主题的过程,同时从文本语料中展示隐藏语义。主题模型有多重用途,包括:文件聚合

组织大型文本数据

从未被组织的文本中进行信息检索

特征选择

一个好的主题模型,如果在与股票市场相关的文本上训练时,应该会生成类似“出价”、“买卖”、“分红”、“交易”等主题。下图展示了一个典型的主题模型工作的流程:

在我们的案例中,文本数据来自“汽车”类目下的商品评论。这里,我们的目标是从评论中提取一些重要的有代表性的单词。这些关键词可以帮助我们了解某位顾客的态度。

Python实现

在这一部分,我们会用到Jupyter Notebook(或你在Python下使用的任意IDE)。这里我们会用到“隐含狄利克雷分布(LDA)”的概念,如果对这一概念不了解的读者,可以参考这一博文:http://www.cnblogs.com/huangshiyu13/p/6148217.html

首先我们要下载所需的库:

import nltk

from nltk import FreqDist

nltk.download('stopwords') # run this one time

import pandas as pd

pd.set_option("display.max_colwidth", 200)

import numpy as np

import re

import spacy

import gensim

from gensim import corpora

# libraries for visualization

import pyLDAvis

import pyLDAvis.gensim

import matplotlib.pyplot as plt

import seaborn as sns

%matplotlib inline

要导入数据,首先要将数据提取到你的工作类别中,然后使用pandas中的read_json( )函数在pandas的数据框架中读取。

df = pd.read_json('Automotive_5.json', lines=True)

df.head()

如你所见,数据包含以下类目:评论者的ID

产品ID

评论者的用户名

该评论的有用性

评论文本

产品评分

评论总结

评论执行时间

评论原始时间(raw)

在这篇文章中,我们只使用“评论文本”这一类。

数据处理

在开始文本挖掘前,数据处理和清洗是很重要的一步。在这一步中,我们会删除标点、停止词等,让评论的形式尽可能统一。处理好之后,就可以检查数据中最常出现的词语了。所以,让我们在这里定义一个函数,可以通过条形图展示数据中最常见的n个词语。

# function to plot most frequent terms

def freq_words(x, terms = 30):

all_words = ' '.join([text for text in x])

all_words = all_words.split()

fdist = FreqDist(all_words)

words_df = pd.DataFrame({'word':list(fdist.keys()), 'count':list(fdist.values())})

# selecting top 20 most frequent words

d = words_df.nlargest(columns="count", n = terms)

plt.figure(figsize=(20,5))

ax = sns.barplot(data=d, x= "word", y = "count")

ax.set(ylabel = 'Count')

plt.show()

函数定义如下。

freq_words(df['reviewText'])

如图,最常见的词语是“the”、“and”、“to”等等,这些词对我们并没有什么帮助,所以也要删除这些词语。在这之前,让我们先删除标点和数字。

# remove unwanted characters, numbers and symbols

df['reviewText'] = df['reviewText'].str.replace("[^a-zA-Z#]", " ")

接着删除停止词和少于两个字母的单词:

from nltk.corpus import stopwords

stop_words = stopwords.words('english')

# function to remove stopwords

def remove_stopwords(rev):

rev_new = " ".join([i for i in rev if i not in stop_words])

return rev_new

# remove short words (length < 3)

df['reviewText'] = df['reviewText'].apply(lambda x: ' '.join([w for w in x.split() if len(w)>2]))

# remove stopwords from the text

reviews = [remove_stopwords(r.split()) for r in df['reviewText']]

# make entire text lowercase

reviews = [r.lower() for r in reviews]

再对常出现的词进行可视化:

freq_words(reviews, 35)

我们可以看出有了变化,像“电池”、“价格”、“产品”、“汽油”等与汽车较相关的词语出现了。但是,仍然有一些中性词存在,例如“the”、“this”、“much”、“they”等等。

为了进一步去除文本中的噪音,我们可以用spaCy库中的词形还原处理。它可以将词语还原到原始形式,减少单词的重复。

!python -m spacy download en # one time run

nlp = spacy.load('en', disable=['parser', 'ner'])

def lemmatization(texts, tags=['NOUN', 'ADJ']): # filter noun and adjective

output = []

for sent in texts:

doc = nlp(" ".join(sent))

output.append([token.lemma_ for token in doc if token.pos_ in tags])

return output

我们对评语进行符号化,然后对其进行词形还原。

tokenized_reviews = pd.Series(reviews).apply(lambda x: x.split())

print(tokenized_reviews[1])

['these', 'long', 'cables', 'work', 'fine', 'truck', 'quality', 'seems', 'little', 'shabby',

'side', 'for', 'money', 'expecting', 'dollar', 'snap', 'jumper', 'cables', 'seem', 'like',

'would', 'see', 'chinese', 'knock', 'shop', 'like', 'harbor', 'freight', 'bucks']

reviews_2 = lemmatization(tokenized_reviews)

print(reviews_2[1]) # print lemmatized review

['long', 'cable', 'fine', 'truck', 'quality', 'little', 'shabby', 'side', 'money', 'dollar',

'jumper', 'cable', 'chinese', 'shop', 'harbor', 'freight', 'buck']

可以看到,这一过程并不仅仅还原了词形,而且只留下了名词和形容词。之后,我们将这次词语在变换成正常形式。

reviews_3 = []

for i in range(len(reviews_2)):

reviews_3.append(' '.join(reviews_2[i]))

df['reviews'] = reviews_3

freq_words(df['reviews'], 35)

这样可以看出常见词都是和汽车相关的,我们可以继续搭建主题模型了。

搭建一个LDA模型

首先,我们要对语料创建术语词典,其中每个唯一的词语都被看做一个index

dictionary = corpora.Dictionary(reviews_2)

之后,我们要用创建好的词典将评论转化成文件术语矩阵。

doc_term_matrix = [dictionary.doc2bow(rev) for rev in reviews_2]

# Creating the object for LDA model using gensim library

LDA = gensim.models.ldamodel.LdaModel

# Build LDA model

lda_model = LDA(corpus=doc_term_matrix,

id2word=dictionary,

num_topics=7,

random_state=100,

chunksize=1000,

passes=50)

上述代码的执行可能需要一段时间。注意,我在这一模型中,用num_topics参数将主题的数量定为7,你可以修改这一数字。

接着就可以生成LDA模型学习到的主题。

lda_model.print_topics()

[(0, '0.030*"car" + 0.026*"oil" + 0.020*"filter" + 0.018*"engine" + 0.016*"device" + 0.013*"code"

+ 0.012*"vehicle" + 0.011*"app" + 0.011*"change" + 0.008*"bosch"'),

(1, '0.017*"easy" + 0.014*"install" + 0.014*"door" + 0.013*"tape" + 0.013*"jeep" + 0.011*"front" +

0.011*"mat" + 0.010*"side" + 0.010*"headlight" + 0.008*"fit"'),

(2, '0.054*"blade" + 0.045*"wiper" + 0.019*"windshield" + 0.014*"rain" + 0.012*"snow" +

0.012*"good" + 0.011*"year" + 0.011*"old" + 0.011*"car" + 0.009*"time"'),

(3, '0.044*"car" + 0.024*"towel" + 0.020*"product" + 0.018*"clean" + 0.017*"good" + 0.016*"wax" +

0.014*"water" + 0.013*"use" + 0.011*"time" + 0.011*"wash"'),

(4, '0.051*"light" + 0.039*"battery" + 0.021*"bulb" + 0.019*"power" + 0.018*"car" + 0.014*"bright"

+ 0.013*"unit" + 0.011*"charger" + 0.010*"phone" + 0.010*"charge"'),

(5, '0.022*"tire" + 0.015*"hose" + 0.013*"use" + 0.012*"good" + 0.010*"easy" + 0.010*"pressure" +

0.009*"small" + 0.009*"trailer" + 0.008*"nice" + 0.008*"water"'),

(6, '0.048*"product" + 0.038*"good" + 0.027*"price" + 0.020*"great" + 0.020*"leather" +

0.019*"quality" + 0.010*"work" + 0.010*"review" + 0.009*"amazon" + 0.009*"worth"')]

Topic 3中含有“towel”、“clean”、“wax”、“water”等词语,表明这一话题和汽车清洁有关。Topic 6含有“price”、“quality”和“worth”等词语,说明和产品的价格有关。

主题可视化

为了在二维空间中对我们的主题进行可视化,我们用的是pyLDAvis库。

# Visualize the topics

pyLDAvis.enable_notebook()

vis = pyLDAvis.gensim.prepare(lda_model, doc_term_matrix, dictionary)

vis

其他分析网站评论的方法

除了主题建模,还有很多其他的NLP方法可以用来分析理解网络评论:文本总结:对评语进行关键点总结。

实体识别(entity recognition):从评论中提取出实体,分析哪种产品更受欢迎。

确定流行趋势:根据评论的时间,可以掌握某一商品的受欢迎趋势。

语义分析:对零售商来说,理解评论的语义情感对改善产品和服务是非常有帮助的。

下一步工作

信息检索让我们省去了浏览大量评论的时间,也让我们知道了顾客对产品说了些什么。但是,它并没有展示出评论是积极的、中立的、还是消极的。这就是信息检索之后要做的工作。我们不仅要提取出话题,还要分析其中的情感。在接下来的文章中我们会具体讲解,请大家关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运营体系_用户运营系统论:解构复杂产品的大规模用户运营体系

本文介绍了大规模用户运营体系中的三大原则——数据驱动、精细化运营、自动化(或叫产品化)&#xff0c;以及用户运营体系中的三个子系统——用户生命周期管理系统、用户分层运营系统、用户行为激励系统。我们在实际的产品工作中&#xff0c;经常会用到各种各样的运营体系&#…

ShaderToy效果学习(转成Unity URP) - MathEye

来自IQ大神的小教程&#xff0c;效果图&#xff1a; shaderToy源码&#xff1a;https://www.shadertoy.com/view/lsfGRr 教程视频&#xff1a;https://www.bilibili.com/video/BV1KK4y1K7wM/ Unity项目代码Git地址&#xff1a;https://github.com/Dejavu0709/Graphics.git Sh…

asp 退出登录修改cookie能进入后台_深入浅出让你理解跨域与SSO单点登录原理与技术...

一&#xff1a;SSO体系结构SSOSSO英文全称Single Sign On&#xff0c;单点登录。SSO是在多个应用系统中&#xff0c;用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务…

windows7内存诊断工具有用吗_windows内存诊断工具有什么用

windows内存诊断工具有什么用导读&#xff1a;内存可以说是电脑的重灾区&#xff0c;很多电脑问题都跟内存有关。内存稍微有点问题都有可能导致系统运行不稳定&#xff0c;最常见的表现就是蓝屏&#xff0c;自动重启&#xff0c;甚至开不起机。如果是开不起机的话反倒好解决&am…

Unity shader图集Atlas下的UV坐标归一化转换

unity中如果图片打入了图集中&#xff0c;在shader中取到的uv坐标默认是图集中的坐标&#xff0c;如果需要shader做一些类似流光的效果&#xff0c;需要转换成常用的0-1区间的归一化uv坐标&#xff0c;转换方法如下&#xff1a; 步骤一&#xff1a; C#中向shader中传入图片在图…

是可改写的随机存储器_关于存储器的一些基础知识整理

RAMRandom-Access-Memory,随机存储存储器&#xff0c;可读可写&#xff0c;分为SRAM和DRAM&#xff0c;即静态随机存储器和动态随机存储器&#xff0c;理解上静动态主要体现是否需要刷新&#xff0c;通常DRAM需要刷新&#xff0c;否则数据将丢失;SRAM的效率较好&#xff0c;而成…

fpga供电电压偏低会怎样_[走近FPGA]之开发板介绍篇

开发板概述在走近FPGA预告篇中&#xff0c;我们已经提到了系列文章使用的开发平台&#xff0c;硬木课堂Xilinx Artix 7 FPGA板&#xff0c;如下图所示。它使用的FPGA芯片型号为Xilinx Artix-7 XC7A75T&#xff0c;具有电平开关、LED、矩阵键盘、数码管等基本外设&#xff0c;同…

使用arm-linux-androideabi-addr2line 定位Unity Android 段错误

arm-linux-androideabi-addr2line是NDK中提供的将内存地址转换成行号的一个工具&#xff0c;通俗具体点就是根据各种日志&#xff0c;譬如trace日志和tomestone日志中包含的so库日志的中偏移内存地址&#xff0c;定位到具体是在那个文件的那一行。Unity的安装目录中&#xff0c…

springboot几种注入_Spring Boot中使用JdbcTemplate访问数据库

本文介绍在Spring Boot基础下配置数据源和通过JdbcTemplate编写数据访问的示例。数据源配置在我们访问数据库的时候&#xff0c;需要先配置一个数据源&#xff0c;下面分别介绍一下几种不同的数据库配置方式。首先&#xff0c;为了连接数据库需要引入jdbc支持&#xff0c;在pom…

Unity Android解决信息流广告关闭报错

Unity接一些原生Andorid的SDK时&#xff0c;经常会出现这个错&#xff1a; W/System.err: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 解决方法是在android层写的java文件中用…

搜索重复代码_LeetCode专题——详解搜索算法中的搜索策略和剪枝

今天是LeetCode专题第20篇文章&#xff0c;今天讨论的是数字组合问题。描述给定一个int类型的候选集&#xff0c;和一个int类型的target&#xff0c;要求返回所有的数字组合&#xff0c;使得组合内所有数字的和刚好等于target。注意&#xff1a;所有的元素都是正数所有元素没有…

Unity内实现Android APK版本更新

最近做项目有个需求是要Android应用内强更包体。Google一波直接选了一个android原生开源项目 GitHub - yangchong211/YCUpdateApp: 轻量级版本更新弹窗&#xff0c;弹窗上支持更新进度条&#xff0c;可以设置普通更新或者强制更新。解决8.0以上通知栏不显示问题&#xff0c;解…

a标签隐藏真实地址_家庭影院布线非常杂乱应该怎么补救?A/V电缆管理的7个技巧...

家庭影院应该是给人带来快乐的东西&#xff0c;不管是声音还是外观&#xff0c;但是如果您布的线很杂乱&#xff0c;那么想必整个影院也好看不到哪去&#xff0c;如果你想要整理的话&#xff0c;那么这篇文章应该能帮助到您。有没有整理过家庭影院的电线&#xff0c;观感是完全…

螺钉装弹垫平垫机器人_【经验总结】什么时候用平垫,什么时候用弹垫?

很多人为了节约成本想省了平垫或者弹垫&#xff0c;其实在螺栓使用过程中平垫和弹垫各自起着不可或缺的作用。今天咱们来针对平垫和弹垫给大家介绍一下。左 平 垫 右 弹 垫 平垫&#xff0c;形状一般是一个平垫圈&#xff0c;中间有一个孔&#xff0c;主要是用铁板冲压出来的&a…

生成FaceBook所需的散列哈希值

Hex to base64 converter FaceBook后台发布应用时&#xff0c;需要填入hash值&#xff0c;今天自己用openssl生成的时候只有24位并不正确&#xff0c;与其费劲巴拉的自己折腾openssl&#xff0c;还是感谢国外的大佬们吧&#xff0c;工具网址直接输入hex的sha1值*&#xff08;从…

打开方式中选择默认方式无反映_「Windows」得看,更改文件的默认应用,告别“打开方式”...

前言&#xff1a;你有没有在使用电脑过程中&#xff0c;打开各种各样格式的文件时&#xff0c;电脑有没有很准确的用你想用的那个软件将其打开&#xff1f;还是说你还在用“打开方式”手动选择你想使用的软件打开你想打开的这个文件。如何设置默认应用&#xff1a;步骤&#xf…

Z深度相关知识

渲染中深度信息很重要&#xff0c;但是也很让人迷惑&#xff0c;透视投影是什么&#xff0c;为什么要做透视除法&#xff0c;view空间&#xff0c;clip空间&#xff0c;ndc空间对应的z值又代表什么&#xff0c;这里简单总结下。 一.顶点变换的完整过程 二.View空间下的顶点和Z…

quartus管脚分配后需要保存吗_掉电保存数据到EEPROM

我想在掉电时保存数据(3 个字节)到 EEPROM 中&#xff0c;用 BOD掉电检测&#xff0c;不知怎样使用。望高手指点&#xff1a;1. 在 BOOT 区设置好 BODEN&#xff0c;BODLEVEL&#xff0c;后软件还要怎样设置&#xff1f;2. 掉电中断是否是产生复位&#xff1f;我的写 EEPROM 程…

matlab 最小二乘法拟合_计量与论文串讲:最小二乘法

点为什么要用R计量经济学作为经济大类下一门非常实用的学科有很强的实践意义。尽管内容庞杂但基本的指导思想却很简单&#xff0c;因此通过一门统计编程语言学习、掌握计量经济学有很大的益处。目前&#xff0c;市面上已经有多款统计编程语言和统计软件&#xff0c;实证分析领域…

ZoomBlur 聚焦模糊效果Shader(URP)

修改自这篇文章【Unity】UniversalRPでカスタムポストプロセスを作る【ZoomBlur】 - Qiita 1. VolumeEditor&#xff0c;用于在UnityVolume中控制自己写的后处理效果 using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal;[System.Seriali…