Λάβετε καλύτερες πληροφορίες από κριτικές χρησιμοποιώντας το Amazon Comprehend PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Λάβετε καλύτερες πληροφορίες από κριτικές χρησιμοποιώντας το Amazon Comprehend

«Το 85% των αγοραστών εμπιστεύεται τις διαδικτυακές κριτικές όσο μια προσωπική σύσταση» – Gartner

Οι καταναλωτές αλληλεπιδρούν όλο και περισσότερο με τις επιχειρήσεις μέσω ψηφιακών επιφανειών και πολλαπλών σημείων επαφής. Οι στατιστικές δείχνουν ότι η πλειοψηφία των αγοραστών χρησιμοποιεί κριτικές για να καθορίσει ποια προϊόντα να αγοράσουν και ποιες υπηρεσίες να χρησιμοποιήσουν. Σύμφωνα με Ερευνητικό Κέντρο Spiegel, η πιθανότητα αγοράς για ένα προϊόν με πέντε κριτικές είναι 270% μεγαλύτερη από την πιθανότητα αγοράς ενός προϊόντος χωρίς κριτικές. Οι κριτικές έχουν τη δύναμη να επηρεάσουν τις αποφάσεις των καταναλωτών και να ενισχύσουν την αξία της επωνυμίας.

Σε αυτήν την ανάρτηση, χρησιμοποιούμε Κατανοήστε το Amazon να εξαγάγετε σημαντικές πληροφορίες από κριτικές προϊόντων, να τις αναλύσετε για να κατανοήσετε πώς αντιδρούν οι χρήστες διαφορετικών δημογραφικών στοιχείων στα προϊόντα και να ανακαλύψετε συγκεντρωτικές πληροφορίες σχετικά με τη συνάφεια των χρηστών προς ένα προϊόν. Το Amazon Comprehend είναι μια πλήρως διαχειριζόμενη και συνεχώς εκπαιδευμένη υπηρεσία επεξεργασίας φυσικής γλώσσας (NLP) που μπορεί να εξάγει πληροφορίες σχετικά με το περιεχόμενο ενός εγγράφου ή κειμένου.

Επισκόπηση λύσεων

Σήμερα, οι κριτικές μπορούν να παρέχονται από πελάτες με διάφορους τρόπους, όπως αξιολογήσεις με αστέρια, δωρεάν κείμενο ή φυσική γλώσσα ή κοινοποιήσεις μέσων κοινωνικής δικτύωσης. Οι κριτικές δωρεάν κειμένου ή φυσικής γλώσσας συμβάλλουν στην οικοδόμηση εμπιστοσύνης, καθώς είναι μια ανεξάρτητη γνώμη από τους καταναλωτές. Συχνά χρησιμοποιείται από ομάδες προϊόντων για την αλληλεπίδραση με τους πελάτες μέσω καναλιών αξιολόγησης. Είναι αποδεδειγμένο γεγονός ότι όταν οι πελάτες νιώθουν ότι τους ακούγονται, βελτιώνεται η αίσθηση τους για την επωνυμία. Ενώ είναι συγκριτικά πιο εύκολο να αναλυθούν βαθμολογίες αστεριών ή κοινοποιήσεις μέσων κοινωνικής δικτύωσης, οι κριτικές φυσικής γλώσσας ή δωρεάν κειμένου θέτουν πολλές προκλήσεις, όπως ο προσδιορισμός λέξεων-κλειδιών ή φράσεων, θεμάτων ή εννοιών και συναισθημάτων ή συναισθημάτων σε επίπεδο οντότητας. Η πρόκληση οφείλεται κυρίως στη μεταβλητότητα του μήκους στο γραπτό κείμενο και στην εύλογη παρουσία τόσο των σημάτων όσο και του θορύβου. Επιπλέον, οι πληροφορίες μπορεί να είναι είτε πολύ σαφείς και σαφείς (για παράδειγμα, με λέξεις-κλειδιά και φράσεις κλειδιά) είτε ασαφείς και σιωπηρές (αφηρημένα θέματα και έννοιες). Ακόμη πιο δύσκολη είναι η κατανόηση διαφορετικών τύπων συναισθημάτων και η συσχέτισή τους με κατάλληλα προϊόντα και υπηρεσίες. Ωστόσο, είναι εξαιρετικά σημαντικό να κατανοήσετε αυτές τις πληροφορίες και τα μηνύματα κειμένου, προκειμένου να παρέχετε μια εμπειρία πελάτη χωρίς τριβές.

