احصل على رؤية أفضل من المراجعات باستخدام Amazon Comprehend PlatoBlockchain Data Intelligence. البحث العمودي. عاي.

احصل على رؤية أفضل من المراجعات باستخدام Amazon Comprehend

"85٪ من المشترين يثقون في التقييمات عبر الإنترنت بقدر ما يثقون في التوصيات الشخصية" - غارتنر

يتفاعل المستهلكون بشكل متزايد مع الشركات من خلال الأسطح الرقمية ونقاط الاتصال المتعددة. تشير الإحصائيات إلى أن غالبية المتسوقين يستخدمون المراجعات لتحديد المنتجات المراد شراؤها والخدمات التي يجب استخدامها. حسب مركز شبيجل للأبحاث، فإن احتمالية شراء منتج بخمس مراجعات تزيد بنسبة 270٪ عن احتمالية شراء منتج بدون مراجعات. تتمتع المراجعات بالقدرة على التأثير على قرارات المستهلك وتقوية قيمة العلامة التجارية.

في هذا المنشور ، نستخدم فهم الأمازون لاستخراج معلومات ذات مغزى من مراجعات المنتج ، وتحليلها لفهم كيفية تفاعل المستخدمين من مختلف الديموغرافيات مع المنتجات ، واكتشاف المعلومات المجمعة حول تقارب المستخدم تجاه المنتج. Amazon Comprehend هي خدمة معالجة لغة طبيعية (NLP) مُدارة بالكامل ومُدرَّبة بشكل مستمر يمكنها استخلاص نظرة ثاقبة حول محتوى مستند أو نص.

حل نظرة عامة

اليوم ، يمكن للعملاء تقديم المراجعات بطرق مختلفة ، مثل التقييمات بالنجوم أو النصوص المجانية أو اللغة الطبيعية أو مشاركات الوسائط الاجتماعية. تساعد النصوص المجانية أو مراجعات اللغة الطبيعية في بناء الثقة ، لأنها رأي مستقل من المستهلكين. غالبًا ما تستخدمه فرق المنتج للتفاعل مع العملاء من خلال قنوات المراجعة. إنها حقيقة مثبتة أنه عندما يشعر العملاء بأنهم مسموعون ، فإن شعورهم تجاه العلامة التجارية يتحسن. في حين أنه من الأسهل نسبيًا تحليل تقييمات النجوم أو مشاركات الوسائط الاجتماعية ، فإن اللغة الطبيعية أو المراجعات النصية المجانية تشكل تحديات متعددة ، مثل تحديد الكلمات الرئيسية أو العبارات أو الموضوعات أو المفاهيم ، والمشاعر أو المشاعر على مستوى الكيان. يرجع التحدي بشكل أساسي إلى تباين الطول في النص المكتوب والوجود المعقول لكل من الإشارات والضوضاء. علاوة على ذلك ، يمكن أن تكون المعلومات إما واضحة وصريحة للغاية (على سبيل المثال ، مع الكلمات الرئيسية والعبارات الرئيسية) أو غير واضحة وضمنية (موضوعات ومفاهيم مجردة). الأمر الأكثر صعوبة هو فهم أنواع مختلفة من المشاعر وربطها بالمنتجات والخدمات المناسبة. ومع ذلك ، من الأهمية بمكان فهم هذه المعلومات والإشارات النصية من أجل توفير تجربة عملاء خالية من الاحتكاك.

في هذا المنشور ، نستخدم ملف البرمجة اللغوية العصبية - fast.ai مجموعة بيانات لتحليل مراجعات المنتج المقدمة من العملاء. نبدأ باستخدام تقنية التعلم الآلي (ML) غير الخاضعة للرقابة والمعروفة باسم نمذجة الموضوع. هذا أسلوب شائع غير خاضع للإشراف يكتشف الموضوعات المجردة التي يمكن أن تحدث في مجموعة مراجعة النص. نمذجة الموضوع هي مشكلة تجميع غير خاضعة للإشراف ، مما يعني أن النماذج ليس لديها معرفة بالمتغيرات المستهدفة المحتملة (مثل الموضوعات في المراجعة). يتم تمثيل الموضوعات كمجموعات. في كثير من الأحيان ، يتم تحديد عدد المجموعات في مجموعة من الوثائق بمساعدة خبراء المجال أو باستخدام بعض التحليلات الإحصائية القياسية. تحتوي مخرجات النموذج عمومًا على ثلاثة مكونات: مجموعات مرقمة (الموضوع 0 ، الموضوع 1 ، وما إلى ذلك) ، والكلمات الرئيسية المرتبطة بكل مجموعة ، والمجموعات التمثيلية لكل مستند (أو المراجعة في حالتنا). بحكم طبيعتها المتأصلة ، لا تنشئ نماذج الموضوعات تسميات يمكن أن يقرأها الإنسان للمجموعات أو الموضوعات ، وهو مفهوم خاطئ شائع. شيء يجب ملاحظته حول نمذجة الموضوع بشكل عام هو أنه نموذج عضوية مختلط - قد يكون لكل مستند في النموذج تشابه مع كل موضوع. يتعلم نموذج الموضوع من خلال عملية بايز متكررة لتحديد احتمالية ارتباط كل مستند بموضوع أو موضوع معين. يعتمد إخراج النموذج على اختيار عدد الموضوعات بالشكل الأمثل. يمكن أن يؤدي عدد قليل من الموضوعات إلى أن تكون الموضوعات واسعة جدًا ، وقد يؤدي عدد أكبر من الموضوعات إلى تكرار الموضوعات أو الموضوعات المتشابهة. هناك عدد من الطرق لتقييم نماذج الموضوع:

  • الحكم البشري - قائم على الملاحظة ، قائم على التفسير
  • المقاييس الكمية - الارتباك وحسابات التماسك
  • نهج مختلط - مزيج من النهج القائم على الحكم والنهج الكمية

