Отримайте кращу інформацію з оглядів за допомогою Amazon Comprehend PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Отримайте кращу інформацію з оглядів за допомогою Amazon Comprehend

«85% покупців довіряють онлайн-оглядам так само, як особистим рекомендаціям» – Gartner

Споживачі все більше взаємодіють із компаніями через цифрові засоби та численні точки взаємодії. Статистика показує, що більшість покупців використовують відгуки, щоб визначити, які товари купувати та якими послугами користуватися. Згідно Дослідницький центр Spiegel, ймовірність покупки продукту з п’ятьма відгуками на 270% більша, ніж імовірність покупки продукту без відгуків. Відгуки можуть впливати на рішення споживачів і підвищувати цінність бренду.

У цій публікації ми використовуємо «Амазонка» щоб отримати значущу інформацію з оглядів продукту, проаналізувати її, щоб зрозуміти, як користувачі з різними демографічними показниками реагують на продукти, і знайти сукупну інформацію про прихильність користувачів до продукту. Amazon Comprehend — це повністю керована служба обробки природної мови (NLP), яка постійно навчається, і яка може отримати інформацію про вміст документа або тексту.

Огляд рішення

Сьогодні клієнти можуть надавати відгуки різними способами, наприклад оцінками зірок, вільним текстом або природною мовою або публікацією в соціальних мережах. Огляди безкоштовним текстом або природною мовою допомагають зміцнити довіру, оскільки це незалежна думка споживачів. Його часто використовують команди продуктів для взаємодії з клієнтами через канали відгуків. Доведений факт: коли клієнти відчувають, що їх чують, їхнє ставлення до бренду покращується. У той час як порівняльно простіше аналізувати оцінки зірок або публікації в соціальних мережах, рецензії на природній мові або вільному тексті створюють численні проблеми, як-от ідентифікація ключових слів або фраз, тем або концепцій, а також настроїв або настроїв на рівні сутності. Проблема в основному пов’язана з мінливістю довжини письмового тексту та вірогідною присутністю як сигналів, так і шуму. Крім того, інформація може бути або дуже чіткою та явною (наприклад, із ключовими словами та ключовими фразами), або нечіткою та неявною (абстрактні теми та поняття). Ще складніше зрозуміти різні типи настроїв і зв’язати їх із відповідними продуктами та послугами. Тим не менш, дуже важливо розуміти цю інформацію та текстові сигнали, щоб забезпечити безперебійну взаємодію з клієнтами.

У цій публікації ми використовуємо загальнодоступний НЛП – fast.ai набір даних для аналізу відгуків про продукт, наданих клієнтами. Ми починаємо з використання техніки неконтрольованого машинного навчання (ML), відомої як тематичне моделювання. Це популярна неконтрольована техніка, яка виявляє абстрактні теми, які можуть зустрічатися в колекції текстових рецензій. Моделювання тем — це проблема кластеризації, яка не контролюється, тобто моделі не мають знань про можливі цільові змінні (наприклад, теми в огляді). Теми представлені у вигляді кластерів. Часто кількість кластерів у корпусі документів визначається за допомогою експертів у галузі або за допомогою стандартного статистичного аналізу. Вихідні дані моделі зазвичай мають три компоненти: пронумеровані кластери (тема 0, тема 1 тощо), ключові слова, пов’язані з кожним кластером, і репрезентативні кластери для кожного документа (або огляду в нашому випадку). За своєю природою моделі тем не генерують зрозумілі людині мітки для кластерів або тем, що є поширеною помилкою. Загалом про моделювання теми слід зауважити, що це змішана модель членства — кожен документ у моделі може мати подібність до кожної теми. Тематична модель вчиться в ітераційному байєсовському процесі визначати ймовірність того, що кожен документ пов’язаний із заданою темою чи темою. Вихід моделі залежить від оптимального вибору кількості тем. Невелика кількість тем може призвести до того, що теми будуть занадто широкими, а більша кількість тем може призвести до зайвих тем або тем зі схожістю. Є кілька способів оцінити тематичні моделі:

  • Людське судження – на основі спостережень, на основі інтерпретації
  • Кількісні показники – обчислення здивування, когерентності
  • Змішаний підхід – поєднання підходів на основі суджень і кількісних підходів

Перплексність обчислюється шляхом поділу набору даних на дві частини — набір для навчання та набір для тестування. Імовірність зазвичай обчислюється як логарифм, тому цей показник іноді називають утримуваною логарифмічною ймовірністю. Здивування – це прогнозний показник. Він оцінює здатність тематичної моделі передбачати тестовий набір після навчання на навчальному наборі. Одним із недоліків perplexity є те, що він не вловлює контекст, тобто не вловлює зв’язок між словами в темі або темами в документі. Однак ідея семантичного контексту важлива для людського розуміння. Такі міри, як умовна ймовірність спільної появи слів у темі, можуть бути корисними. Ці підходи разом називають когерентністю. У цьому дописі ми зосереджуємося на підході людського судження (на основі спостережень), а саме на спостереженні за першими n словами в темі.

