Nhận thông tin chi tiết hơn từ các bài đánh giá bằng cách sử dụng Amazon Comprehend PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Nhận thông tin chi tiết hơn từ các bài đánh giá bằng Amazon Comprehend

“85% người mua tin tưởng các đánh giá trực tuyến nhiều như lời giới thiệu cá nhân” – Gartner

Người tiêu dùng ngày càng tương tác với các doanh nghiệp thông qua các bề mặt kỹ thuật số và nhiều điểm tiếp xúc. Thống kê cho thấy phần lớn người mua hàng sử dụng các đánh giá để xác định nên mua sản phẩm nào và sử dụng dịch vụ nào. Theo Trung tâm nghiên cứu Spiegel, khả năng mua một sản phẩm có 270 bài đánh giá cao hơn XNUMX% so với khả năng mua một sản phẩm không có bài đánh giá nào. Đánh giá có sức ảnh hưởng đến quyết định của người tiêu dùng và củng cố giá trị thương hiệu.

Trong bài đăng này, chúng tôi sử dụng Amazon hiểu để trích xuất thông tin có ý nghĩa từ các bài đánh giá sản phẩm, phân tích thông tin đó để hiểu cách người dùng thuộc các nhóm nhân khẩu học khác nhau phản ứng với sản phẩm và khám phá thông tin tổng hợp về sở thích của người dùng đối với sản phẩm. Amazon Comprehend là dịch vụ xử lý ngôn ngữ tự nhiên (NLP) được đào tạo liên tục và được quản lý toàn phần, có thể rút ra thông tin chi tiết về nội dung của tài liệu hoặc văn bản.

Tổng quan về giải pháp

Ngày nay, khách hàng có thể cung cấp đánh giá theo nhiều cách khác nhau, chẳng hạn như xếp hạng theo sao, văn bản miễn phí hoặc ngôn ngữ tự nhiên hoặc chia sẻ trên mạng xã hội. Đánh giá bằng văn bản miễn phí hoặc ngôn ngữ tự nhiên giúp xây dựng niềm tin vì đó là ý kiến ​​độc lập từ người tiêu dùng. Nó thường được nhóm sản phẩm sử dụng để tương tác với khách hàng thông qua các kênh đánh giá. Thực tế đã chứng minh là khi khách hàng cảm thấy được lắng nghe, cảm nhận của họ về thương hiệu sẽ được cải thiện. Trong khi việc phân tích xếp hạng theo sao hoặc lượt chia sẻ trên mạng xã hội tương đối dễ dàng hơn, thì các bài đánh giá bằng ngôn ngữ tự nhiên hoặc văn bản miễn phí đặt ra nhiều thách thức, như xác định từ khóa hoặc cụm từ, chủ đề hoặc khái niệm cũng như cảm tính hoặc cảm tính ở cấp độ thực thể. Thách thức chủ yếu là do sự thay đổi độ dài trong văn bản viết và sự hiện diện hợp lý của cả tín hiệu và tiếng ồn. Hơn nữa, thông tin có thể rất rõ ràng và rõ ràng (ví dụ: có từ khóa và cụm từ khóa) hoặc không rõ ràng và tiềm ẩn (chủ đề và khái niệm trừu tượng). Khó khăn hơn nữa là hiểu được các loại cảm xúc khác nhau và liên hệ chúng với các sản phẩm và dịch vụ phù hợp. Tuy nhiên, điều quan trọng là phải hiểu thông tin này và các tín hiệu văn bản để mang lại trải nghiệm suôn sẻ cho khách hàng.

