پروژه Data Science – تحلیل احساسات نظرات محصولات آمازون با استفاده از یادگیری ماشین و پایتون
با افزایش محبوبیت خرید اینترنتی و وجود فروشگاههای اینترنتی زیاد برای خرید محصولات موردنظر، اهمیت نظرات و بررسیهایی که مشتریان در مورد محصولات ثبت میکنند، روز به روز بیشتر میشه.
مصرفکنندگان نظرات خود را مستقیماً در پایین صفحه محصولات ثبت میکنند و با این کار، این فرصت را برای مصرفکنندگان و مشتریان دیگر ایجاد میکنن که قبل از خرید محصول در مورد وضعیت رضایت خریداران اطلاع پیدا کنند و ببینند که واکنش آنها نسبت به محصول موردنظر چگونه بوده.
ما تو این مقاله سعی میکنیم که با استفاده از یادگیری ماشین و پایتون، احساسات مربوط به نظرات محصولات آمازون رو تحلیل کنیم.
حالا بیایید کارمون رو با ایمپورت ماژولها شروع کنیم و همچنین بهتره که یه نگاه ساختار دیتاست بندازیم:
دیتاست لازم برای این پروژه رو میتونید از طریق این لینک دانلود کنید:
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sns
import math
import warnings
warnings.filterwarnings('ignore') # Hides warning
warnings.filterwarnings("ignore", category=DeprecationWarning)
warnings.filterwarnings("ignore",category=UserWarning)
sns.set_style("whitegrid") # Plotting style
np.random.seed(7) # seeding random number generator
df = pd.read_csv('amazon.csv')
print(df.head())

توصیف دیتاست
data = df.copy()
data.describe()

data.info()

اول باید دادههای مربوط به ستون name رو با ارجاع به asins (محصولات منحصربهفرد) تمیز کنیم چون ۷۰۰۰ مقدار ازدسترفته داریم.
data["asins"].unique()

asins_unique = len(data["asins"].unique())
print("Number of Unique ASINs: " + str(asins_unique))
#Output– Number of Unique ASINs: 42
مصورسازی توزیع متغیرهای عددی
data.hist(bins=50, figsize=(20,15))
plt.show()

در این پروژه، دادههای پرت هم ارزشمند هستند، پس ممکنه بخوایم نظرات بیش از ۵۰ نفر رو در مورد یه محصول بسنجیم تا بتونیم به اطلاعات مفید دست پیدا کنیم.
اکثر محصولات نمره های بالایی داشتند (با توجه به توزیع رتبهبندی). تعداد رتبههای ۵ ستاره ۲ برابر رتبههای دیگه بود.
تقسیم دیتاست به مجموعه داده آموزش و تست
قبل از اینکه وارد مرحله بررسی دیتاست بشیم، بهتره اول تقسیمبندی دیتاست رو به مجموعه آموزش و تست انجام بدیم. هدف نهایی آموزش classifier تحلیل احساسات هست.
با توجه به اینکه اکثر نظرات مثبت هستند (۵ ستاره)، نیاز به این داریم که تقسیمبندی رو طوری انجام بدیم که نوع نظرات موجود در هر مجموعه حالت متعادل داشته باشند. آموزش classifier با دادههای نامتعادل باعث میشه که نتونیم به نتیجه دلخواهمون دست پیدا کنیم.
from sklearn.model_selection import StratifiedShuffleSplit
print("Before {}".format(len(data)))
dataAfter = data.dropna(subset=["reviews.rating"])
# Removes all NAN in reviews.rating
print("After {}".format(len(dataAfter)))
dataAfter["reviews.rating"] = dataAfter["reviews.rating"].astype(int)
split = StratifiedShuffleSplit(n_splits=5, test_size=0.2)
for train_index, test_index in split.split(dataAfter,
dataAfter["reviews.rating"]):
strat_train = dataAfter.reindex(train_index)
strat_test = dataAfter.reindex(test_index)
#Output-
Before 34660
After 34627
باید ببینیم که مجموعه داده آموزش و تست نسبت به دادههای خام بهصورت متناسب تقسیمبندی شدند یا نه.
print(len(strat_train))
print(len(strat_test))
print(strat_test["reviews.rating"].value_counts()/len(strat_test))

شناسایی و کشف داده (مجموعه داده آموزش)
خب تو این بخش، از عبارات با قاعده (regular expression) برای پاکسازی کاراکترهای نامطلوب از دیتاست استفاده میکنیم و بعد از پاکسازی، یه نگاهی به ساختار دیتاست میندازیم:
reviews = strat_train.copy()
reviews.head()

