Получите более подробную информацию из обзоров с помощью Amazon Comprehend PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Получайте больше информации из обзоров с помощью Amazon Comprehend

«85% покупателей доверяют онлайн-отзывам так же, как личным рекомендациям» — Gartner

Потребители все чаще взаимодействуют с бизнесом через цифровые поверхности и многочисленные точки соприкосновения. Статистика показывает, что большинство покупателей используют отзывы, чтобы определить, какие продукты покупать и какими услугами пользоваться. Согласно Исследовательский центр Шпигеля, вероятность покупки продукта с пятью отзывами на 270 % выше, чем вероятность покупки продукта без отзывов. Отзывы могут влиять на решения потребителей и укреплять ценность бренда.

В этом посте мы используем Amazon Comprehend извлекать значимую информацию из обзоров продуктов, анализировать ее, чтобы понять, как пользователи разных демографических групп реагируют на продукты, и находить сводную информацию об отношении пользователей к продукту. Amazon Comprehend — это полностью управляемый и постоянно обучаемый сервис обработки естественного языка (NLP), который может извлекать информацию о содержании документа или текста.

Обзор решения

Сегодня отзывы могут быть предоставлены клиентами различными способами, такими как звездные рейтинги, свободный текст или естественный язык или публикации в социальных сетях. Обзоры в свободном тексте или на естественном языке помогают завоевать доверие, поскольку это независимое мнение потребителей. Он часто используется продуктовыми командами для взаимодействия с клиентами через каналы отзывов. Доказано, что когда клиенты чувствуют, что их услышали, их отношение к бренду улучшается. В то время как сравнительно легко анализировать звездные рейтинги или публикации в социальных сетях, обзоры на естественном языке или произвольном тексте создают множество проблем, таких как определение ключевых слов или фраз, тем или концепций, а также настроений или настроений на уровне объекта. Проблема в основном связана с изменчивостью длины письменного текста и правдоподобным присутствием как сигналов, так и шума. Кроме того, информация может быть либо очень четкой и явной (например, с ключевыми словами и ключевыми фразами), либо неясной и неявной (абстрактные темы и понятия). Еще более сложной задачей является понимание различных типов настроений и соотнесение их с соответствующими продуктами и услугами. Тем не менее, очень важно понимать эту информацию и текстовые сигналы, чтобы обеспечить бесперебойную работу с клиентами.

В этом посте мы используем общедоступный НЛП — fast.ai набор данных для анализа отзывов о продуктах, предоставленных клиентами. Мы начнем с использования метода неконтролируемого машинного обучения (МО), известного как тематическое моделирование. Это популярный неконтролируемый метод, который обнаруживает абстрактные темы, которые могут встречаться в коллекции текстовых обзоров. Тематическое моделирование — это проблема кластеризации, которая не контролируется, а это означает, что модели не знают о возможных целевых переменных (например, о темах в обзоре). Темы представлены в виде кластеров. Часто количество кластеров в корпусе документов определяется с помощью экспертов в предметной области или с помощью стандартного статистического анализа. Выходные данные модели обычно состоят из трех компонентов: пронумерованных кластеров (тема 0, тема 1 и т. д.), ключевых слов, связанных с каждым кластером, и репрезентативных кластеров для каждого документа (или обзора в нашем случае). По своей природе тематические модели не создают удобочитаемые метки для кластеров или тем, что является распространенным заблуждением. Что касается тематического моделирования в целом, следует отметить, что это смешанная модель членства — каждый документ в модели может иметь сходство с каждой темой. Тематическая модель обучается в итеративном байесовском процессе, чтобы определить вероятность того, что каждый документ связан с данной темой или темой. Результат модели зависит от оптимального выбора количества тем. Небольшое количество тем может привести к тому, что темы будут слишком широкими, а большее количество тем может привести к избыточным темам или темам со сходством. Существует несколько способов оценки тематических моделей:

  • Человеческое суждение – основано на наблюдении, основано на интерпретации
  • Количественные показатели — растерянность, расчеты когерентности
  • Смешанный подход – сочетание основанного на суждениях и количественного подходов.

