بینش بهتری از بررسی‌ها با استفاده از هوش داده‌های پلاتوبلاک چین درک آمازون دریافت کنید. جستجوی عمودی Ai.

با استفاده از Amazon Comprehend بینش بهتری از نظرات دریافت کنید

"85٪ از خریداران به بررسی های آنلاین به اندازه یک توصیه شخصی اعتماد دارند" - گارتنر

مصرف کنندگان به طور فزاینده ای از طریق سطوح دیجیتال و چندین نقطه تماس با مشاغل درگیر هستند. آمارها نشان می دهد که اکثر خریداران از بررسی ها برای تعیین اینکه چه محصولاتی را بخرند و از کدام خدمات استفاده کنند استفاده می کنند. همانطور که در مرکز تحقیقات اشپیگل، احتمال خرید برای یک محصول با پنج نقد 270 درصد بیشتر از احتمال خرید یک محصول بدون نظر است. بررسی ها قدرت تأثیرگذاری بر تصمیمات مصرف کننده و تقویت ارزش برند را دارند.

در این پست استفاده می کنیم درک آمازون برای استخراج اطلاعات معنی‌دار از بررسی‌های محصول، تجزیه و تحلیل آن برای درک نحوه واکنش کاربران جمعیت‌شناسی مختلف به محصولات، و کشف اطلاعات جمع‌آوری شده در مورد تمایل کاربران به یک محصول. Amazon Comprehend یک سرویس پردازش زبان طبیعی (NLP) کاملاً مدیریت شده و آموزش‌دیده است که می‌تواند بینشی درباره محتوای یک سند یا متن استخراج کند.

بررسی اجمالی راه حل

امروزه نظرات مشتریان را می‌توان به روش‌های مختلفی از جمله رتبه‌بندی ستاره‌ها، متن رایگان یا زبان طبیعی یا اشتراک‌گذاری رسانه‌های اجتماعی ارائه کرد. بررسی متن رایگان یا زبان طبیعی به ایجاد اعتماد کمک می کند، زیرا این نظر مستقل از مصرف کنندگان است. اغلب توسط تیم های محصول برای تعامل با مشتریان از طریق کانال های بررسی استفاده می شود. این یک واقعیت ثابت شده است که وقتی مشتریان احساس می کنند شنیده می شوند، احساس آنها در مورد برند بهبود می یابد. در حالی که تجزیه و تحلیل رتبه‌بندی ستاره‌ها یا اشتراک‌گذاری‌های رسانه‌های اجتماعی نسبتاً ساده‌تر است، بررسی‌های زبان طبیعی یا متن آزاد چالش‌های متعددی مانند شناسایی کلمات یا عبارات کلیدی، موضوعات یا مفاهیم، ​​و احساسات یا احساسات در سطح نهاد را به همراه دارد. این چالش عمدتاً به دلیل متغیر بودن طول متن نوشته شده و حضور قابل قبول سیگنال ها و نویز است. علاوه بر این، اطلاعات می تواند بسیار واضح و صریح (مثلاً با کلمات کلیدی و عبارات کلیدی) یا نامشخص و ضمنی (موضوعات و مفاهیم انتزاعی) باشد. حتی چالش برانگیزتر، درک انواع احساسات و ارتباط آنها با محصولات و خدمات مناسب است. با این وجود، درک این اطلاعات و سیگنال های متنی برای ارائه یک تجربه مشتری بدون اصطکاک بسیار حیاتی است.

در این پست از یک در دسترس عموم استفاده می کنیم NLP – fast.ai مجموعه داده برای تجزیه و تحلیل نظرات محصول ارائه شده توسط مشتریان. ما با استفاده از تکنیک یادگیری ماشینی بدون نظارت (ML) که به عنوان مدل‌سازی موضوعی شناخته می‌شود، شروع می‌کنیم. این یک تکنیک محبوب بدون نظارت است که موضوعات انتزاعی را که می تواند در مجموعه مرور متن رخ دهد، کشف می کند. مدل‌سازی موضوعی یک مشکل خوشه‌بندی است که بدون نظارت است، به این معنی که مدل‌ها هیچ دانشی در مورد متغیرهای هدف احتمالی (مانند موضوعات در یک مرور) ندارند. موضوعات به صورت خوشه ای نمایش داده می شوند. اغلب، تعداد خوشه ها در مجموعه ای از اسناد با کمک کارشناسان حوزه یا با استفاده از برخی تحلیل های آماری استاندارد تعیین می شود. خروجی های مدل به طور کلی دارای سه جزء هستند: خوشه های شماره گذاری شده (موضوع 0، مبحث 1 و غیره)، کلمات کلیدی مرتبط با هر خوشه، و خوشه های نماینده برای هر سند (یا بررسی در مورد ما). به دلیل ماهیت ذاتی خود، مدل‌های موضوعی برچسب‌های قابل خواندن توسط انسان برای خوشه‌ها یا موضوعات ایجاد نمی‌کنند، که این یک تصور غلط رایج است. چیزی که در مورد مدل‌سازی موضوع به طور کلی باید به آن توجه کرد این است که این یک مدل عضویت ترکیبی است - هر سند در مدل ممکن است شباهتی به هر موضوعی داشته باشد. مدل موضوع در یک فرآیند بیزی تکراری می آموزد تا احتمال مرتبط بودن هر سند با یک موضوع یا موضوع معین را تعیین کند. خروجی مدل به انتخاب بهینه تعداد موضوعات بستگی دارد. تعداد کمی از موضوعات می تواند منجر به گسترده بودن موضوعات شود و تعداد بیشتر موضوعات ممکن است منجر به موضوعات اضافی یا موضوعات مشابه شود. روش‌های مختلفی برای ارزیابی مدل‌های موضوعی وجود دارد:

  • قضاوت انسانی - مبتنی بر مشاهده، مبتنی بر تفسیر
  • معیارهای کمی - گیجی، محاسبات انسجام
  • رویکرد ترکیبی - ترکیبی از رویکردهای مبتنی بر قضاوت و کمی