Trong bài đăng này, chúng tôi sử dụng một công cụ có sẵn công khai NLP – nhanh.ai dữ liệu để phân tích các đánh giá sản phẩm do khách hàng cung cấp. Chúng tôi bắt đầu bằng cách sử dụng kỹ thuật học máy không giám sát (ML) được gọi là mô hình hóa chủ đề. Đây là một kỹ thuật không giám sát phổ biến nhằm phát hiện các chủ đề trừu tượng có thể xuất hiện trong bộ sưu tập đánh giá văn bản. Lập mô hình chủ đề là một vấn đề phân cụm không được giám sát, nghĩa là các mô hình không có kiến ​​thức về các biến mục tiêu có thể có (chẳng hạn như các chủ đề trong bài đánh giá). Các chủ đề được biểu diễn dưới dạng cụm. Thông thường, số lượng cụm trong một tập tài liệu được quyết định với sự trợ giúp của các chuyên gia về miền hoặc bằng cách sử dụng một số phân tích thống kê tiêu chuẩn. Đầu ra của mô hình thường có ba thành phần: cụm được đánh số (chủ đề 0, chủ đề 1, v.v.), từ khóa được liên kết với từng cụm và cụm đại diện cho từng tài liệu (hoặc đánh giá trong trường hợp của chúng tôi). Theo bản chất vốn có của nó, các mô hình chủ đề không tạo ra các nhãn mà con người có thể đọc được cho các cụm hoặc chủ đề, đây là một quan niệm sai lầm phổ biến. Một điều cần lưu ý về mô hình chủ đề nói chung là đây là mô hình thành viên hỗn hợp— mọi tài liệu trong mô hình có thể giống với mọi chủ đề. Mô hình chủ đề học theo quy trình Bayesian lặp đi lặp lại để xác định xác suất mỗi tài liệu được liên kết với một chủ đề hoặc chủ đề nhất định. Đầu ra của mô hình phụ thuộc vào việc lựa chọn số lượng chủ đề một cách tối ưu. Một số lượng nhỏ chủ đề có thể dẫn đến các chủ đề quá rộng và số lượng chủ đề lớn hơn có thể dẫn đến các chủ đề dư thừa hoặc các chủ đề có điểm tương đồng. Có một số cách để đánh giá các mô hình chủ đề:

  • Phán đoán của con người – Dựa trên quan sát, dựa trên diễn giải
  • Số liệu định lượng – Tính toán phức tạp, mạch lạc
  • Phương pháp tiếp cận hỗn hợp – Sự kết hợp giữa phương pháp tiếp cận dựa trên đánh giá và định lượng

Độ phức tạp được tính bằng cách chia tập dữ liệu thành hai phần—tập huấn luyện và tập kiểm tra. Khả năng xảy ra thường được tính dưới dạng logarit, vì vậy số liệu này đôi khi được gọi là khả năng ghi nhật ký được giữ lại. Sự bối rối là một thước đo mang tính dự đoán. Nó đánh giá khả năng dự đoán tập kiểm tra của mô hình chủ đề sau khi được huấn luyện trên tập huấn luyện. Một trong những nhược điểm của sự bối rối là nó không nắm bắt được ngữ cảnh, nghĩa là nó không nắm bắt được mối quan hệ giữa các từ trong một chủ đề hoặc các chủ đề trong tài liệu. Tuy nhiên, ý tưởng về bối cảnh ngữ nghĩa rất quan trọng đối với sự hiểu biết của con người. Các thước đo như khả năng có điều kiện về sự xuất hiện cùng lúc của các từ trong một chủ đề có thể hữu ích. Những cách tiếp cận này được gọi chung là sự gắn kết. Đối với bài đăng này, chúng tôi tập trung vào cách tiếp cận đánh giá của con người (dựa trên quan sát), cụ thể là quan sát n từ hàng đầu trong một chủ đề.

Giải pháp bao gồm các bước cấp cao sau:

  1. Thiết lập một Amazon SageMaker ví dụ máy tính xách tay.
  2. Tạo một cuốn sổ tay.
  3. Thực hiện phân tích dữ liệu thăm dò.
  4. Chạy công việc lập mô hình chủ đề Amazon Comprehend của bạn.
  5. Tạo chủ đề và hiểu tình cảm.
  6. Sử dụng Amazon QuickSight để trực quan hóa dữ liệu và tạo báo cáo.

Bạn có thể sử dụng giải pháp này ở bất kỳ Khu vực AWS nào, nhưng bạn cần đảm bảo rằng API Amazon Comprehend và SageMaker nằm trong cùng một Khu vực. Đối với bài đăng này, chúng tôi sử dụng Khu vực Miền Đông Hoa Kỳ (Bắc Virginia).

Thiết lập phiên bản sổ ghi chép SageMaker của bạn