يتم حساب الارتباك عن طريق تقسيم مجموعة البيانات إلى جزأين - مجموعة تدريب ومجموعة اختبار. عادةً ما يتم حساب الاحتمالية على أنها لوغاريتم ، لذلك يُشار إلى هذا المقياس أحيانًا على أنه احتمال تسجيل الدخول المعلق. الحيرة مقياس تنبؤي. يقوم بتقييم قدرة نموذج الموضوع على التنبؤ بمجموعة اختبار بعد أن تم تدريبه على مجموعة تدريب. تتمثل إحدى عيوب الحيرة في أنها لا تلتقط السياق ، مما يعني أنه لا يلتقط العلاقة بين الكلمات في موضوع أو مواضيع في مستند. ومع ذلك ، فإن فكرة السياق الدلالي مهمة لفهم الإنسان. يمكن أن تكون التدابير مثل الاحتمال الشرطي لتواجد الكلمات في موضوع ما مفيدة. يشار إلى هذه الأساليب مجتمعة باسم التماسك. في هذا المنشور ، نركز على نهج الحكم البشري (القائم على الملاحظة) ، أي مراقبة أفضل الكلمات في الموضوع.

يتكون الحل من الخطوات عالية المستوى التالية:

  1. قم بإعداد ملف الأمازون SageMaker مثيل دفتر الملاحظات.
  2. قم بإنشاء دفتر ملاحظات.
  3. قم بإجراء تحليل استكشافي للبيانات.
  4. قم بتشغيل وظيفة تصميم موضوع Amazon Comprehend.
  5. قم بتوليد الموضوعات وفهم المشاعر.
  6. استعمل أمازون QuickSight لتصور البيانات وإنشاء التقارير.

يمكنك استخدام هذا الحل في أي منطقة من مناطق AWS ، ولكنك تحتاج إلى التأكد من وجود واجهات برمجة تطبيقات Amazon Comprehend و SageMaker في نفس المنطقة. بالنسبة لهذا المنشور ، نستخدم منطقة شرق الولايات المتحدة (شمال فيرجينيا).

قم بإعداد مثيل دفتر SageMaker الخاص بك

يمكنك التفاعل مع Amazon Comprehend عبر ملف وحدة تحكم إدارة AWS, واجهة سطر الأوامر AWS (AWS CLI)أو Amazon Comprehend API. لمزيد من المعلومات ، يرجى الرجوع إلى الشروع في استخدام Amazon Comprehend. نستخدم دفتر SageMaker وكود Python (Boto3) خلال هذا المنشور للتفاعل مع Amazon Comprehend APIs.

  1. في وحدة تحكم Amazon SageMaker ، ضمن Notebook في جزء التنقل ، اختر
    مثيلات الكمبيوتر المحمول.
  2. اختر إنشاء مثيل دفتر ملاحظات.مثيلات المفكرة
  3. حدد اسم مثيل دفتر ملاحظات وعيّن نوع المثيل على أنه ml.r5.2xlarge.
  4. اترك باقي الإعدادات الافتراضية.
  5. خلق إدارة الهوية والوصول (IAM) AWS مع دور AmazonSageMakerFullAccess والوصول إلى أي ضرورة خدمة Amazon Simple Storage (Amazon S3) الحاويات و Amazon Comprehend APIs.
  6. اختر إنشاء مثيل دفتر ملاحظات.
    بعد بضع دقائق ، يكون مثيل دفتر الملاحظات جاهزًا.
  7. للوصول إلى Amazon Comprehend من مثيل دفتر الملاحظات ، تحتاج إلى إرفاق ملف ComprehendFullAccess السياسة لدور IAM الخاص بك.

للحصول على نظرة عامة حول الأمان في Amazon Comprehend ، يرجى الرجوع إلى الأمان في Amazon Comprehend.

بعد فتح مثيل دفتر الملاحظات الذي قمت بتوفيره ، في وحدة تحكم Jupyter ، اختر جديد ثم Python 3 (علم البيانات). بدلاً من ذلك ، يمكنك الوصول إلى نموذج ملف التعليمات البرمجية في ملف جيثب ريبو. يمكنك تحميل الملف إلى نسخة دفتر الملاحظات لتشغيله مباشرة أو استنساخه.