گیجی با تقسیم یک مجموعه داده به دو بخش - یک مجموعه آموزشی و یک مجموعه تست - محاسبه می شود. احتمال معمولاً به عنوان یک لگاریتم محاسبه می شود، بنابراین این متریک گاهی اوقات به عنوان احتمال ورود به سیستم نگه داشته می شود. گیجی یک معیار پیش بینی کننده است. این توانایی یک مدل موضوعی را برای پیش‌بینی یک مجموعه تست پس از آموزش روی یک مجموعه آموزشی ارزیابی می‌کند. یکی از کاستی‌های گیجی این است که زمینه را در بر نمی‌گیرد، به این معنی که رابطه بین کلمات در یک موضوع یا موضوعات در یک سند را نشان نمی‌دهد. با این حال، ایده زمینه معنایی برای درک انسان مهم است. اقداماتی مانند احتمال مشروط بودن همزمان کلمات در یک موضوع می تواند مفید باشد. این رویکردها در مجموع به عنوان انسجام شناخته می شوند. برای این پست، ما بر روی رویکرد قضاوت انسان (مبتنی بر مشاهده) تمرکز می کنیم، یعنی مشاهده n کلمه برتر در یک موضوع.

راه حل شامل مراحل سطح بالا زیر است:

  1. راه اندازی آمازون SageMaker نمونه نوت بوک
  2. یک دفترچه یادداشت بسازید.
  3. تجزیه و تحلیل داده های اکتشافی را انجام دهید.
  4. کار مدلسازی موضوع آمازون Comprehend خود را اجرا کنید.
  5. ایجاد موضوعات و درک احساسات.
  6. استفاده کنید آمازون QuickSight برای تجسم داده ها و تولید گزارش.

شما می توانید از این راه حل در هر منطقه AWS استفاده کنید، اما باید مطمئن شوید که API های آمازون Comprehend و SageMaker در یک منطقه هستند. برای این پست، از منطقه شرق ایالات متحده (N. Virginia) استفاده می کنیم.

نمونه نوت بوک SageMaker خود را تنظیم کنید

شما می توانید با آمازون درک از طریق کنسول مدیریت AWS, رابط خط فرمان AWS (AWS CLI)، یا Amazon Comprehend API. برای اطلاعات بیشتر مراجعه کنید شروع کار با Amazon Comprehend. ما از یک نوت بوک SageMaker و کد Python (Boto3) در سراسر این پست برای تعامل با API های آمازون Comprehend استفاده می کنیم.

  1. در کنسول آمازون SageMaker، در قسمت Notebook در قسمت ناوبری، را انتخاب کنید
    نمونه های نوت بوک
  2. ایجاد نمونه نوت بوک را انتخاب کنید.نمونه های نوت بوک
  3. نام نمونه نوت بوک را مشخص کنید و نوع نمونه را ml.r5.2xlarge قرار دهید.
  4. بقیه تنظیمات پیش فرض را رها کنید.
  5. ایجاد یک مدیریت هویت و دسترسی AWS (IAM) نقش با AmazonSageMakerFullAccess و دسترسی به هر مورد ضروری سرویس ذخیره سازی ساده آمازون (Amazon S3) buckets و Amazon Comprehend APIs.
  6. ایجاد نمونه نوت بوک را انتخاب کنید.
    پس از چند دقیقه، نمونه نوت بوک شما آماده است.
  7. برای دسترسی به Amazon Comprehend از نمونه نوت بوک، باید آن را پیوست کنید ComprehendFullAccess سیاست به نقش IAM شما.