Bạn có thể tương tác với Amazon Comprehend thông qua Bảng điều khiển quản lý AWS, Giao diện dòng lệnh AWS (AWS CLI)hoặc API toàn diện của Amazon. Để biết thêm thông tin, hãy tham khảo Bắt đầu với Amazon Toàn diện. Chúng tôi sử dụng sổ ghi chép SageMaker và mã Python (Boto3) trong suốt bài đăng này để tương tác với API Amazon Comprehend.

  1. Trên bảng điều khiển Amazon SageMaker, trong Notebook trong ngăn điều hướng, chọn
    Phiên bản máy tính xách tay.
  2. Chọn Tạo phiên bản sổ ghi chép.Phiên bản Notebook
  3. Chỉ định tên phiên bản sổ ghi chép và đặt loại phiên bản là ml.r5.2xlarge.
  4. Để phần còn lại của cài đặt mặc định.
  5. tạo một Quản lý truy cập và nhận dạng AWS (IAM) vai trò với AmazonSageMakerFullAccess và truy cập vào bất kỳ thông tin cần thiết nào Dịch vụ lưu trữ đơn giản của Amazon (Amazon S3) xô và API Amazon Comprehend.
  6. Chọn Tạo phiên bản sổ ghi chép.
    Sau vài phút, phiên bản sổ ghi chép của bạn đã sẵn sàng.
  7. Để truy cập Amazon Comprehend từ phiên bản sổ ghi chép, bạn cần đính kèm tệp ComprehendFullAccess chính sách đối với vai trò IAM của bạn.

Để biết tổng quan về bảo mật của Amazon Comprehend, hãy tham khảo Bảo mật trong Amazon Comprehend.

Sau khi bạn mở phiên bản sổ ghi chép mà bạn đã cung cấp, trên bảng điều khiển Jupyter, hãy chọn Mới rồi chọn Python 3 (Khoa học dữ liệu). Ngoài ra, bạn có thể truy cập tệp mã mẫu trong Repo GitHub. Bạn có thể tải tệp lên phiên bản sổ ghi chép để chạy trực tiếp hoặc sao chép tệp.

Kho lưu trữ GitHub chứa ba sổ ghi chép:

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

Thực hiện phân tích dữ liệu khám phá

Chúng tôi sử dụng sổ ghi chép đầu tiên (data_processing.ipynb) để khám phá và xử lý dữ liệu. Chúng tôi bắt đầu bằng cách tải dữ liệu từ vùng lưu trữ S3 vào 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)

Trong phần sau, chúng tôi thực hiện phân tích dữ liệu khám phá (EDA) để hiểu dữ liệu. Chúng tôi bắt đầu bằng cách khám phá hình dạng của dữ liệu và siêu dữ liệu. Để xác thực, chúng tôi chỉ sử dụng các đánh giá đã được xác minh.

# 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())

Chúng tôi khám phá thêm về số lượng của từng danh mục và xem liệu có dữ liệu trùng lặp nào không.

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

Khi chúng tôi hài lòng với kết quả, chúng tôi chuyển sang bước tiếp theo là xử lý trước dữ liệu. Amazon Comprehend khuyên bạn nên cung cấp ít nhất 1,000 tài liệu cho mỗi công việc lập mô hình chủ đề, với mỗi tài liệu dài ít nhất ba câu. Tài liệu phải ở dạng tệp văn bản có định dạng UTF-8. Ở bước tiếp theo, chúng tôi đảm bảo rằng dữ liệu ở định dạng UTF-8 được đề xuất và mỗi đầu vào có kích thước không quá 5,000 byte.

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)

Sau đó, chúng tôi lưu dữ liệu vào Amazon S3 và cũng giữ một bản sao cục bộ trong phiên bản sổ ghi chép.

# 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}

Điều này hoàn thành giai đoạn xử lý dữ liệu của chúng tôi.

Chạy công việc lập mô hình chủ đề Amazon Comprehend

Sau đó, chúng tôi chuyển sang giai đoạn tiếp theo, trong đó chúng tôi sử dụng dữ liệu được xử lý trước để chạy công việc lập mô hình chủ đề bằng Amazon Comprehend. Ở giai đoạn này, bạn có thể sử dụng sổ ghi chép thứ hai (model_training.ipynb) hoặc sử dụng bảng điều khiển Amazon Comprehend để chạy công việc lập mô hình chủ đề. Để biết hướng dẫn sử dụng bảng điều khiển, hãy tham khảo Chạy công việc phân tích bằng bảng điều khiển. Nếu đang sử dụng sổ ghi chép, bạn có thể bắt đầu bằng cách tạo ứng dụng khách Amazon Comprehend bằng Boto3, như trong ví dụ sau.