Σε αυτήν την ανάρτηση, χρησιμοποιούμε μια δημόσια διαθέσιμη NLP – fast.ai σύνολο δεδομένων για την ανάλυση των κριτικών προϊόντων που παρέχονται από τους πελάτες. Ξεκινάμε χρησιμοποιώντας μια τεχνική μη εποπτευόμενης μηχανικής μάθησης (ML) γνωστή ως μοντελοποίηση θεμάτων. Αυτή είναι μια δημοφιλής τεχνική χωρίς επίβλεψη που ανακαλύπτει αφηρημένα θέματα που μπορούν να εμφανιστούν σε μια συλλογή ανασκόπησης κειμένου. Η μοντελοποίηση θεμάτων είναι ένα πρόβλημα ομαδοποίησης που δεν επιτηρείται, πράγμα που σημαίνει ότι τα μοντέλα δεν έχουν γνώση σχετικά με πιθανές μεταβλητές-στόχους (όπως θέματα σε μια ανασκόπηση). Τα θέματα παρουσιάζονται ως ομάδες. Συχνά, ο αριθμός των συμπλεγμάτων σε ένα σύνολο εγγράφων αποφασίζεται με τη βοήθεια ειδικών του τομέα ή χρησιμοποιώντας κάποια τυπική στατιστική ανάλυση. Τα αποτελέσματα του μοντέλου έχουν γενικά τρία στοιχεία: αριθμημένα συμπλέγματα (θέμα 0, θέμα 1 κ.λπ.), λέξεις-κλειδιά που σχετίζονται με κάθε σύμπλεγμα και αντιπροσωπευτικά συμπλέγματα για κάθε έγγραφο (ή κριτική στην περίπτωσή μας). Από την εγγενή τους φύση, τα μοντέλα θεμάτων δεν δημιουργούν ετικέτες αναγνώσιμες από τον άνθρωπο για τα συμπλέγματα ή τα θέματα, κάτι που είναι μια κοινή παρανόηση. Κάτι που πρέπει να σημειωθεί σχετικά με τη μοντελοποίηση θεμάτων γενικά είναι ότι πρόκειται για ένα μοντέλο μικτής ιδιότητας μέλους—κάθε έγγραφο στο μοντέλο μπορεί να έχει ομοιότητα με κάθε θέμα. Το μοντέλο θέματος μαθαίνει σε μια επαναληπτική Μπεϋζιανή διαδικασία να προσδιορίζει την πιθανότητα κάθε έγγραφο να σχετίζεται με ένα δεδομένο θέμα ή θέμα. Η έξοδος του μοντέλου εξαρτάται από τη βέλτιστη επιλογή του αριθμού των θεμάτων. Ένας μικρός αριθμός θεμάτων μπορεί να έχει ως αποτέλεσμα τα θέματα να είναι πολύ ευρεία και ένας μεγαλύτερος αριθμός θεμάτων μπορεί να οδηγήσει σε περιττά θέματα ή θέματα με ομοιότητα. Υπάρχουν διάφοροι τρόποι αξιολόγησης μοντέλων θεμάτων:

  • Ανθρώπινη κρίση – Βασισμένη στην παρατήρηση, βασισμένη στην ερμηνεία
  • Ποσοτικές μετρήσεις – Υπολογισμοί αμηχανίας, συνοχής
  • Μικτή προσέγγιση – Ένας συνδυασμός προσεγγίσεων που βασίζονται στην κρίση και ποσοτικών προσεγγίσεων