برای بررسی اجمالی امنیتی Amazon Comprehend، مراجعه کنید امنیت در Amazon Comprehend.

پس از باز کردن نمونه نوت بوکی که تهیه کردید، در کنسول Jupyter، New و سپس Python 3 (Data Science) را انتخاب کنید. همچنین می توانید به فایل کد نمونه در قسمت دسترسی داشته باشید GitHub repo. می توانید فایل را در نمونه نوت بوک آپلود کنید تا مستقیماً آن را اجرا کنید یا آن را شبیه سازی کنید.

مخزن GitHub شامل سه نوت بوک است:

  • data_processing.ipynb
  • model_training.ipynb
  • topic_mapping_sentiment_generation.ipynb

تجزیه و تحلیل داده های اکتشافی را انجام دهید

ما از اولین نوت بوک استفاده می کنیم (data_processing.ipynb) برای کاوش و پردازش داده ها. ما به سادگی با بارگیری داده ها از یک سطل S3 در یک DataFrame شروع می کنیم.

# Bucket containing the data
BUCKET = 'clothing-shoe-jewel-tm-blog'

# Item ratings and metadata
S3_DATA_FILE = 'Clothing_Shoes_and_Jewelry.json.gz' # Zip
S3_META_FILE = 'meta_Clothing_Shoes_and_Jewelry.json.gz' # Zip

S3_DATA = 's3://' + BUCKET + '/' + S3_DATA_FILE
S3_META = 's3://' + BUCKET + '/' + S3_META_FILE

# Transformed review, input for Comprehend
LOCAL_TRANSFORMED_REVIEW = os.path.join('data', 'TransformedReviews.txt')
S3_OUT = 's3://' + BUCKET + '/out/' + 'TransformedReviews.txt'

# Final dataframe where topics and sentiments are going to be joined
S3_FEEDBACK_TOPICS = 's3://' + BUCKET + '/out/' + 'FinalDataframe.csv'

def convert_json_to_df(path):
    """Reads a subset of a json file in a given path in chunks, combines, and returns
    """
    # Creating chunks from 500k data points each of chunk size 10k
    chunks = pd.read_json(path, orient='records', 
                                lines=True, 
                                nrows=500000, 
                                chunksize=10000, 
                                compression='gzip')
    # Creating a single dataframe from all the chunks
    load_df = pd.DataFrame()
    for chunk in chunks:
        load_df = pd.concat([load_df, chunk], axis=0)
    return load_df

# Review data
original_df = convert_json_to_df(S3_DATA)

# Metadata
original_meta = convert_json_to_df(S3_META)

در بخش زیر، تجزیه و تحلیل داده های اکتشافی (EDA) را برای درک داده ها انجام می دهیم. ما با بررسی شکل داده ها و ابرداده ها شروع می کنیم. برای صحت، ما فقط از بررسی های تایید شده استفاده می کنیم.

# Shape of reviews and metadata
print('Shape of review data: ', original_df.shape)
print('Shape of metadata: ', original_meta.shape)

# We are interested in verified reviews only
# Also checking the amount of missing values in the review data
print('Frequency of verified/non verified review data: ', original_df['verified'].value_counts())
print('Frequency of missing values in review data: ', original_df.isna().sum())

تعداد هر دسته را بیشتر بررسی می کنیم و می بینیم که آیا داده های تکراری وجود دارد یا خیر.

# Count of each categories for EDA.
print('Frequncy of different item categories in metadata: ', original_meta['category'].value_counts())

# Checking null values for metadata
print('Frequency of missing values in metadata: ', original_meta.isna().sum())

# Checking if there are duplicated data. There are indeed duplicated data in the dataframe.
print('Duplicate items in metadata: ', original_meta[original_meta['asin'].duplicated()])

وقتی از نتایج راضی بودیم، به مرحله بعدی پیش پردازش داده ها می رویم. آمازون Comprehend ارائه حداقل 1,000 سند در هر کار مدل سازی موضوعی را توصیه می کند که هر سند حداقل سه جمله داشته باشد. اسناد باید در فایل های متنی با فرمت UTF-8 باشند. در مرحله زیر مطمئن می شویم که داده ها با فرمت UTF-8 توصیه شده باشد و حجم هر ورودی بیش از 5,000 بایت نباشد.

def clean_text(df):
    """Preprocessing review text.
    The text becomes Comprehend compatible as a result.
    This is the most important preprocessing step.
    """
    # Encode and decode reviews
    df['reviewText'] = df['reviewText'].str.encode("utf-8", "ignore")
    df['reviewText'] = df['reviewText'].str.decode('ascii')

    # Replacing characters with whitespace
    df['reviewText'] = df['reviewText'].replace(r'r+|n+|t+|u2028',' ', regex=True)

    # Replacing punctuations
    df['reviewText'] = df['reviewText'].str.replace('[^ws]','', regex=True)

    # Lowercasing reviews
    df['reviewText'] = df['reviewText'].str.lower()
    return df