# 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)

Bạn có thể gửi tài liệu của mình để lập mô hình chủ đề theo hai cách: một tài liệu trên mỗi tệp hoặc một tài liệu trên mỗi dòng.

Chúng tôi bắt đầu với 5 chủ đề (số k) và sử dụng một tài liệu trên mỗi dòng. Không có cách tốt nhất nào như một phương pháp tiêu chuẩn để chọn k hoặc số lượng chủ đề. Bạn có thể thử các giá trị khác nhau của k và chọn giá trị có khả năng xảy ra lớn nhất.

# 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"

Công việc lập mô hình chủ đề Amazon Comprehend của chúng tôi yêu cầu bạn phải vượt qua một InputDataConfig đối tượng từ điển với S3, InputFormatDocumentReadAction như các thông số yêu cầu. Tương tự, bạn cần cung cấp OutputDataConfig đối tượng với S3 và DataAccessRoleArn như các thông số yêu cầu. Để biết thêm thông tin, hãy tham khảo tài liệu Boto3 để biết 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,
}

Sau đó, bạn có thể bắt đầu công việc phát hiện chủ đề không đồng bộ bằng cách chuyển số lượng chủ đề, đối tượng cấu hình đầu vào, đối tượng cấu hình đầu ra và vai trò IAM, như trong ví dụ sau.

# 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)

Bạn có thể theo dõi tình trạng hiện tại của công việc bằng cách gọi DescribeTopicDetectionJob hoạt động. Trạng thái của công việc có thể là một trong những trạng thái sau:

  • ĐĂNG KÝ – Công việc đã được nhận và đang xếp hàng để xử lý
  • IN_PROGRESS – Amazon Comprehend đang xử lý công việc
  • HOÀN THÀNH – Công việc đã được hoàn thành thành công và đầu ra có sẵn
  • THẤT ​​BẠI – Công việc chưa hoàn thành
# 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)

Khi công việc hoàn tất thành công, nó sẽ trả về một kho lưu trữ nén chứa hai tệp: topic-terms.csv và doc-topics.csv. Tệp đầu ra đầu tiên, topic-terms.csv, là danh sách các chủ đề trong bộ sưu tập. Đối với mỗi chủ đề, theo mặc định, danh sách bao gồm các thuật ngữ hàng đầu theo chủ đề tùy theo trọng lượng của chúng. Tệp thứ hai, doc-topics.csv, liệt kê các tài liệu liên quan đến một chủ đề và tỷ lệ tài liệu liên quan đến chủ đề đó. Bởi vì chúng tôi đã chỉ định ONE_DOC_PER_LINE trước đó trong input_doc_format biến, tài liệu được xác định bằng tên tệp và số dòng có chỉ mục 0 trong tệp. Để biết thêm thông tin về mô hình chủ đề, hãy tham khảo Mô hình chủ đề.
Kết quả đầu ra của Amazon Comprehend được sao chép cục bộ cho các bước tiếp theo của chúng tôi.

# 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()

Bởi vì số lượng chủ đề ít hơn nhiều so với từ vựng liên quan đến bộ sưu tập tài liệu nên việc biểu diễn không gian chủ đề cũng có thể được xem như một quá trình giảm kích thước. Bạn có thể sử dụng cách biểu diễn không gian chủ đề này của các tài liệu để thực hiện phân cụm. Mặt khác, bạn có thể phân tích tần suất các từ trong mỗi cụm để xác định chủ đề liên quan đến từng cụm. Đối với bài đăng này, chúng tôi không thực hiện bất kỳ kỹ thuật nào khác như phân cụm.

Chúng tôi sử dụng sổ ghi chép thứ ba (topic_mapping_sentiment_generation.ipynb) để tìm hiểu cách người dùng thuộc các nhóm nhân khẩu học khác nhau phản ứng với sản phẩm, đồng thời phân tích thông tin tổng hợp về sở thích của người dùng đối với một sản phẩm cụ thể.

