使用 Amazon Comprehend PlatoBlockchain 数据智能从评论中获得更好的洞察力。 垂直搜索。 哎。

使用 Amazon Comprehend 从评论中获得更好的洞察力

“85% 的买家对在线评论的信任程度不亚于个人推荐”—— Gartner公司

消费者越来越多地通过数字表面和多个接触点与企业互动。 统计数据显示,大多数购物者使用评论来确定购买哪些产品和使用哪些服务。 按照 明镜研究中心,有五个评论的产品的购买可能性比没有评论的产品的购买可能性高 270%。 评论有能力影响消费者的决定并增强品牌价值。

在这篇文章中,我们使用 亚马逊领悟 从产品评论中提取有意义的信息,对其进行分析以了解不同人口统计的用户对产品的反应,并发现有关用户对产品的亲和力的汇总信息。 Amazon Comprehend 是一项完全托管且持续训练的自然语言处理 (NLP) 服务,可以提取有关文档或文本内容的见解。

解决方案概述

如今,客户可以通过各种方式提供评论,例如星级评分、自由文本或自然语言或社交媒体分享。 自由文本或自然语言评论有助于建立信任,因为它是来自消费者的独立意见。 产品团队经常使用它通过评论渠道与客户互动。 事实证明,当客户感到被倾听时,他们对品牌的感觉就会改善。 虽然分析星级或社交媒体份额相对容易,但自然语言或自由文本评论会带来多重挑战,例如识别关键字或短语、主题或概念,以及情绪或实体级别的情绪。 挑战主要是由于书面文本长度的可变性以及信号和噪声的合理存在。 此外,信息可以非常清晰和明确(例如,带有关键字和关键短语),也可以不明确和隐含(抽象主题和概念)。 更具挑战性的是理解不同类型的情绪并将它们与适当的产品和服务联系起来。 然而,理解这些信息和文本信号以提供顺畅的客户体验至关重要。

在这篇文章中,我们使用了一个公开可用的 NLP——fast.ai 数据集来分析客户提供的产品评论。 我们首先使用一种称为主题建模的无监督机器学习 (ML) 技术。 这是一种流行的无监督技术,可以发现文本评论集中可能出现的抽象主题。 主题建模是一个无监督的聚类问题,这意味着模型不了解可能的目标变量(例如评论中的主题)。 主题被表示为集群。 通常,在领域专家的帮助下或通过使用一些标准的统计分析来确定文档语料库中的集群数量。 模型输出通常包含三个组成部分:编号的集群(主题 0、主题 1 等)、与每个集群关联的关键字以及每个文档的代表性集群(或在我们的案例中为评论)。 就其固有性质而言,主题模型不会为集群或主题生成人类可读的标签,这是一种常见的误解。 一般来说,关于主题建模需要注意的是,它是一个混合成员模型——模型中的每个文档都可能与每个主题都有相似之处。 主题模型在迭代贝叶斯过程中学习以确定每个文档与给定主题或主题相关联的概率。 模型输出取决于最佳选择主题的数量。 主题数量少会导致主题过于宽泛,主题数量过多可能会导致主题冗余或主题相似。 有多种评估主题模型的方法:

  • 人类判断——基于观察,基于解释
  • 定量指标——困惑度、连贯性计算
  • 混合方法——基于判断和定量方法的结合

困惑度是通过将数据集分成两部分来计算的——训练集和测试集。 似然度通常以对数计算,因此该指标有时称为保留对数似然度。 困惑度是一个预测指标。 它评估主题模型在训练集上训练后预测测试集的能力。 perplexity 的缺点之一是它不捕捉上下文,这意味着它不捕捉主题中的单词或文档中的主题之间的关系。 然而,语义上下文的概念对于人类理解很重要。 诸如主题中单词同时出现的条件可能性之类的度量可能会有所帮助。 这些方法统称为连贯性。 在这篇文章中,我们专注于人类判断(基于观察)的方法,即观察一个主题中的前 n 个单词。