def prepare_input_data(df):
    """Encoding and getting reviews in byte size.
    Review gets encoded to utf-8 format and getting the size of the reviews in bytes. 
    Comprehend requires each review input to be no more than 5000 Bytes
    """
    df['review_size'] = df['reviewText'].apply(lambda x:len(x.encode('utf-8')))
    df = df[(df['review_size'] > 0) & (df['review_size'] < 5000)]
    df = df.drop(columns=['review_size'])
    return df

# Only data points with a verified review will be selected and the review must not be missing
filter = (original_df['verified'] == True) & (~original_df['reviewText'].isna())
filtered_df = original_df[filter]

# Only a subset of fields are selected in this experiment. 
filtered_df = filtered_df[['asin', 'reviewText', 'summary', 'unixReviewTime', 'overall', 'reviewerID']]

# Just in case, once again, dropping data points with missing review text
filtered_df = filtered_df.dropna(subset=['reviewText'])
print('Shape of review data: ', filtered_df.shape)

# Dropping duplicate items from metadata
original_meta = original_meta.drop_duplicates(subset=['asin'])

# Only a subset of fields are selected in this experiment. 
original_meta = original_meta[['asin', 'category', 'title', 'description', 'brand', 'main_cat']]

# Clean reviews using text cleaning pipeline
df = clean_text(filtered_df)

# Dataframe where Comprehend outputs (topics and sentiments) will be added
df = prepare_input_data(df)

سپس داده ها را در آمازون S3 ذخیره می کنیم و همچنین یک نسخه محلی را در نمونه نوت بوک نگه می داریم.

# Saving dataframe on S3 df.to_csv(S3_FEEDBACK_TOPICS, index=False) 

# Reviews are transformed per Comprehend guideline- one review per line
# The txt file will be used as input for Comprehend
# We first save the input file locally
with open(LOCAL_TRANSFORMED_REVIEW, "w") as outfile:
    outfile.write("n".join(df['reviewText'].tolist()))

# Transferring the transformed review (input to Comprehend) to S3
!aws s3 mv {LOCAL_TRANSFORMED_REVIEW} {S3_OUT}

این مرحله پردازش داده ما را کامل می کند.

یک کار مدلسازی موضوع آمازون Comprehend را اجرا کنید

سپس به مرحله بعدی می‌رویم، جایی که از داده‌های از پیش پردازش شده برای اجرای یک کار مدل‌سازی موضوع با استفاده از Amazon Comprehend استفاده می‌کنیم. در این مرحله می توانید از نوت بوک دوم (model_training.ipynb) یا از کنسول آمازون Comprehend برای اجرای کار مدل سازی موضوع استفاده کنید. برای دستورالعمل استفاده از کنسول، به اجرای کارهای تجزیه و تحلیل با استفاده از کنسول. اگر از نوت بوک استفاده می کنید، می توانید با ایجاد یک کلاینت آمازون Comprehend با استفاده از Boto3، همانطور که در مثال زیر نشان داده شده است، شروع کنید.

# Client and session information
session = boto3.Session()
s3 = boto3.resource('s3')

# Account id. Required downstream.
account_id = boto3.client('sts').get_caller_identity().get('Account')

# Initializing Comprehend client
comprehend = boto3.client(service_name='comprehend', 
                          region_name=session.region_name)

شما می توانید اسناد خود را برای مدل سازی موضوع به دو صورت ارسال کنید: یک سند در هر فایل، یا یک سند در هر خط.

ما با 5 موضوع (k-number) شروع می کنیم و در هر خط از یک سند استفاده می کنیم. هیچ بهترین راه واحدی به عنوان یک تمرین استاندارد برای انتخاب k یا تعداد موضوعات وجود ندارد. می توانید مقادیر مختلف k را امتحان کنید و یکی را انتخاب کنید که بیشترین احتمال را دارد.

# Number of topics set to 5 after having a human-in-the-loop
# This needs to be fully aligned with topicMaps dictionary in the third script 
NUMBER_OF_TOPICS = 5

# Input file format of one review per line
input_doc_format = "ONE_DOC_PER_LINE"

# Role arn (Hard coded, masked)
data_access_role_arn = "arn:aws:iam::XXXXXXXXXXXX:role/service-role/AmazonSageMaker-ExecutionRole-XXXXXXXXXXXXXXX"

کار مدل‌سازی موضوع آمازون Comprehend ما نیاز به گذراندن یک مدرک دارد InputDataConfig شی دیکشنری با S3، InputFormatو DocumentReadAction به عنوان پارامترهای مورد نیاز به طور مشابه، شما باید ارائه دهید OutputDataConfig شی با S3 و DataAccessRoleArn به عنوان پارامترهای مورد نیاز برای اطلاعات بیشتر، به مستندات Boto3 مراجعه کنید start_topics_detection_job.