Chúng ta có thể kết hợp kết quả đầu ra từ sổ ghi chép trước để lấy chủ đề và thuật ngữ liên quan cho từng chủ đề. Tuy nhiên, các chủ đề được đánh số và có thể thiếu khả năng giải thích. Do đó, chúng tôi muốn sử dụng con người có đủ kiến ​​thức về lĩnh vực và kiến ​​thức chuyên môn về chủ đề để đặt tên cho các chủ đề bằng cách xem xét các thuật ngữ liên quan của chúng. Quá trình này có thể được coi là sự ánh xạ từ số chủ đề tới tên chủ đề. Tuy nhiên, điều đáng chú ý là danh sách thuật ngữ riêng lẻ cho các chủ đề có thể bao gồm lẫn nhau và do đó có thể tạo ra nhiều ánh xạ. Con người trong vòng lặp nên chính thức hóa các ánh xạ dựa trên ngữ cảnh của trường hợp sử dụng. Nếu không, hiệu suất xuôi dòng có thể bị ảnh hưởng.

Chúng ta bắt đầu bằng việc khai báo các biến. Đối với mỗi đánh giá, có thể có nhiều chủ đề. Chúng tôi đếm tần suất của chúng và chọn tối đa ba chủ đề thường xuyên nhất. Những chủ đề này được báo cáo là chủ đề đại diện của một bài đánh giá. Đầu tiên, chúng ta định nghĩa một biến TOP_TOPICS nắm giữ số lượng chủ đề đại diện tối đa. Thứ hai, chúng tôi xác định và đặt giá trị cho language_code biến để hỗ trợ tham số ngôn ngữ bắt buộc của Amazon Comprehend. Cuối cùng, chúng tôi tạo ra topicMaps, là từ điển ánh xạ số chủ đề với tên chủ đề.

# 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',
}

Tiếp theo, chúng tôi sử dụng tệp topic-terms.csv do Amazon Comprehend tạo để kết nối các thuật ngữ duy nhất liên quan đến từng chủ đề. Sau đó, bằng cách áp dụng từ điển ánh xạ vào liên kết chủ đề-thuật ngữ này, chúng tôi kết nối các thuật ngữ duy nhất với tên chủ đề.

# 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)

Ánh xạ này cải thiện khả năng đọc và giải thích của các chủ đề do Amazon Comprehend tạo ra, như chúng ta có thể thấy trong DataFrame sau.

Hơn nữa, chúng tôi nối số chủ đề, thuật ngữ và tên với dữ liệu đầu vào ban đầu, như được hiển thị trong các bước sau.

Điều này trả về các thuật ngữ và tên chủ đề tương ứng với mỗi bài đánh giá. Các số chủ đề và thuật ngữ được nối với mỗi bài đánh giá và sau đó được nối tiếp trở lại DataFrame ban đầu mà chúng tôi đã lưu trong sổ ghi chép đầu tiên.

# 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()

Chúng tôi tạo cảm xúc cho văn bản đánh giá bằng cách sử dụng detect_sentiment. Nó kiểm tra văn bản và trả về suy luận về tình cảm phổ biến (TÍCH CỰC, TRUNG LẬP, HỖN HỢP hoặc TIÊU CỰC).

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)

Cả chủ đề và cảm xúc đều được kết hợp chặt chẽ với các bài đánh giá. Vì chúng tôi sẽ tổng hợp các chủ đề và cảm tính ở cấp sản phẩm nên chúng tôi cần tạo khóa tổng hợp bằng cách kết hợp các chủ đề và cảm xúc do Amazon Comprehend tạo ra.

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

Sau đó, chúng tôi tổng hợp ở cấp độ sản phẩm và đếm các khóa tổng hợp cho từng sản phẩm.

Bước cuối cùng này giúp chúng tôi hiểu rõ hơn về mức độ chi tiết của các bài đánh giá cho mỗi sản phẩm và phân loại nó theo chủ đề một cách tổng hợp. Ví dụ: chúng ta có thể xem xét các giá trị được hiển thị cho Khung dữ liệu topicDF. Đối với sản phẩm đầu tiên, trong tất cả các đánh giá về sản phẩm này, nhìn chung, khách hàng có trải nghiệm tích cực về việc hoàn trả sản phẩm, kích thước và sự thoải mái. Đối với sản phẩm thứ hai, khách hàng chủ yếu có trải nghiệm từ tích cực đến tích cực về việc trả lại sản phẩm và trải nghiệm tích cực về kích thước sản phẩm.

