現(xiàn)在電商行業(yè)勢(shì)頭正好,對(duì)在線零售商來說,他們不受庫(kù)存或空間的限制,而實(shí)體店則必須在有限的空間中存儲(chǔ)產(chǎn)品。
但是,在線購(gòu)物也有它的局限之處,最大的難題之一就是檢驗(yàn)產(chǎn)品的真?zhèn)巍K馁|(zhì)量是否如宣傳所說的那么好?消費(fèi)者留言的評(píng)價(jià)是真實(shí)的嗎還是虛假宣傳?這是消費(fèi)者決定購(gòu)買的重要因素。
所以,我們決定用NLP技術(shù)在這一主題中進(jìn)行探索,本文將幫助你了解用主題建模分析在線產(chǎn)品評(píng)論的重要性。
商品評(píng)論的重要性
前幾天,我從某網(wǎng)站買了一部智能手機(jī),價(jià)格符合我的預(yù)期,并且評(píng)分為4.5分(滿分為5)。
但是,拿到手之后我才發(fā)現(xiàn),電池續(xù)航遠(yuǎn)不及平均水平。在購(gòu)買時(shí)我只看了評(píng)分,卻沒關(guān)注評(píng)論,所以我知道肯定不只我一個(gè)人不滿意!
所以網(wǎng)購(gòu)看評(píng)論應(yīng)該是必不可少的參考,可以,如果評(píng)論有成百上千條,根本看不過來怎么辦?這就需要用到自然語(yǔ)言處理技術(shù)了。
明確問題
我們應(yīng)該如何用NLP分析大量商品評(píng)論呢?首先讓我們明確這一問題。
從賣家角度,他們可以從評(píng)論中估計(jì)顧客對(duì)商品的反應(yīng)。想從大量評(píng)論中找到關(guān)鍵信息,這樣的智能系統(tǒng)需要做到兩點(diǎn):
能讓顧客從中迅速提取出關(guān)鍵主題
賣家也能通過這些主題獲得用戶反饋
為了解決這一任務(wù),我們將在亞馬遜的汽車評(píng)論數(shù)據(jù)上使用主題建模(LDA),數(shù)據(jù)集可以在這個(gè)地址中下載:snap.stanford.edu/data/amazon/productGraph/categoryFiles/reviewsAutomotive5.json.gz。
為什么用主題建模
和這項(xiàng)技術(shù)的名稱一樣,主題建模是自動(dòng)確定文本目標(biāo)中主題的過程,同時(shí)從文本語(yǔ)料中展示隱藏語(yǔ)義。主題模型有多重用途,包括:
文件聚合
組織大型文本數(shù)據(jù)
從未被組織的文本中進(jìn)行信息檢索
特征選擇
一個(gè)好的主題模型,如果在與股票市場(chǎng)相關(guān)的文本上訓(xùn)練時(shí),應(yīng)該會(huì)生成類似“出價(jià)”、“買賣”、“分紅”、“交易”等主題。下圖展示了一個(gè)典型的主題模型工作的流程:
在我們的案例中,文本數(shù)據(jù)來自“汽車”類目下的商品評(píng)論。這里,我們的目標(biāo)是從評(píng)論中提取一些重要的有代表性的單詞。這些關(guān)鍵詞可以幫助我們了解某位顧客的態(tài)度。
Python實(shí)現(xiàn)
在這一部分,我們會(huì)用到Jupyter Notebook(或你在Python下使用的任意IDE)。這里我們會(huì)用到“隱含狄利克雷分布(LDA)”的概念,如果對(duì)這一概念不了解的讀者,可以參考這一博文:www.cnblogs.com/huangshiyu13/p/6148217.html
首先我們要下載所需的庫(kù):
import nltk
from nltk importFreqDist
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
要導(dǎo)入數(shù)據(jù),首先要將數(shù)據(jù)提取到你的工作類別中,然后使用pandas中的read_json( )函數(shù)在pandas的數(shù)據(jù)框架中讀取。
df = pd.read_json('Automotive_5.json', lines=True)
df.head()
如你所見,數(shù)據(jù)包含以下類目:
評(píng)論者的ID
產(chǎn)品ID
評(píng)論者的用戶名
該評(píng)論的有用性
評(píng)論文本
產(chǎn)品評(píng)分
評(píng)論總結(jié)
評(píng)論執(zhí)行時(shí)間
評(píng)論原始時(shí)間(raw)
在這篇文章中,我們只使用“評(píng)論文本”這一類。
數(shù)據(jù)處理
在開始文本挖掘前,數(shù)據(jù)處理和清洗是很重要的一步。在這一步中,我們會(huì)刪除標(biāo)點(diǎn)、停止詞等,讓評(píng)論的形式盡可能統(tǒng)一。處理好之后,就可以檢查數(shù)據(jù)中最常出現(xiàn)的詞語(yǔ)了。所以,讓我們?cè)谶@里定義一個(gè)函數(shù),可以通過條形圖展示數(shù)據(jù)中最常見的n個(gè)詞語(yǔ)。
# 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()
函數(shù)定義如下。
freq_words(df['reviewText'])
如圖,最常見的詞語(yǔ)是“the”、“and”、“to”等等,這些詞對(duì)我們并沒有什么幫助,所以也要?jiǎng)h除這些詞語(yǔ)。在這之前,讓我們先刪除標(biāo)點(diǎn)和數(shù)字。
# remove unwanted characters, numbers and symbols
df['reviewText'] = df['reviewText'].str.replace("[^a-zA-Z#]", " ")
接著刪除停止詞和少于兩個(gè)字母的單詞:
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 notin 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]
再對(duì)常出現(xiàn)的詞進(jìn)行可視化:
freq_words(reviews, 35)
我們可以看出有了變化,像“電池”、“價(jià)格”、“產(chǎn)品”、“汽油”等與汽車較相關(guān)的詞語(yǔ)出現(xiàn)了。但是,仍然有一些中性詞存在,例如“the”、“this”、“much”、“they”等等。
為了進(jìn)一步去除文本中的噪音,我們可以用spaCy庫(kù)中的詞形還原處理。它可以將詞語(yǔ)還原到原始形式,減少單詞的重復(fù)。
!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
我們對(duì)評(píng)語(yǔ)進(jìn)行符號(hào)化,然后對(duì)其進(jìn)行詞形還原。
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']
可以看到,這一過程并不僅僅還原了詞形,而且只留下了名詞和形容詞。之后,我們將這次詞語(yǔ)在變換成正常形式。
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)
這樣可以看出常見詞都是和汽車相關(guān)的,我們可以繼續(xù)搭建主題模型了。
搭建一個(gè)LDA模型
首先,我們要對(duì)語(yǔ)料創(chuàng)建術(shù)語(yǔ)詞典,其中每個(gè)唯一的詞語(yǔ)都被看做一個(gè)index
dictionary = corpora.Dictionary(reviews_2)
之后,我們要用創(chuàng)建好的詞典將評(píng)論轉(zhuǎn)化成文件術(shù)語(yǔ)矩陣。
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)
上述代碼的執(zhí)行可能需要一段時(shí)間。注意,我在這一模型中,用num_topics參數(shù)將主題的數(shù)量定為7,你可以修改這一數(shù)字。
接著就可以生成LDA模型學(xué)習(xí)到的主題。
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”等詞語(yǔ),表明這一話題和汽車清潔有關(guān)。Topic 6含有“price”、“quality”和“worth”等詞語(yǔ),說明和產(chǎn)品的價(jià)格有關(guān)。
主題可視化
為了在二維空間中對(duì)我們的主題進(jìn)行可視化,我們用的是pyLDAvis庫(kù)。
# Visualize the topics
pyLDAvis.enable_notebook()
vis = pyLDAvis.gensim.prepare(lda_model, doc_term_matrix, dictionary)
vis
其他分析網(wǎng)站評(píng)論的方法
除了主題建模,還有很多其他的NLP方法可以用來分析理解網(wǎng)絡(luò)評(píng)論:
文本總結(jié):對(duì)評(píng)語(yǔ)進(jìn)行關(guān)鍵點(diǎn)總結(jié)。
實(shí)體識(shí)別(entity recognition):從評(píng)論中提取出實(shí)體,分析哪種產(chǎn)品更受歡迎。
確定流行趨勢(shì):根據(jù)評(píng)論的時(shí)間,可以掌握某一商品的受歡迎趨勢(shì)。
語(yǔ)義分析:對(duì)零售商來說,理解評(píng)論的語(yǔ)義情感對(duì)改善產(chǎn)品和服務(wù)是非常有幫助的。
下一步工作
信息檢索讓我們省去了瀏覽大量評(píng)論的時(shí)間,也讓我們知道了顧客對(duì)產(chǎn)品說了些什么。但是,它并沒有展示出評(píng)論是積極的、中立的、還是消極的。這就是信息檢索之后要做的工作。我們不僅要提取出話題,還要分析其中的情感。在接下來的文章中我們會(huì)具體講解,請(qǐng)大家關(guān)注。
-
數(shù)據(jù)集
+關(guān)注
關(guān)注
4文章
1223瀏覽量
25406 -
電商
+關(guān)注
關(guān)注
1文章
468瀏覽量
29151
原文標(biāo)題:NLP實(shí)戰(zhàn):用主題建模分析網(wǎng)購(gòu)評(píng)論(附Python代碼)
文章出處:【微信號(hào):jqr_AI,微信公眾號(hào):論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
失效分析的重要性
UPS的重要性
基于CD-RBM深度學(xué)習(xí)的產(chǎn)品評(píng)論情感分析

在線商品評(píng)論可信性的評(píng)價(jià)方法詳細(xì)資料說明

在線商品評(píng)論的可信程度如何使用大數(shù)據(jù)技術(shù)分析

怎么樣實(shí)現(xiàn)電商平臺(tái)商品評(píng)論可信性的自動(dòng)評(píng)估

預(yù)測(cè)產(chǎn)品在線評(píng)論有用程度的模型
基于規(guī)則的商品評(píng)論搭配抽取方法
增強(qiáng)現(xiàn)實(shí)抬頭顯示中陽(yáng)光負(fù)載建模的重要性

Python如何進(jìn)行特征重要性分析

Python中進(jìn)行特征重要性分析的9個(gè)常用方法

評(píng)論