该解决方案包括以下高级步骤:

  1. 设置一个 亚马逊SageMaker 笔记本实例。
  2. 创建一个笔记本。
  3. 进行探索性数据分析。
  4. 运行您的 Amazon Comprehend 主题建模作业。
  5. 生成主题并理解情绪。
  6. 使用 亚马逊QuickSight 可视化数据并生成报告。

您可以在任何 AWS 区域使用此解决方案,但您需要确保 Amazon Comprehend API 和 SageMaker 位于同一区域。 对于这篇文章,我们使用美国东部(弗吉尼亚北部)地区。

设置您的 SageMaker 笔记本实例

您可以通过 AWS管理控制台, AWS命令行界面(AWS CLI)或 Amazon Comprehend API。 有关详细信息,请参阅 开始使用 Amazon Comprehend. 在这篇博文中,我们使用 SageMaker 笔记本和 Python (Boto3) 代码与 Amazon Comprehend API 进行交互。

  1. 在 Amazon SageMaker 控制台的导航窗格中的 Notebook 下,选择
    笔记本实例。
  2. 选择创建笔记本实例。笔记本实例
  3. 指定笔记本实例名称并将实例类型设置为 ml.r5.2xlarge。
  4. 保留其余默认设置。
  5. 创建 AWS身份和访问管理(IAM) 角色与 AmazonSageMakerFullAccess 并获得任何必要的 亚马逊简单存储服务(Amazon S3) 存储桶和 Amazon Comprehend API。
  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 控制台运行主题建模作业。 有关使用控制台的说明,请参阅 使用控制台运行分析作业. 如果您使用的是笔记本,您可以首先使用 Boto3 创建一个 Amazon Comprehend 客户端,如以下示例所示。

# 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 的字典对象, InputFormatDocumentReadAction 作为所需的参数。 同样,您需要提供 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 正在处理作业
  • 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)

作业成功完成后,它会返回一个包含两个文件的压缩存档: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',
}

接下来,我们使用 Amazon Comprehend 生成的 topic-terms.csv 文件来连接与每个主题相关的唯一术语。 然后,通过在此主题-术语关联上应用映射字典,我们将唯一术语连接到主题名称。

# 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 控制台关闭我们在本实验中使用的笔记本实例。

结论

在这篇文章中,我们演示了如何使用 Amazon Comprehend 分析产品评论并使用主题建模作为一种技术来查找热门主题。 主题建模使您能够查看多个主题并大规模组织、理解和总结它们。 您可以快速轻松地发现数据中存在的隐藏模式,然后利用该洞察力做出数据驱动的决策。 您可以使用主题建模来解决众多业务问题,例如自动标记客户支持票证、根据主题将对话路由到正确的团队、检测支持票证的紧迫性、从对话中获得更好的见解、创建数据驱动的计划、创建问题- 以内容为重点,改进销售策略,并识别客户问题和摩擦。

这些只是几个示例,但您可以考虑组织中每天面临的更多业务问题,以及如何将主题建模与其他 ML 技术结合使用来解决这些问题。


作者简介

古普雷特·奇玛Gurpreet 是一名数据科学家,在加拿大以外的 AWS 专业服务部门工作。 她热衷于帮助客户利用机器学习和人工智能技术进行创新,以从数据中挖掘商业价值和洞察力。 业余时间,她喜欢户外远足和看书。

拉什迪·沙姆斯拉什迪·沙姆斯 是加拿大 AWS 专业服务的数据科学家。 他为 AWS 客户构建机器学习产品。 他喜欢阅读和写科幻小说。

瑞克·塔鲁克达尔瑞克·塔鲁克达尔 是 Amazon Comprehend Service 团队的高级架构师。 他与 AWS 客户合作,帮助他们大规模采用机器学习。 工作之余,他喜欢阅读和摄影。

时间戳记:

更多来自 AWS机器学习