Η αμηχανία υπολογίζεται χωρίζοντας ένα σύνολο δεδομένων σε δύο μέρη — ένα σετ εκπαίδευσης και ένα σετ δοκιμής. Η πιθανότητα υπολογίζεται συνήθως ως λογάριθμος, επομένως αυτή η μέτρηση αναφέρεται μερικές φορές ως η πιθανότητα καταγραφής. Η αμηχανία είναι μια προγνωστική μέτρηση. Αξιολογεί την ικανότητα ενός θεματικού μοντέλου να προβλέψει ένα σύνολο δοκιμών αφού έχει εκπαιδευτεί σε ένα σετ εκπαίδευσης. Ένα από τα μειονεκτήματα της αμηχανίας είναι ότι δεν καταγράφει το πλαίσιο, που σημαίνει ότι δεν καταγράφει τη σχέση μεταξύ λέξεων σε ένα θέμα ή θεμάτων σε ένα έγγραφο. Ωστόσο, η ιδέα του σημασιολογικού πλαισίου είναι σημαντική για την ανθρώπινη κατανόηση. Μέτρα όπως η υπό όρους πιθανότητα συνύπαρξης λέξεων σε ένα θέμα μπορεί να είναι χρήσιμα. Αυτές οι προσεγγίσεις αναφέρονται συλλογικά ως συνοχή. Για αυτήν την ανάρτηση, εστιάζουμε στην προσέγγιση της ανθρώπινης κρίσης (βασισμένη στην παρατήρηση), δηλαδή στην παρατήρηση των κορυφαίων n λέξεων σε ένα θέμα.

Η λύση αποτελείται από τα ακόλουθα βήματα υψηλού επιπέδου:

  1. Δημιουργήστε ένα Amazon Sage Maker παράδειγμα σημειωματάριου.
  2. Δημιουργήστε ένα σημειωματάριο.
  3. Εκτελέστε διερευνητική ανάλυση δεδομένων.
  4. Εκτελέστε την εργασία μοντελοποίησης θεμάτων στο Amazon Comprehend.
  5. Δημιουργήστε θέματα και κατανοήστε τα συναισθήματα.
  6. Χρήση Amazon QuickSight για οπτικοποίηση δεδομένων και δημιουργία αναφορών.

Μπορείτε να χρησιμοποιήσετε αυτήν τη λύση σε οποιαδήποτε περιοχή AWS, αλλά πρέπει να βεβαιωθείτε ότι τα Amazon Comprehend API και το SageMaker βρίσκονται στην ίδια περιοχή. Για αυτήν την ανάρτηση, χρησιμοποιούμε την Περιφέρεια ΗΠΑ Ανατολής (Ν. Βιρτζίνια).

Ρυθμίστε την παρουσία του σημειωματάριου SageMaker

Μπορείτε να αλληλεπιδράσετε με το Amazon Comprehend μέσω του Κονσόλα διαχείρισης AWS, Διεπαφή γραμμής εντολών AWS (AWS CLI), ή το Amazon Comprehend API. Για περισσότερες πληροφορίες, ανατρέξτε στο Ξεκινώντας με το Amazon Comprehend. Χρησιμοποιούμε ένα σημειωματάριο SageMaker και έναν κώδικα Python (Boto3) σε όλη αυτήν την ανάρτηση για να αλληλεπιδράσουμε με τα Amazon Comprehend API.

  1. Στην κονσόλα Amazon SageMaker, κάτω από το Σημειωματάριο στο παράθυρο πλοήγησης, επιλέξτε
    Στιγμιότυπα σημειωματάριων.
  2. Επιλέξτε Δημιουργία παρουσίας σημειωματάριου.Σημειώσεις του φορητού υπολογιστή
  3. Καθορίστε ένα όνομα παρουσίας σημειωματαρίου και ορίστε τον τύπο παρουσίας ως ml.r5.2xlarge.
  4. Αφήστε τις υπόλοιπες προεπιλεγμένες ρυθμίσεις.
  5. Δημιουργία ενός Διαχείριση ταυτότητας και πρόσβασης AWS (IAM) ρόλο με AmazonSageMakerFullAccess και πρόσβαση σε κάθε απαραίτητο Υπηρεσία απλής αποθήκευσης Amazon (Amazon S3) buckets και τα Amazon Comprehend API.
  6. Επιλέξτε Δημιουργία παρουσίας σημειωματάριου.
    Μετά από λίγα λεπτά, η παρουσία του σημειωματάριου σας είναι έτοιμη.
  7. Για να αποκτήσετε πρόσβαση στο Amazon Comprehend από την παρουσία του φορητού υπολογιστή, πρέπει να επισυνάψετε το ComprehendFullAccess πολιτική στον ρόλο σας στο IAM.