print(len(reviews["name"].unique()), len(reviews["asins"].unique()))
print(reviews.info())
print(reviews.groupby("asins")["name"].unique())

حالا بیایید، نامهای مختلف مربوط به این محصول رو مشاهده کنیم:
different_names = reviews[reviews["asins"] ==
"B00L9EPT8O,B01E6AO69U"]["name"].unique()
for name in different_names:
print(name)
print(reviews[reviews["asins"] == "B00L9EPT8O,B01E6AO69U"]["name"].value_counts())
Output #
Echo (White),,,
Echo (White),,,
Amazon Fire Tv,,,
Amazon Fire Tv,,,
nan
Amazon – Amazon Tap Portable Bluetooth and Wi-Fi Speaker – Black,,,
Amazon – Amazon Tap Portable Bluetooth and Wi-Fi Speaker – Black,,,
Amazon Fire Hd 10 Tablet, Wi-Fi, 16 Gb, Special Offers – Silver Aluminum,,,
Amazon Fire Hd 10 Tablet, Wi-Fi, 16 Gb, Special Offers – Silver Aluminum,,,
Amazon 9W PowerFast Official OEM USB Charger and Power Adapter for Fire Tablets and Kindle eReaders,,,
Amazon 9W PowerFast Official OEM USB Charger and Power Adapter for Fire Tablets and Kindle eReaders,,,
Amazon Kindle Fire 5ft USB to Micro-USB Cable (works with most Micro-USB Tablets),,,
Amazon Kindle Fire 5ft USB to Micro-USB Cable (works with most Micro-USB Tablets),,,
Kindle Dx Leather Cover, Black (fits 9.7 Display, Latest and 2nd Generation Kindle Dxs),,
Amazon Fire Hd 6 Standing Protective Case(4th Generation – 2014 Release), Cayenne Red,,,
Amazon Fire Hd 6 Standing Protective Case(4th Generation – 2014 Release), Cayenne Red,,,
Amazon Fire Hd 6 Standing Protective Case(4th Generation – 2014 Release), Cayenne Red,,,
Amazon 5W USB Official OEM Charger and Power Adapter for Fire Tablets and Kindle eReaders,,,
New Amazon Kindle Fire Hd 9w Powerfast Adapter Charger + Micro Usb Angle Cable,,,
New Amazon Kindle Fire Hd 9w Powerfast Adapter Charger + Micro Usb Angle Cable,,,
Amazon 5W USB Official OEM Charger and Power Adapter for Fire Tablets and Kindle eReaders,,,
Amazon 5W USB Official OEM Charger and Power Adapter for Fire Tablets and Kindle eReaders,,,
Echo (White),,,
Fire Tablet, 7 Display, Wi-Fi, 8 GB – Includes Special Offers, Tangerine”
Echo (Black),,,
Amazon 9W PowerFast Official OEM USB Charger and Power Adapter for Fire Tablets and Kindle eReaders,,,
Echo (Black),,,
Echo (Black),,,
Amazon Fire Tv,,,
Kindle Dx Leather Cover, Black (fits 9.7 Display, Latest and 2nd Generation Kindle Dxs)”,,
New Amazon Kindle Fire Hd 9w Powerfast Adapter Charger + Micro Usb Angle Cable,,,
Echo (White),,,\r\nEcho (White),,, 2318
Amazon Fire Tv,,,\r\nAmazon Fire Tv,,, 2029
Amazon – Amazon Tap Portable Bluetooth and Wi-Fi Speaker – Black,,,\r\nAmazon – Amazon Tap Portable Bluetooth and Wi-Fi Speaker – Black,,, 259
Amazon Fire Hd 10 Tablet, Wi-Fi, 16 Gb, Special Offers – Silver Aluminum,,,\r\nAmazon Fire Hd 10 Tablet, Wi-Fi, 16 Gb, Special Offers – Silver Aluminum,,, 106
Amazon 9W PowerFast Official OEM USB Charger and Power Adapter for Fire Tablets and Kindle eReaders,,,\r\nAmazon 9W PowerFast Official OEM USB Charger and Power Adapter for Fire Tablets and Kindle eReaders,,, 28
Kindle Dx Leather Cover, Black (fits 9.7 Display, Latest and 2nd Generation Kindle Dxs),, 7
Amazon 5W USB Official OEM Charger and Power Adapter for Fire Tablets and Kindle eReaders,,,\r\nAmazon 5W USB Official OEM Charger and Power Adapter for Fire Tablets and Kindle eReaders,,, 5
Amazon Fire Hd 6 Standing Protective Case(4th Generation – 2014 Release), Cayenne Red,,,\r\nAmazon Fire Hd 6 Standing Protective Case(4th Generation – 2014 Release), Cayenne Red,,, 5
New Amazon Kindle Fire Hd 9w Powerfast Adapter Charger + Micro Usb Angle Cable,,,\r\nNew Amazon Kindle Fire Hd 9w Powerfast Adapter Charger + Micro Usb Angle Cable,,, 5
Amazon Kindle Fire 5ft USB to Micro-USB Cable (works with most Micro-USB Tablets),,,\r\nAmazon Kindle Fire 5ft USB to Micro-USB Cable (works with most Micro-USB Tablets),,, 4
Echo (Black),,,\r\nEcho (Black),,, 3
Echo (White),,,\r\nFire Tablet, 7 Display, Wi-Fi, 8 GB – Includes Special Offers, Tangerine” 1
Amazon Fire Hd 6 Standing Protective Case(4th Generation – 2014 Release), Cayenne Red,,,\r\nAmazon 5W USB Official OEM Charger and Power Adapter for Fire Tablets and Kindle eReaders,,, 1
Echo (Black),,,\r\nAmazon 9W PowerFast Official OEM USB Charger and Power Adapter for Fire Tablets and Kindle eReaders,,, 1
New Amazon Kindle Fire Hd 9w Powerfast Adapter Charger + Micro Usb Angle Cable,,,\r\n 1
Amazon Fire Tv,,,\r\nKindle Dx Leather Cover, Black (fits 9.7 Display, Latest and 2nd Generation Kindle Dxs)”,, 1
Name: name, dtype: int64
با توجه به خروجی، با اطمینان میتونیم بگیم که هر ASIN میتونه چند تا اسم مختلف داشته باشه. پس بهاینترتیب ما باید به ستون ASIN اهمیت بدیم چون این مقادیر منحصربهفرد هستند ولی هر محصول میتونه چند تا اسم متفاوت داشته باشه.
fig = plt.figure(figsize=(16,10))
ax1 = plt.subplot(211)
ax2 = plt.subplot(212, sharex = ax1)
reviews["asins"].value_counts().plot(kind="bar", ax=ax1, title="ASIN Frequency")
np.log10(reviews["asins"].value_counts()).plot(kind="bar", ax=ax2,
title="ASIN Frequency (Log10 Adjusted)")
plt.show()