Недоумение вычисляется путем разделения набора данных на две части — обучающий набор и тестовый набор. Вероятность обычно рассчитывается как логарифм, поэтому этот показатель иногда называют задержанным логарифмическим правдоподобием. Недоумение — это прогностическая метрика. Он оценивает способность тематической модели прогнозировать тестовый набор после обучения на обучающем наборе. Одним из недостатков недоумения является то, что оно не фиксирует контекст, то есть не фиксирует отношения между словами в теме или темами в документе. Однако идея семантического контекста важна для человеческого понимания. Могут быть полезны такие меры, как условная вероятность совместного появления слов в теме. Эти подходы в совокупности называются когерентностью. В этом посте мы сосредоточимся на подходе, основанном на человеческом суждении (основанном на наблюдении), а именно на наблюдении за первыми n словами в теме.

Решение состоит из следующих высокоуровневых шагов:

  1. Настроить Создатель мудреца Амазонки экземпляр блокнота.
  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. Укажите имя экземпляра записной книжки и установите тип экземпляра мл.r5.2xlarge.
  4. Остальные настройки оставьте по умолчанию.
  5. Создать Управление идентификацией и доступом AWS (IAM) роль с AmazonSageMakerFullAccess и доступ ко всем необходимым Сервис Amazon Simple Storage (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 операция. Статус задания может быть одним из следующих:

  • SUBMITTED — задание получено и поставлено в очередь на обработку.
  • IN_PROGRESS — Amazon Comprehend обрабатывает задание.
  • COMPLETED — задание успешно завершено, и результат доступен.
  • 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)

Когда задание успешно завершено, оно возвращает сжатый архив, содержащий два файла: theme-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',
}

Затем мы используем файл theme-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, как мы можем видеть в следующем кадре данных.

Кроме того, мы присоединяем номер темы, термины и имена к исходным входным данным, как показано на следующих шагах.

Это возвращает термины и названия тем, соответствующие каждому обзору. Номера тем и термины присоединяются к каждому обзору, а затем снова присоединяются к исходному фрейму данных, который мы сохранили в первой записной книжке.

# 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']

После этого мы агрегируем на уровне продукта и подсчитываем составные ключи для каждого продукта.

Этот последний шаг помогает нам лучше понять детализацию обзоров по продуктам и классифицировать их по темам в агрегированном виде. Например, мы можем рассмотреть значения, показанные для топика DF 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.

Заключение

В этом посте мы продемонстрировали, как использовать Amazon Comprehend для анализа обзоров продуктов и поиска основных тем, используя тематическое моделирование в качестве метода. Тематическое моделирование позволяет просматривать несколько тем, систематизировать, понимать и обобщать их в масштабе. Вы можете быстро и легко обнаруживать скрытые закономерности, присутствующие в данных, а затем использовать это понимание для принятия решений на основе данных. Вы можете использовать тематическое моделирование для решения многочисленных бизнес-проблем, таких как автоматическая пометка запросов в службу поддержки клиентов, направление разговоров в нужные группы в зависимости от темы, определение срочности запросов в службу поддержки, получение лучшего понимания из разговоров, создание планов на основе данных, создание проблемы - сфокусированный контент, улучшение стратегии продаж и выявление проблем и разногласий клиентов.

Это всего лишь несколько примеров, но вы можете подумать о гораздо большем количестве бизнес-проблем, с которыми вы сталкиваетесь в своей организации ежедневно, и о том, как вы можете использовать тематическое моделирование с другими методами машинного обучения для их решения.


Об авторах

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

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

Врик ТалукдарВрик Талукдар является старшим архитектором в команде Amazon Comprehend Service. Он работает с клиентами AWS, помогая им широко внедрять машинное обучение. Вне работы любит читать и фотографировать.

Отметка времени:

Больше от Машинное обучение AWS