Рішення складається з таких кроків високого рівня:

  1. Налаштуйте Amazon SageMaker примірник ноутбука.
  2. Створіть блокнот.
  3. Виконайте пошуковий аналіз даних.
  4. Виконайте роботу з тематичного моделювання Amazon Comprehend.
  5. Створюйте теми та розумійте настрої.
  6. Скористайтесь Amazon QuickSight для візуалізації даних і створення звітів.

Ви можете використовувати це рішення в будь-якому регіоні AWS, але вам потрібно переконатися, що API Amazon Comprehend і SageMaker знаходяться в одному регіоні. Для цієї публікації ми використовуємо Східний регіон США (Північна Вірджинія).

Налаштуйте екземпляр блокнота SageMaker

Ви можете взаємодіяти з Amazon Comprehend через Консоль управління AWS, Інтерфейс командного рядка AWS (AWS CLI)або Amazon Comprehend API. Для отримання додаткової інформації див Початок роботи з Amazon Comprehend. У цій публікації ми використовуємо блокнот SageMaker і код Python (Boto3) для взаємодії з API Amazon Comprehend.

  1. На консолі Amazon SageMaker у розділі Блокнот на панелі навігації виберіть
    Примірники блокнота.
  2. Виберіть Створити екземпляр блокнота.Примірники ноутбуків
  3. Укажіть ім’я екземпляра блокнота та встановіть тип екземпляра як ml.r5.2xlarge.
  4. Залиште решту параметрів за замовчуванням.
  5. створити AWS Identity and Access Management (IAM) роль с AmazonSageMakerFullAccess і доступ до будь-якого необхідного Служба простого зберігання Amazon (Amazon S3) відра та API Amazon Comprehend.
  6. Виберіть Створити екземпляр блокнота.
    Через кілька хвилин ваш блокнот буде готовий.
  7. Щоб отримати доступ до Amazon Comprehend з екземпляра ноутбука, вам потрібно прикріпити ComprehendFullAccess політики для вашої ролі IAM.

Огляд безпеки Amazon Comprehend див Безпека в Amazon Comprehend.

Відкривши екземпляр блокнота, який ви підготували, на консолі Jupyter виберіть «Створити», а потім «Python 3 (Data Science). Крім того, ви можете отримати доступ до файлу зразка коду в GitHub репо. Ви можете завантажити файл до екземпляра блокнота, щоб запустити його безпосередньо або клонувати.

Репозиторій 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()])

Коли ми будемо задоволені результатами, ми переходимо до наступного етапу попередньої обробки даних. 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 обробляє завдання
  • ЗАВЕРШЕНО – завдання успішно завершено, і результати доступні
  • FAILED – Робота не завершена
# 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 провести максимальну кількість репрезентативних тем. По-друге, ми визначаємо та встановлюємо значення для 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 для аналізу відгуків про продукти та пошуку найпопулярніших тем за допомогою тематичного моделювання як техніки. Моделювання тем дає змогу переглядати кілька тем і організовувати, розуміти та узагальнювати їх у масштабі. Ви можете швидко й легко виявити приховані шаблони, які присутні в даних, а потім використовувати цю інформацію для прийняття рішень на основі даних. Ви можете використовувати тематичне моделювання для вирішення багатьох бізнес-проблем, як-от автоматичне додавання тегів заявок у службу підтримки клієнтів, спрямування розмов до потрібних команд на основі теми, виявлення терміновості заявок у службу підтримки, отримання кращої інформації з розмов, створення планів на основі даних, створення проблем -орієнтований контент, покращення стратегії продажів та визначення проблем і суперечок клієнтів.

Це лише кілька прикладів, але ви можете подумати про багато інших бізнес-проблем, з якими ви стикаєтесь у своїй організації щодня, і про те, як ви можете використовувати тематичне моделювання з іншими методами ML для їх вирішення.


Про авторів

Гурпріт ЧимаGurpreet є спеціалістом із обробки даних у відділі професійних послуг AWS з Канади. Вона захоплено допомагає клієнтам впроваджувати інновації з технологіями машинного навчання та штучного інтелекту, щоб отримати бізнес-цінність і статистику з даних. У вільний час вона любить гуляти на природі та читати книги.i

Рушді ШамсРушді Шамс є спеціалістом із обробки даних у AWS Professional Services, Канада. Він створює продукти машинного навчання для клієнтів AWS. Він любить читати та писати наукову фантастику.

Вік ТалукдарВік Талукдар є старшим архітектором команди Amazon Comprehend Service. Він працює з клієнтами AWS, щоб допомогти їм запровадити машинне навчання у великих масштабах. Поза роботою він захоплюється читанням і фотографією.

Часова мітка:

Більше від AWS Машинне навчання