# Constants for S3 bucket and input data file
BUCKET = 'clothing-shoe-jewel-tm-blog'
input_s3_url = 's3://' + BUCKET + '/out/' + 'TransformedReviews.txt'
output_s3_url = 's3://' + BUCKET + '/out/' + 'output/'

# Final dataframe where we will join Comprehend outputs later
S3_FEEDBACK_TOPICS = 's3://' + BUCKET + '/out/' + 'FinalDataframe.csv'

# Local copy of Comprehend output
LOCAL_COMPREHEND_OUTPUT_DIR = os.path.join('comprehend_out', '')
LOCAL_COMPREHEND_OUTPUT_FILE = os.path.join(LOCAL_COMPREHEND_OUTPUT_DIR, 'output.tar.gz')

INPUT_CONFIG={
    # The S3 URI where Comprehend input is placed.
    'S3Uri':    input_s3_url,
    # Document format
    'InputFormat': input_doc_format,
}
OUTPUT_CONFIG={
    # The S3 URI where Comprehend output is placed.
    'S3Uri':    output_s3_url,
}

سپس می توانید یک کار تشخیص موضوع ناهمزمان را با ارسال تعدادی موضوع، شی پیکربندی ورودی، شی پیکربندی خروجی و نقش IAM آغاز کنید، همانطور که در مثال زیر نشان داده شده است.

# Reading the Comprehend input file just to double check if number of reviews 
# and the number of lines in the input file have an exact match.
obj = s3.Object(input_s3_url)
comprehend_input = obj.get()['Body'].read().decode('utf-8')
comprehend_input_lines = len(comprehend_input.split('n'))

# Reviews where Comprehend outputs will be merged
df = pd.read_csv(S3_FEEDBACK_TOPICS)
review_df_length = df.shape[0]

# The two lengths must be equal
assert comprehend_input_lines == review_df_length

# Start Comprehend topic modelling job.
# Specifies the number of topics, input and output config and IAM role ARN 
# that grants Amazon Comprehend read access to data.
start_topics_detection_job_result = comprehend.start_topics_detection_job(
                                                    NumberOfTopics=NUMBER_OF_TOPICS,
                                                    InputDataConfig=INPUT_CONFIG,
                                                    OutputDataConfig=OUTPUT_CONFIG,
                                                    DataAccessRoleArn=data_access_role_arn)

print('start_topics_detection_job_result: ' + json.dumps(start_topics_detection_job_result))

# Job ID is required downstream for extracting the Comprehend results
job_id = start_topics_detection_job_result["JobId"]
print('job_id: ', job_id)

می توانید وضعیت فعلی کار را با تماس گرفتن پیگیری کنید DescribeTopicDetectionJob عمل. وضعیت شغل می تواند یکی از موارد زیر باشد:

  • ارسال شده - کار دریافت شده است و برای پردازش در صف است
  • IN_PROGRESS - Amazon Comprehend در حال پردازش کار است
  • تکمیل شد - کار با موفقیت تکمیل شد و خروجی در دسترس است
  • ناموفق - کار کامل نشد
# Topic detection takes a while to complete. 
# We can track the current status by calling Use the DescribeTopicDetectionJob operation.
# Keeping track if Comprehend has finished its job
description = comprehend.describe_topics_detection_job(JobId=job_id)

topic_detection_job_status = description['TopicsDetectionJobProperties']["JobStatus"]
print(topic_detection_job_status)
while topic_detection_job_status not in ["COMPLETED", "FAILED"]:
    time.sleep(120)
    topic_detection_job_status = comprehend.describe_topics_detection_job(JobId=job_id)['TopicsDetectionJobProperties']["JobStatus"]
    print(topic_detection_job_status)

topic_detection_job_status = comprehend.describe_topics_detection_job(JobId=job_id)['TopicsDetectionJobProperties']["JobStatus"]
print(topic_detection_job_status)

هنگامی که کار با موفقیت انجام شد، یک بایگانی فشرده حاوی دو فایل را برمی گرداند: topic-terms.csv و doc-topics.csv. اولین فایل خروجی، topic-terms.csv، فهرستی از موضوعات مجموعه است. برای هر موضوع، فهرست به طور پیش‌فرض شامل عبارات برتر بر حسب موضوع است. فایل دوم، doc-topics.csv، اسناد مرتبط با یک موضوع و نسبت سند مربوط به موضوع را فهرست می کند. چون مشخص کردیم ONE_DOC_PER_LINE قبل از آن در input_doc_format متغیر، سند با نام فایل و شماره خط 0-نمایه شده در فایل شناسایی می شود. برای کسب اطلاعات بیشتر در مورد مدل سازی موضوع به ادامه مطلب مراجعه کنید مدل سازی موضوع.
خروجی های Amazon Comprehend به صورت محلی برای مراحل بعدی ما کپی می شوند.