Για μια επισκόπηση ασφαλείας του Amazon Comprehend, ανατρέξτε στο Ασφάλεια στο Amazon Comprehend.

Αφού ανοίξετε την παρουσία του σημειωματαρίου που παρείχατε, στην κονσόλα Jupyter, επιλέξτε New και μετά Python 3 (Data Science). Εναλλακτικά, μπορείτε να αποκτήσετε πρόσβαση στο δείγμα αρχείου κώδικα στο GitHub repo. Μπορείτε να ανεβάσετε το αρχείο στην παρουσία του σημειωματάριου για να το εκτελέσετε απευθείας ή να το κλωνοποιήσετε.

Το αποθετήριο 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 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)

Στη συνέχεια αποθηκεύουμε τα δεδομένα στο Amazon S3 και διατηρούμε επίσης ένα τοπικό αντίγραφο στην παρουσία του σημειωματάριου.

# Saving dataframe on S3 df.to_csv(S3_FEEDBACK_TOPICS, index=False) 

# Reviews are transformed per Comprehend guideline- one review per line
# The txt file will be used as input for Comprehend
# We first save the input file locally
with open(LOCAL_TRANSFORMED_REVIEW, "w") as outfile:
    outfile.write("n".join(df['reviewText'].tolist()))

# Transferring the transformed review (input to Comprehend) to S3
!aws s3 mv {LOCAL_TRANSFORMED_REVIEW} {S3_OUT}

Αυτό ολοκληρώνει τη φάση επεξεργασίας δεδομένων μας.

Εκτελέστε μια εργασία μοντελοποίησης θεμάτων στο Amazon Comprehend

Στη συνέχεια, προχωράμε στην επόμενη φάση, όπου χρησιμοποιούμε τα προεπεξεργασμένα δεδομένα για να εκτελέσουμε μια εργασία μοντελοποίησης θέματος χρησιμοποιώντας το Amazon Comprehend. Σε αυτό το στάδιο, μπορείτε είτε να χρησιμοποιήσετε το δεύτερο σημειωματάριο (model_training.ipynb) ή χρησιμοποιήστε την κονσόλα Amazon Comprehend για να εκτελέσετε την εργασία μοντελοποίησης θέματος. Για οδηγίες σχετικά με τη χρήση της κονσόλας, ανατρέξτε στο Εκτέλεση εργασιών ανάλυσης χρησιμοποιώντας την κονσόλα. Εάν χρησιμοποιείτε το σημειωματάριο, μπορείτε να ξεκινήσετε δημιουργώντας έναν πελάτη Amazon Comprehend χρησιμοποιώντας το Boto3, όπως φαίνεται στο παρακάτω παράδειγμα.

# Client and session information
session = boto3.Session()
s3 = boto3.resource('s3')

# Account id. Required downstream.
account_id = boto3.client('sts').get_caller_identity().get('Account')

# Initializing Comprehend client
comprehend = boto3.client(service_name='comprehend', 
                          region_name=session.region_name)