نمره میانگین کل مجموعه داده آموزش
حالا با استفاده از ویژگیهای موجود یه classifier ایجاد میکنیم که میتونه احساسات مربوط به یه نظر و بررسی محصول رو تعیین کنه.
def sentiments(rating):
if (rating == 5) or (rating == 4):
return "Positive"
elif rating == 3:
return "Neutral"
elif (rating == 2) or (rating == 1):
return "Negative"
# Add sentiments to the data
strat_train["Sentiment"] = strat_train["reviews.rating"].apply(sentiments)
strat_test["Sentiment"] = strat_test["reviews.rating"].apply(sentiments)
print(strat_train["Sentiment"][:20])
#Output
۴۳۴۹ Positive
۳۰۷۷۶ Positive
۲۸۷۷۵ Neutral
۱۱۳۶ Positive
۱۷۸۰۳ Positive
۷۳۳۶ Positive
۳۲۶۳۸ Positive
۱۳۹۹۵ Positive
۶۷۲۸ Negative
۲۲۰۰۹ Positive
۱۱۰۴۷ Positive
۲۲۷۵۴ Positive
۵۵۷۸ Positive
۱۱۶۷۳ Positive
۱۹۱۶۸ Positive
۱۴۹۰۳ Positive
۳۰۸۴۳ Positive
۵۴۴۰ Positive
۲۸۹۴۰ Positive
۳۱۲۵۸ Positive
Name: Sentiment, dtype: object
امیدواریم که از این پست آموزشی لذت برده باشید و آشنایی با نحوه تحلیل احساسات نظارت محصولات آمازون براتون مفید واقع بشه.
برای هرگونه سوال در زمینه آموزش ها فقط کافیه روی لینک واتساپ یا تلگرام (در زیر همین پست) کلیک کنید. یا با شماره تماس بالای صفحه سایت تماس بگیرید.