# Bucket prefix where model artifacts are stored
prefix = f'{account_id}-TOPICS-{job_id}'

# Model artifact zipped file
artifact_file = 'output.tar.gz'

# Location on S3 where model artifacts are stored
target = f's3://{BUCKET}/out/output/{prefix}/{artifact_file}'

# Copy Comprehend output from S3 to local notebook instance
! aws s3 cp {target}  ./comprehend-out/

# Unzip the Comprehend output file. 
# Two files are now saved locally- 
#       (1) comprehend-out/doc-topics.csv and 
#       (2) comprehend-out/topic-terms.csv

comprehend_tars = tarfile.open(LOCAL_COMPREHEND_OUTPUT_FILE)
comprehend_tars.extractall(LOCAL_COMPREHEND_OUTPUT_DIR)
comprehend_tars.close()

از آنجا که تعداد موضوعات بسیار کمتر از واژگان مرتبط با مجموعه اسناد است، نمایش فضای موضوع را می توان به عنوان یک فرآیند کاهش ابعاد نیز مشاهده کرد. می توانید از این نمایش فضای موضوعی اسناد برای انجام خوشه بندی استفاده کنید. از سوی دیگر، می توانید فراوانی کلمات را در هر خوشه تجزیه و تحلیل کنید تا موضوع مرتبط با هر خوشه را تعیین کنید. برای این پست، ما هیچ تکنیک دیگری مانند خوشه بندی را انجام نمی دهیم.

ما از دفترچه یادداشت سوم استفاده می کنیم (topic_mapping_sentiment_generation.ipynb) برای یافتن نحوه واکنش کاربران جمعیت‌شناختی مختلف به محصولات و همچنین تجزیه و تحلیل اطلاعات جمع‌آوری شده در مورد تمایل کاربر به یک محصول خاص.

می‌توانیم خروجی‌های نوت‌بوک قبلی را ترکیب کنیم تا موضوعات و اصطلاحات مربوط به هر موضوع را به دست آوریم. با این حال، موضوعات شماره گذاری شده و ممکن است فاقد قابلیت توضیح باشند. بنابراین، ما ترجیح می‌دهیم از یک انسان در حلقه با دانش کافی در حوزه و تخصص موضوعی برای نام‌گذاری موضوعات با نگاه کردن به اصطلاحات مرتبط استفاده کنیم. این فرآیند را می توان به عنوان نقشه برداری از شماره موضوعات به نام موضوعات در نظر گرفت. با این حال، قابل توجه است که فهرست فردی از اصطلاحات برای موضوعات می تواند شامل دو طرف باشد و بنابراین ممکن است چندین نگاشت ایجاد کند. انسان در حلقه باید نگاشت ها را بر اساس زمینه مورد استفاده رسمی کند. در غیر این صورت، عملکرد پایین دستی ممکن است تحت تاثیر قرار گیرد.

با اعلام متغیرها شروع می کنیم. برای هر بررسی، چندین موضوع می تواند وجود داشته باشد. فراوانی آنها را می شماریم و حداکثر سه موضوع پرتکرار را انتخاب می کنیم. این موضوعات به عنوان موضوعات معرف یک بررسی گزارش شده است. ابتدا یک متغیر تعریف می کنیم TOP_TOPICS برای برگزاری حداکثر تعداد موضوعات نماینده. دوم، ما مقادیر را برای the تعریف و تنظیم می کنیم language_code متغیر برای پشتیبانی از پارامتر زبان مورد نیاز Amazon Comprehend. در نهایت، ما ایجاد می کنیم topicMaps، که یک فرهنگ لغت است که شماره موضوعات را به نام موضوعات نگاشت می کند.

# boto3 session to access service
session = boto3.Session()
comprehend = boto3.client(  'comprehend',
                            region_name=session.region_name)

# S3 bucket
BUCKET = 'clothing-shoe-jewel-tm-blog'

# Local copy of doc-topic file
DOC_TOPIC_FILE = os.path.join('comprehend-out', 'doc-topics.csv')

# Final dataframe where we will join Comprehend outputs later
S3_FEEDBACK_TOPICS = 's3://' + BUCKET + '/out/' + 'FinalDataframe.csv'

# Final output
S3_FINAL_OUTPUT = 's3://' + BUCKET + '/out/' + 'reviewTopicsSentiments.csv'

# Top 3 topics per product will be aggregated
TOP_TOPICS = 3

# Working on English language only. 
language_code = 'en'

# Topic names for 5 topics created by human-in-the-loop or SME feed
topicMaps = {
    0: 'Product comfortability',
    1: 'Product Quality and Price',
    2: 'Product Size',
    3: 'Product Color',
    4: 'Product Return',
}