Μπορείτε να υποβάλετε τα έγγραφά σας για μοντελοποίηση θέματος με δύο τρόπους: ένα έγγραφο ανά αρχείο ή ένα έγγραφο ανά γραμμή.

Ξεκινάμε με 5 θέματα (k-αριθμός) και χρησιμοποιούμε ένα έγγραφο ανά γραμμή. Δεν υπάρχει κανένας καλύτερος τρόπος ως τυπική πρακτική για να επιλέξετε k ή τον αριθμό των θεμάτων. Μπορείτε να δοκιμάσετε διαφορετικές τιμές του k και να επιλέξετε αυτή που έχει τη μεγαλύτερη πιθανότητα.

# Number of topics set to 5 after having a human-in-the-loop
# This needs to be fully aligned with topicMaps dictionary in the third script 
NUMBER_OF_TOPICS = 5

# Input file format of one review per line
input_doc_format = "ONE_DOC_PER_LINE"

# Role arn (Hard coded, masked)
data_access_role_arn = "arn:aws:iam::XXXXXXXXXXXX:role/service-role/AmazonSageMaker-ExecutionRole-XXXXXXXXXXXXXXX"

Η εργασία μοντελοποίησης θεμάτων στο Amazon Comprehend απαιτεί να περάσετε ένα InputDataConfig αντικείμενο λεξικού με S3, InputFormat, να DocumentReadAction ως απαιτούμενες παραμέτρους. Ομοίως, πρέπει να παρέχετε το OutputDataConfig αντικείμενο με S3 και DataAccessRoleArn ως απαιτούμενες παραμέτρους. Για περισσότερες πληροφορίες, ανατρέξτε στην τεκμηρίωση Boto3 για start_topics_detection_job.

# Constants for S3 bucket and input data file
BUCKET = 'clothing-shoe-jewel-tm-blog'
input_s3_url = 's3://' + BUCKET + '/out/' + 'TransformedReviews.txt'
output_s3_url = 's3://' + BUCKET + '/out/' + 'output/'

# Final dataframe where we will join Comprehend outputs later
S3_FEEDBACK_TOPICS = 's3://' + BUCKET + '/out/' + 'FinalDataframe.csv'

# Local copy of Comprehend output
LOCAL_COMPREHEND_OUTPUT_DIR = os.path.join('comprehend_out', '')
LOCAL_COMPREHEND_OUTPUT_FILE = os.path.join(LOCAL_COMPREHEND_OUTPUT_DIR, 'output.tar.gz')

INPUT_CONFIG={
    # The S3 URI where Comprehend input is placed.
    'S3Uri':    input_s3_url,
    # Document format
    'InputFormat': input_doc_format,
}
OUTPUT_CONFIG={
    # The S3 URI where Comprehend output is placed.
    'S3Uri':    output_s3_url,
}

Στη συνέχεια, μπορείτε να ξεκινήσετε μια ασύγχρονη εργασία ανίχνευσης θέματος περνώντας τον αριθμό των θεμάτων, του αντικειμένου διαμόρφωσης εισόδου, του αντικειμένου διαμόρφωσης εξόδου και ενός ρόλου IAM, όπως φαίνεται στο ακόλουθο παράδειγμα.

# Reading the Comprehend input file just to double check if number of reviews 
# and the number of lines in the input file have an exact match.
obj = s3.Object(input_s3_url)
comprehend_input = obj.get()['Body'].read().decode('utf-8')
comprehend_input_lines = len(comprehend_input.split('n'))

# Reviews where Comprehend outputs will be merged
df = pd.read_csv(S3_FEEDBACK_TOPICS)
review_df_length = df.shape[0]

# The two lengths must be equal
assert comprehend_input_lines == review_df_length