يحتوي GitHub repo على ثلاثة أجهزة كمبيوتر محمولة:

  • 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()])

عندما نكون راضين عن النتائج ، ننتقل إلى الخطوة التالية وهي المعالجة المسبقة للبيانات. توصي Amazon 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)

نقوم بعد ذلك بحفظ البيانات في Amazon 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}

هذا يكمل مرحلة معالجة البيانات لدينا.

قم بتشغيل مهمة تصميم موضوع Amazon Comprehend

ننتقل بعد ذلك إلى المرحلة التالية ، حيث نستخدم البيانات المعالجة مسبقًا لتشغيل وظيفة نمذجة الموضوع باستخدام Amazon Comprehend. في هذه المرحلة ، يمكنك إما استخدام دفتر الملاحظات الثاني (model_training.ipynb) أو استخدم وحدة تحكم Amazon Comprehend لتشغيل مهمة نمذجة الموضوع. للحصول على إرشادات حول استخدام وحدة التحكم ، ارجع إلى تشغيل وظائف التحليل باستخدام وحدة التحكم. إذا كنت تستخدم الكمبيوتر المحمول ، فيمكنك البدء بإنشاء عميل Amazon 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) ، ونستخدم مستندًا واحدًا في كل سطر. لا توجد طريقة واحدة أفضل كممارسة معيارية لاختيار 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"

تتطلب وظيفة نمذجة الموضوعات في Amazon 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-topic.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 لعقد أكبر عدد ممكن من الموضوعات التمثيلية. ثانيًا ، نقوم بتعريف وتعيين القيم إلى 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 الذي تم إنشاؤه بواسطة Amazon 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)

يعمل هذا التعيين على تحسين قابلية القراءة وإمكانية شرح الموضوعات التي تم إنشاؤها بواسطة Amazon Comprehend ، كما نرى في DataFrame التالي.

علاوة على ذلك ، نقوم بربط رقم الموضوع والمصطلحات والأسماء ببيانات الإدخال الأولية ، كما هو موضح في الخطوات التالية.

يؤدي هذا إلى إرجاع مصطلحات وأسماء الموضوع المقابلة لكل مراجعة. يتم ربط أرقام الموضوعات والمصطلحات مع كل مراجعة ثم يتم ضمها مرة أخرى إلى 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 ، ارجع إلى البدء مع Amazon Quicksight.

تنظيف

في النهاية ، نحتاج إلى إغلاق مثيل الكمبيوتر الدفتري الذي استخدمناه في هذه التجربة من AWS Console.

وفي الختام

في هذا المنشور ، أوضحنا كيفية استخدام Amazon Comprehend لتحليل مراجعات المنتج والعثور على أهم الموضوعات باستخدام نمذجة الموضوعات كأسلوب. تمكّنك نمذجة الموضوع من البحث في مواضيع متعددة وتنظيمها وفهمها وتلخيصها على نطاق واسع. يمكنك اكتشاف الأنماط المخفية الموجودة عبر البيانات بسرعة وسهولة ، ثم استخدام هذه الرؤية لاتخاذ قرارات تستند إلى البيانات. يمكنك استخدام نمذجة الموضوع لحل العديد من مشاكل العمل ، مثل وضع علامات تلقائيًا على تذاكر دعم العملاء ، وتوجيه المحادثات إلى الفرق المناسبة بناءً على الموضوع ، واكتشاف الحاجة الملحة لتذاكر الدعم ، والحصول على رؤى أفضل من المحادثات ، وإنشاء خطط تعتمد على البيانات ، وإنشاء مشكلة - المحتوى المركز ، وتحسين استراتيجية المبيعات ، وتحديد مشاكل العملاء والاحتكاكات.

هذه مجرد أمثلة قليلة ، ولكن يمكنك التفكير في العديد من مشاكل العمل التي تواجهها في مؤسستك على أساس يومي ، وكيف يمكنك استخدام نمذجة الموضوعات مع تقنيات تعلم الآلة الأخرى لحلها.


حول المؤلف

جوربريت شيماجوربريت هو عالم بيانات مع خدمات AWS الاحترافية ومقرها كندا. إنها شغوفة بمساعدة العملاء على الابتكار باستخدام تقنيات التعلم الآلي والذكاء الاصطناعي للاستفادة من قيمة الأعمال والرؤى من البيانات. في أوقات فراغها ، تستمتع بالتنزه في الهواء الطلق وقراءة الكتب

رشدي شمسرشدي شمس هو عالم بيانات مع AWS Professional Services ، كندا. لقد قام ببناء منتجات التعلم الآلي لعملاء AWS. يحب قراءة وكتابة قصص الخيال العلمي.

ويريك تالوكدارويريك تالوكدار هو مهندس معماري أول مع فريق Amazon Comprehend Service. إنه يعمل مع عملاء AWS لمساعدتهم على تبني التعلم الآلي على نطاق واسع. خارج العمل ، يستمتع بالقراءة والتصوير.

الطابع الزمني:

اكثر من التعلم الآلي من AWS