# 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()

Chủ đề hàng đầu cho mỗi sản phẩm

DataFrame cuối cùng của chúng tôi bao gồm thông tin chủ đề này và thông tin cảm tính được nối lại với DataFrame cuối cùng có tên feedbackTopics mà chúng tôi đã lưu trên Amazon S3 trong sổ ghi chép đầu tiên của mình.

# 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)

Sử dụng Amazon QuickSight để trực quan hóa dữ liệu

Bạn có thể sử dụng QuickSight để trực quan hóa dữ liệu và tạo báo cáo. QuickSight là dịch vụ thông minh kinh doanh (BI) mà bạn có thể sử dụng để sử dụng dữ liệu từ nhiều nguồn khác nhau và xây dựng bảng thông tin thông minh. Trong ví dụ này, chúng tôi tạo phân tích QuickSight bằng cách sử dụng tập dữ liệu cuối cùng mà chúng tôi đã tạo, như minh họa trong ví dụ trực quan sau đây.

Trực quan hóa QuickSight

Để tìm hiểu thêm về Amazon QuickSight, hãy tham khảo Bắt đầu với Amazon Quicksight.

Dọn dẹp

Cuối cùng, chúng ta cần tắt phiên bản sổ ghi chép mà chúng ta đã sử dụng trong thử nghiệm này từ Bảng điều khiển AWS.

Kết luận

Trong bài đăng này, chúng tôi đã trình bày cách sử dụng Amazon Comprehend để phân tích đánh giá sản phẩm và tìm ra các chủ đề hàng đầu bằng cách sử dụng kỹ thuật lập mô hình chủ đề. Lập mô hình chủ đề cho phép bạn xem qua nhiều chủ đề và sắp xếp, hiểu cũng như tóm tắt chúng trên quy mô lớn. Bạn có thể nhanh chóng và dễ dàng khám phá các mẫu ẩn hiện diện trên dữ liệu, sau đó sử dụng thông tin chi tiết đó để đưa ra quyết định dựa trên dữ liệu. Bạn có thể sử dụng mô hình hóa chủ đề để giải quyết nhiều vấn đề kinh doanh, chẳng hạn như tự động gắn thẻ phiếu hỗ trợ khách hàng, định tuyến cuộc trò chuyện đến đúng nhóm dựa trên chủ đề, phát hiện mức độ khẩn cấp của phiếu hỗ trợ, hiểu rõ hơn về cuộc trò chuyện, tạo kế hoạch dựa trên dữ liệu, tạo vấn đề -nội dung tập trung, cải thiện chiến lược bán hàng và xác định các vấn đề và xích mích của khách hàng.

Đây chỉ là một vài ví dụ nhưng bạn có thể nghĩ ra nhiều vấn đề kinh doanh khác mà bạn gặp phải hàng ngày trong tổ chức của mình và cách bạn có thể sử dụng mô hình chủ đề với các kỹ thuật ML khác để giải quyết những vấn đề đó.


Về các tác giả

Cheema GurpreetGurpreet là Nhà khoa học dữ liệu với Dịch vụ chuyên nghiệp của AWS có trụ sở tại Canada. Cô đam mê giúp khách hàng đổi mới bằng công nghệ Học máy và Trí tuệ nhân tạo để khai thác giá trị kinh doanh và hiểu biết sâu sắc từ dữ liệu. Trong thời gian rảnh rỗi, cô ấy thích đi bộ đường dài ngoài trời và đọc sách.i

Rushdi ShamsRushdi Shams là Nhà khoa học dữ liệu của AWS Professional Services, Canada. Anh xây dựng các sản phẩm máy học cho khách hàng AWS. Anh ấy thích đọc và viết tiểu thuyết khoa học.

Wrick TalukdarWrick Talukdar là Kiến trúc sư cấp cao của nhóm Dịch vụ toàn diện của Amazon. Anh làm việc với khách hàng của AWS để giúp họ áp dụng machine learning trên quy mô lớn. Ngoài công việc, anh thích đọc sách và chụp ảnh.

Dấu thời gian:

Thêm từ Học máy AWS