# Start Comprehend topic modelling job.
# Specifies the number of topics, input and output config and IAM role ARN 
# that grants Amazon Comprehend read access to data.
start_topics_detection_job_result = comprehend.start_topics_detection_job(
                                                    NumberOfTopics=NUMBER_OF_TOPICS,
                                                    InputDataConfig=INPUT_CONFIG,
                                                    OutputDataConfig=OUTPUT_CONFIG,
                                                    DataAccessRoleArn=data_access_role_arn)

print('start_topics_detection_job_result: ' + json.dumps(start_topics_detection_job_result))

# Job ID is required downstream for extracting the Comprehend results
job_id = start_topics_detection_job_result["JobId"]
print('job_id: ', job_id)

Μπορείτε να παρακολουθείτε την τρέχουσα κατάσταση της εργασίας καλώντας το DescribeTopicDetectionJob λειτουργία. Η κατάσταση της εργασίας μπορεί να είναι ένα από τα ακόλουθα:

  • ΥΠΟΒΛΗΘΗΚΕ – Η εργασία έχει παραληφθεί και βρίσκεται σε ουρά για επεξεργασία
  • IN_PROGRESS – Το Amazon Comprehend επεξεργάζεται την εργασία
  • ΟΛΟΚΛΗΡΩΘΗΚΕ – Η εργασία ολοκληρώθηκε με επιτυχία και η έξοδος είναι διαθέσιμη
  • ΑΠΟΤΥΧΕ – Η εργασία δεν ολοκληρώθηκε
# Topic detection takes a while to complete. 
# We can track the current status by calling Use the DescribeTopicDetectionJob operation.
# Keeping track if Comprehend has finished its job
description = comprehend.describe_topics_detection_job(JobId=job_id)

topic_detection_job_status = description['TopicsDetectionJobProperties']["JobStatus"]
print(topic_detection_job_status)
while topic_detection_job_status not in ["COMPLETED", "FAILED"]:
    time.sleep(120)
    topic_detection_job_status = comprehend.describe_topics_detection_job(JobId=job_id)['TopicsDetectionJobProperties']["JobStatus"]
    print(topic_detection_job_status)

topic_detection_job_status = comprehend.describe_topics_detection_job(JobId=job_id)['TopicsDetectionJobProperties']["JobStatus"]
print(topic_detection_job_status)

Όταν η εργασία ολοκληρωθεί με επιτυχία, επιστρέφει ένα συμπιεσμένο αρχείο που περιέχει δύο αρχεία: topic-terms.csv και doc-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) για να βρείτε πώς αντιδρούν οι χρήστες διαφορετικών δημογραφικών στοιχείων στα προϊόντα και επίσης να αναλύσετε συγκεντρωτικές πληροφορίες σχετικά με τη συνάφεια των χρηστών προς ένα συγκεκριμένο προϊόν.

Μπορούμε να συνδυάσουμε τα αποτελέσματα από το προηγούμενο σημειωματάριο για να λάβουμε θέματα και σχετικούς όρους για κάθε θέμα. Ωστόσο, τα θέματα είναι αριθμημένα και ενδέχεται να στερούνται εξηγήσεων. Ως εκ τούτου, προτιμούμε να χρησιμοποιούμε έναν άνθρωπο-in-the-loop με αρκετή γνώση τομέα και εξειδίκευση σε θέματα για να ονομάσουμε τα θέματα εξετάζοντας τους σχετικούς όρους τους. Αυτή η διαδικασία μπορεί να θεωρηθεί ως αντιστοίχιση από αριθμούς θεμάτων σε ονόματα θεμάτων. Ωστόσο, είναι αξιοσημείωτο ότι η μεμονωμένη λίστα όρων για τα θέματα μπορεί να περιλαμβάνει αμοιβαία και επομένως μπορεί να δημιουργήσει πολλαπλές αντιστοιχίσεις. Το human-in-the-loop θα πρέπει να επισημοποιήσει τις αντιστοιχίσεις με βάση το πλαίσιο της περίπτωσης χρήσης. Διαφορετικά, η απόδοση κατάντη ενδέχεται να επηρεαστεί.