در مرحله بعد، ما از فایل topic-terms.csv تولید شده توسط آمازون Comprehend برای اتصال اصطلاحات منحصر به فرد مرتبط با هر موضوع استفاده می کنیم. سپس با اعمال فرهنگ لغت نقشه بر روی این ارتباط موضوع-اصطلاح، اصطلاحات منحصر به فرد را به نام موضوعات مرتبط می کنیم.

# Loading documents and topics assigned to each of them by Comprehend
docTopics = pd.read_csv(DOC_TOPIC_FILE)
docTopics.head()

# Creating a field with doc number. 
# This doc number is the line number of the input file to Comprehend.
docTopics['doc'] = docTopics['docname'].str.split(':').str[1]
docTopics['doc'] = docTopics['doc'].astype(int)
docTopics.head()

# Load topics and associated terms
topicTerms = pd.read_csv(DOC_TOPIC_FILE)

# Consolidate terms for each topic
aggregatedTerms = topicTerms.groupby('topic')['term'].aggregate(lambda term: term.unique().tolist()).reset_index()

# Sneak peek
aggregatedTerms.head(10)

همانطور که در DataFrame زیر می بینیم، این نقشه خوانی و توضیح موضوعات تولید شده توسط Amazon Comprehend را بهبود می بخشد.

علاوه بر این، همانطور که در مراحل زیر نشان داده شده است، شماره موضوع، اصطلاحات و نام‌ها را به داده‌های ورودی اولیه می‌پیوندیم.

این عبارات و نام‌های موضوع مربوط به هر بررسی را برمی‌گرداند. اعداد و عبارات موضوع با هر بازبینی به هم می پیوندند و سپس به DataFrame اصلی که در اولین نوت بوک ذخیره کرده بودیم، پیوست می شوند.

# Load final dataframe where Comprehend results will be merged to 
feedbackTopics = pd.read_csv(S3_FEEDBACK_TOPICS)

# Joining topic numbers to main data
# The index of feedbackTopics is referring to doc field of docTopics dataframe
feedbackTopics = pd.merge(feedbackTopics, 
                          docTopics, 
                          left_index=True, 
                          right_on='doc', 
                          how='left')

# Reviews will now have topic numbers, associated terms and topics names
feedbackTopics = feedbackTopics.merge(aggregatedTerms, 
                                      on='topic', 
                                      how='left')
feedbackTopics.head()

ما با استفاده از متن بازبینی احساس ایجاد می کنیم detect_sentiment. متن را بررسی می کند و استنباط احساس غالب (مثبت، خنثی، مختلط، یا منفی) را برمی گرداند.

def detect_sentiment(text, language_code):
    """Detects sentiment for a given text and language
    """
    comprehend_json_out = comprehend.detect_sentiment(Text=text, LanguageCode=language_code)
    return comprehend_json_out

# Comprehend output for sentiment in raw json 
feedbackTopics['comprehend_sentiment_json_out'] = feedbackTopics['reviewText'].apply(lambda x: detect_sentiment(x, language_code))

# Extracting the exact sentiment from raw Comprehend Json
feedbackTopics['sentiment'] = feedbackTopics['comprehend_sentiment_json_out'].apply(lambda x: x['Sentiment'])

# Sneak peek
feedbackTopics.head(2)

هم موضوعات و هم احساسات به شدت با نقدها همراه هستند. از آنجا که ما موضوعات و احساسات را در سطح محصول جمع آوری خواهیم کرد، باید با ترکیب موضوعات و احساسات ایجاد شده توسط Amazon Comprehend، یک کلید ترکیبی ایجاد کنیم.

# Creating a composite key of topic name and sentiment.
# This is because we are counting frequency of this combination.
feedbackTopics['TopicSentiment'] = feedbackTopics['TopicNames'] + '_' + feedbackTopics['sentiment']

پس از آن، ما در سطح محصول جمع آوری می کنیم و کلیدهای ترکیبی را برای هر محصول می شماریم.

این مرحله نهایی به ما کمک می‌کند تا جزئیات بررسی‌های هر محصول را بهتر درک کنیم و آن را در هر موضوع به صورت انبوه طبقه‌بندی کنیم. به عنوان مثال، می توانیم مقادیر نشان داده شده برای topicDF DataFrame را در نظر بگیریم. برای اولین محصول، از بین تمام بررسی‌ها برای آن، مشتریان در مجموع تجربه مثبتی در مورد بازگشت محصول، اندازه و راحتی داشتند. برای محصول دوم، مشتریان عمدتاً یک تجربه ترکیبی به مثبت در بازگشت محصول و یک تجربه مثبت در اندازه محصول داشتند.

# Create product id group
asinWiseDF = feedbackTopics.groupby('asin')

# Each product now has a list of topics and sentiment combo (topics can appear multiple times)
topicDF = asinWiseDF['TopicSentiment'].apply(lambda x:list(x)).reset_index()

# Count appreances of topics-sentiment combo for product
topicDF['TopTopics'] = topicDF['TopicSentiment'].apply(Counter)

# Sorting topics-sentiment combo based on their appearance
topicDF['TopTopics'] = topicDF['TopTopics'].apply(lambda x: sorted(x, key=x.get, reverse=True))

# Select Top k topics-sentiment combo for each product/review
topicDF['TopTopics'] = topicDF['TopTopics'].apply(lambda x: x[:TOP_TOPICS])

# Sneak peek
topicDF.head()

موضوعات برتر در هر محصول

DataFrame نهایی ما شامل این اطلاعات موضوع و اطلاعات احساسات است که به DataFrame نهایی به نام پیوست شده است. feedbackTopics که در اولین نوت بوک خود در Amazon S3 ذخیره کردیم.

# Adding the topic-sentiment combo back to product metadata
finalDF = S3_FEEDBACK_TOPICS.merge(topicDF, on='asin', how='left')

# Only selecting a subset of fields
finalDF = finalDF[['asin', 'TopTopics', 'category', 'title']]

# Saving the final output locally
finalDF.to_csv(S3_FINAL_OUTPUT, index=False)

از Amazon QuickSight برای تجسم داده ها استفاده کنید

می توانید از QuickSight برای تجسم داده ها و تولید گزارش استفاده کنید. QuickSight یک سرویس هوش تجاری (BI) است که می توانید از آن برای مصرف داده ها از منابع مختلف و ساخت داشبوردهای هوشمند استفاده کنید. در این مثال، همانطور که در تجسم‌های مثال زیر نشان داده شده است، با استفاده از مجموعه داده نهایی تولید شده، یک تحلیل QuickSight ایجاد می‌کنیم.

تجسم QuickSight

برای کسب اطلاعات بیشتر در مورد Amazon QuickSight، مراجعه کنید شروع با آمازون Quicksight.

پاک کردن

در پایان، باید نمونه نوت‌بوکی را که در این آزمایش استفاده کرده‌ایم از کنسول AWS خاموش کنیم.

نتیجه

در این پست، نحوه استفاده از Amazon Comprehend را برای تجزیه و تحلیل نظرات محصول و یافتن موضوعات برتر با استفاده از مدل‌سازی موضوع به عنوان یک تکنیک نشان دادیم. مدل‌سازی موضوع شما را قادر می‌سازد تا چندین موضوع را بررسی کنید و آنها را در مقیاس سازماندهی، درک و خلاصه کنید. شما می توانید به سرعت و به راحتی الگوهای پنهان موجود در داده ها را کشف کنید و سپس از این بینش برای تصمیم گیری های مبتنی بر داده استفاده کنید. می‌توانید از مدل‌سازی موضوع برای حل مشکلات تجاری متعددی مانند برچسب‌گذاری خودکار بلیط‌های پشتیبانی مشتری، مسیریابی مکالمات به تیم‌های مناسب بر اساس موضوع، تشخیص فوریت بلیط‌های پشتیبانی، دریافت بینش بهتر از مکالمات، ایجاد برنامه‌های مبتنی بر داده، ایجاد مشکل استفاده کنید. محتوای متمرکز، بهبود استراتژی فروش، و شناسایی مسائل و اصطکاک مشتری.

اینها تنها چند نمونه هستند، اما می توانید به بسیاری از مشکلات تجاری بیشتری که روزانه در سازمان خود با آنها مواجه هستید فکر کنید و اینکه چگونه می توانید از مدل سازی موضوع با سایر تکنیک های ML برای حل آنها استفاده کنید.


درباره نویسنده

Gurpreet Cheemaگورپریت یک دانشمند داده با خدمات حرفه ای AWS مستقر در خارج از کانادا است. او مشتاق کمک به مشتریان برای نوآوری با فناوری‌های یادگیری ماشین و هوش مصنوعی است تا از ارزش کسب‌وکار و بینش داده‌ها بهره ببرند. او در اوقات فراغت خود از پیاده روی در فضای باز و خواندن کتاب لذت می برد

رشدی شمسرشدی شمس یک دانشمند داده با خدمات حرفه ای AWS، کانادا است. او محصولات یادگیری ماشینی را برای مشتریان AWS می سازد. او عاشق خواندن و نوشتن داستان های علمی تخیلی است.

ریک تالوکدارریک تالوکدار یک معمار ارشد با تیم آمازون Comprehend Service است. او با مشتریان AWS کار می کند تا به آنها کمک کند یادگیری ماشینی را در مقیاس بزرگ اتخاذ کنند. او در خارج از محل کار به مطالعه و عکاسی علاقه دارد.

تمبر زمان:

بیشتر از آموزش ماشین AWS