Ξεκινάμε δηλώνοντας τις μεταβλητές. Για κάθε κριτική, μπορεί να υπάρχουν πολλά θέματα. Μετράμε τη συχνότητά τους και επιλέγουμε το πολύ τρία πιο συχνά θέματα. Αυτά τα θέματα αναφέρονται ως αντιπροσωπευτικά θέματα μιας κριτικής. Αρχικά, ορίζουμε μια μεταβλητή 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.

Συμπέρασμα

Σε αυτήν την ανάρτηση, δείξαμε πώς να χρησιμοποιήσετε το Amazon Comprehend για να αναλύσετε κριτικές προϊόντων και να βρείτε τα κορυφαία θέματα χρησιμοποιώντας τη μοντελοποίηση θεμάτων ως τεχνική. Η μοντελοποίηση θεμάτων σάς δίνει τη δυνατότητα να εξετάσετε πολλά θέματα και να τα οργανώσετε, να τα κατανοήσετε και να τα συνοψίσετε σε κλίμακα. Μπορείτε γρήγορα και εύκολα να ανακαλύψετε κρυφά μοτίβα που υπάρχουν στα δεδομένα και, στη συνέχεια, να χρησιμοποιήσετε αυτές τις πληροφορίες για να λάβετε αποφάσεις βάσει δεδομένων. Μπορείτε να χρησιμοποιήσετε τη μοντελοποίηση θεμάτων για να λύσετε πολλά επιχειρηματικά προβλήματα, όπως αυτόματη προσθήκη ετικετών σε εισιτήρια υποστήριξης πελατών, δρομολόγηση συνομιλιών στις σωστές ομάδες βάσει θέματος, ανίχνευση του επείγοντος χαρακτήρα των εισιτηρίων υποστήριξης, λήψη καλύτερων πληροφοριών από συνομιλίες, δημιουργία σχεδίων βάσει δεδομένων, δημιουργία προβλημάτων -Εστιασμένο περιεχόμενο, βελτίωση της στρατηγικής πωλήσεων και εντοπισμός ζητημάτων και τριβών πελατών.

Αυτά είναι μόνο μερικά παραδείγματα, αλλά μπορείτε να σκεφτείτε πολλά περισσότερα επιχειρηματικά προβλήματα που αντιμετωπίζετε στον οργανισμό σας σε καθημερινή βάση και πώς μπορείτε να χρησιμοποιήσετε τη μοντελοποίηση θεμάτων με άλλες τεχνικές ML για να τα λύσετε.


Σχετικά με τους Συγγραφείς

Gurpreet CheemaGurpreet είναι Επιστήμονας Δεδομένων με AWS Professional Services με έδρα τον Καναδά. Είναι παθιασμένη με το να βοηθά τους πελάτες να καινοτομούν με τις τεχνολογίες Μηχανικής Μάθησης και Τεχνητής Νοημοσύνης για να αξιοποιήσουν την επιχειρηματική αξία και τις πληροφορίες από τα δεδομένα. Στον ελεύθερο χρόνο της, της αρέσει η πεζοπορία σε εξωτερικούς χώρους και η ανάγνωση βιβλίων.i

Ρουσντί ΣαμςΡουσντί Σαμς είναι Επιστήμονας Δεδομένων με AWS Professional Services, Καναδάς. Κατασκευάζει προϊόντα μηχανικής εκμάθησης για πελάτες AWS. Του αρέσει να διαβάζει και να γράφει επιστημονική φαντασία.

Γράφω TalukdarΓράφω Talukdar είναι Senior Architect με την ομάδα Amazon Comprehend Service. Συνεργάζεται με πελάτες AWS για να τους βοηθήσει να υιοθετήσουν τη μηχανική εκμάθηση σε μεγάλη κλίμακα. Εκτός δουλειάς, του αρέσει το διάβασμα και η φωτογραφία.

Σφραγίδα ώρας:

Περισσότερα από Μηχανική εκμάθηση AWS