Saat paremman käsityksen arvosteluista käyttämällä Amazon Comprehend PlatoBlockchain Data Intelligenceä. Pystysuuntainen haku. Ai.

Saat paremman käsityksen arvosteluista Amazon Comprehendin avulla

"85 % ostajista luottaa verkkoarvosteluihin yhtä paljon kuin henkilökohtaiseen suositukseen" - Gartner

Kuluttajat ovat yhä enemmän tekemisissä yritysten kanssa digitaalisten pintojen ja useiden kosketuspisteiden kautta. Tilastot osoittavat, että suurin osa ostajista käyttää arvosteluja päättääkseen, mitä tuotteita ostaa ja mitä palveluita käyttää. Kuten Spiegelin tutkimuskeskus, viiden arvostelun saaneen tuotteen ostotodennäköisyys on 270 % suurempi kuin sellaisen tuotteen ostotodennäköisyys, jolla ei ole arvostelua. Arvosteluilla on valta vaikuttaa kuluttajien päätöksiin ja vahvistaa brändin arvoa.

Tässä viestissä käytämme Amazonin käsitys poimia merkityksellistä tietoa tuotearvosteluista, analysoida sitä ymmärtääksesi, kuinka eri väestöryhmien käyttäjät reagoivat tuotteisiin, ja löytää koottua tietoa käyttäjien kiinnostuksesta tuotteeseen. Amazon Comprehend on täysin hallittu ja jatkuvasti koulutettu luonnollisen kielen käsittelypalvelu (NLP), joka voi saada tietoa dokumentin tai tekstin sisällöstä.

Ratkaisun yleiskatsaus

Nykyään asiakkaat voivat tarjota arvosteluja eri tavoilla, kuten tähtiluokituksella, vapaalla tekstillä tai luonnollisella kielellä tai sosiaalisessa mediassa. Vapaa teksti tai luonnollisen kielen arvostelut auttavat rakentamaan luottamusta, koska se on kuluttajien riippumaton mielipide. Tuotetiimit käyttävät sitä usein vuorovaikutuksessa asiakkaiden kanssa arvostelukanavien kautta. On todistettu tosiasia, että kun asiakkaat tuntevat itsensä kuulluiksi, heidän tunteensa brändistä paranee. Tähtiluokitusten tai sosiaalisen median jakojen analysointi on suhteellisen helpompaa, kun taas luonnollisen kielen tai vapaan tekstin arvostelut asettavat useita haasteita, kuten avainsanojen tai lauseiden, aiheiden tai käsitteiden ja tunteiden tai entiteettitason tunteiden tunnistaminen. Haaste johtuu pääasiassa kirjoitetun tekstin pituuden vaihtelusta ja sekä signaalien että kohinan uskottavasta esiintymisestä. Lisäksi tiedot voivat olla joko hyvin selkeitä ja yksiselitteisiä (esimerkiksi avainsanoilla ja avainsanoja) tai epäselviä ja implisiittisiä (abstrakteja aiheita ja käsitteitä). Vielä haastavampaa on erilaisten tunteiden ymmärtäminen ja niiden yhdistäminen sopiviin tuotteisiin ja palveluihin. Tästä huolimatta on erittäin tärkeää ymmärtää nämä tiedot ja tekstisignaalit kitkattoman asiakaskokemuksen tarjoamiseksi.

Tässä viestissä käytämme julkisesti saatavilla olevaa NLP – fast.ai tietojoukko asiakkaiden antamien tuotearvostelujen analysoimiseksi. Aloitamme käyttämällä valvomatonta koneoppimistekniikkaa, joka tunnetaan nimellä aihemallinnus. Tämä suosittu valvomaton tekniikka, joka löytää abstrakteja aiheita, joita voi esiintyä tekstiarvostelukokoelmassa. Aihemallinnus on klusterointiongelma, jota ei valvota, eli malleilla ei ole tietoa mahdollisista kohdemuuttujista (kuten katsauksen aiheista). Aiheet esitetään klustereina. Usein dokumenttikorpuksen klustereiden lukumäärä päätetään alan asiantuntijoiden avulla tai käyttämällä jotakin tavanomaista tilastollista analyysiä. Mallin tuloksissa on yleensä kolme komponenttia: numeroidut klusterit (aihe 0, aihe 1 ja niin edelleen), kuhunkin klusteriin liittyvät avainsanat ja kunkin asiakirjan (tai tässä tapauksessa tarkastelun) edustavat klusterit. Aihemallit eivät luontaisen luonteensa vuoksi luo ihmisen luettavia tunnisteita klusteille tai aiheille, mikä on yleinen väärinkäsitys. Aihemallinnuksessa yleensä on huomioitava, että se on sekajäsenyysmalli – jokainen mallin dokumentti voi muistuttaa jokaista aihetta. Aihemalli oppii iteratiivisessa Bayes-prosessissa määrittämään todennäköisyyden, että jokainen asiakirja liittyy tiettyyn teemaan tai aiheeseen. Mallin tulos riippuu aiheiden optimaalisesta valinnasta. Pieni määrä aiheita voi johtaa siihen, että aiheet ovat liian laajoja, ja suurempi määrä aiheita voi johtaa tarpeettomiin tai samankaltaisiin aiheisiin. On olemassa useita tapoja arvioida aihemalleja:

  • Ihmisen arviointi – havainnointiin perustuva, tulkintaan perustuva
  • Kvantitatiivinen metriikka – Hämmennys, koherenssilaskelmat
  • Sekalähestymistapa – Arviointiin perustuvan ja kvantitatiivisen lähestymistavan yhdistelmä

Hämmennys lasketaan jakamalla tietojoukko kahteen osaan - harjoitussarjaan ja testisarjaan. Todennäköisyys lasketaan yleensä logaritmina, joten tätä metriikkaa kutsutaan joskus pidennetyksi logaritmiksi. Hämmennys on ennustava mittari. Se arvioi aihemallin kykyä ennustaa testisarjaa sen jälkeen, kun se on harjoiteltu harjoitussarjassa. Yksi hämmennyksen puutteista on, että se ei kaappaa kontekstia, mikä tarkoittaa, että se ei kaappaa aiheen sanojen tai asiakirjan aiheiden välistä suhdetta. Ajatus semanttisesta kontekstista on kuitenkin tärkeä ihmisen ymmärtämisen kannalta. Toimenpiteet, kuten ehdollinen todennäköisyys sanojen esiintymiselle aiheessa, voivat olla hyödyllisiä. Näitä lähestymistapoja kutsutaan yhteisesti johdonmukaisuudeksi. Tässä viestissä keskitymme ihmisen arviointiin (havainnointiin perustuvaan) lähestymistapaan, nimittäin aiheen n suosituimman sanan tarkkailuun.

Ratkaisu koostuu seuraavista korkean tason vaiheista:

  1. Määritä Amazon Sage Maker muistikirjan esimerkki.
  2. Luo muistikirja.
  3. Suorita tutkiva data-analyysi.
  4. Suorita Amazon Comprehend -aihemallinnustyösi.
  5. Luo aiheita ja ymmärrä tunteita.
  6. Käyttää Amazon QuickSight visualisoida tietoja ja luoda raportteja.

Voit käyttää tätä ratkaisua millä tahansa AWS-alueella, mutta sinun on varmistettava, että Amazon Comprehend API:t ja SageMaker ovat samalla alueella. Tässä viestissä käytämme aluetta US East (N. Virginia).

Määritä SageMaker-muistikirjan esiintymä

Voit olla vuorovaikutuksessa Amazon Comprehendin kanssa AWS-hallintakonsoli, AWS-komentoriviliitäntä (AWS CLI)tai Amazon Comprehend API. Lisätietoja on kohdassa Amazon Comprehendin käytön aloittaminen. Käytämme SageMaker-muistikirjaa ja Python (Boto3) -koodia koko tämän viestin ajan ollaksemme vuorovaikutuksessa Amazon Comprehend -sovellusliittymien kanssa.

  1. Valitse Amazon SageMaker -konsolin navigointiruudun Muistikirja-kohdasta
    Muistikirjan esiintymät.
  2. Valitse Luo muistikirjan esiintymä.Muistikirjaesimerkit
  3. Määritä muistikirjan ilmentymän nimi ja määritä ilmentymän tyypiksi ml.r5.2xlarge.
  4. Jätä loput oletusasetukset.
  5. Luo AWS-identiteetin ja käyttöoikeuksien hallinta (IAM) roolin kanssa AmazonSageMakerFullAccess ja pääsy kaikkiin tarpeellisiin Amazonin yksinkertainen tallennuspalvelu (Amazon S3) kauhat ja Amazon Comprehend API:t.
  6. Valitse Luo muistikirjan esiintymä.
    Muutaman minuutin kuluttua muistikirjasi on valmis.
  7. Jotta voit käyttää Amazon Comprehendia kannettavan tietokoneen ilmentymästä, sinun on liitettävä ComprehendFullAccess käytäntöä IAM-roolillesi.

Katso Amazon Comprehendin tietoturvakatsaukset kohdasta Suojaus Amazon Comprehend -sovelluksessa.

Kun olet avannut määrittämäsi muistikirjan ilmentymän, valitse Jupyter-konsolissa Uusi ja sitten Python 3 (Data Science). Vaihtoehtoisesti voit käyttää esimerkkikooditiedostoa osoitteessa GitHub repo. Voit ladata tiedoston muistikirjan ilmentymään suorittaaksesi sen suoraan tai kloonataksesi sen.

GitHub-repo sisältää kolme muistikirjaa:

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

Suorita tutkiva data-analyysi

Käytämme ensimmäistä muistikirjaa (data_processing.ipynb) tutkia ja käsitellä tietoja. Aloitamme yksinkertaisesti lataamalla tiedot S3-ämpäristä DataFrame-kehykseen.

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

Seuraavassa osiossa suoritamme tutkivan data-analyysin (EDA) tietojen ymmärtämiseksi. Aloitamme tutkimalla datan ja metatietojen muotoa. Aitouden vuoksi käytämme vain vahvistettuja arvosteluja.

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

Tutkimme edelleen kunkin luokan määrää ja katsomme, onko olemassa päällekkäisiä tietoja.

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

Kun olemme tyytyväisiä tuloksiin, siirrymme tietojen esikäsittelyn seuraavaan vaiheeseen. Amazon Comprehend suosittelee, että jokaisessa aihemallinnustyössä on vähintään 1,000 8 dokumenttia, ja jokainen asiakirja on vähintään kolme lausetta pitkä. Asiakirjojen tulee olla UTF-8-muotoisia tekstitiedostoja. Seuraavassa vaiheessa varmistamme, että tiedot ovat suositellussa UTF-5,000-muodossa ja että jokainen syöte on kooltaan enintään XNUMX XNUMX tavua.

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)

Sitten tallennamme tiedot Amazon S3:een ja säilytämme myös paikallisen kopion kannettavan tietokoneen ilmentymässä.

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

Tämä päättää tietojenkäsittelyvaiheemme.

Suorita Amazon Comprehend -aihemallinnustyö

Siirrymme sitten seuraavaan vaiheeseen, jossa käytämme esikäsiteltyä dataa aiheen mallinnustyön suorittamiseen Amazon Comprehendin avulla. Tässä vaiheessa voit käyttää joko toista muistikirjaa (model_training.ipynb) tai käytä Amazon Comprehend -konsolia aiheen mallinnustyön suorittamiseen. Katso konsolin käyttöohjeet kohdasta Analyysitöiden suorittaminen konsolin avulla. Jos käytät muistikirjaa, voit aloittaa luomalla Amazon Comprehend -asiakkaan Boto3:lla seuraavan esimerkin mukaisesti.

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

Voit lähettää asiakirjasi aihemallinnukseen kahdella tavalla: yksi asiakirja tiedostoa kohden tai yksi asiakirja riviä kohden.

Aloitamme viidellä aiheella (k-luku) ja käytämme yhtä asiakirjaa riviä kohden. Ei ole olemassa yhtä parasta tapaa valita k tai aiheiden määrä. Voit kokeilla erilaisia ​​k:n arvoja ja valita niistä, joilla on suurin todennäköisyys.

# 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 -aihemallinnustyömme edellyttää sinun läpäisemistä InputDataConfig sanakirjaobjekti S3:lla, InputFormatja DocumentReadAction vaadittuina parametreina. Vastaavasti sinun on annettava OutputDataConfig esine S3:lla ja DataAccessRoleArn vaadittuina parametreina. Lisätietoja on Boto3:n dokumentaatiossa 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,
}

Tämän jälkeen voit aloittaa asynkronisen aiheen tunnistustyön välittämällä aiheiden lukumäärän, syötteen määritysobjektin, tulosteen määritysobjektin ja IAM-roolin seuraavan esimerkin mukaisesti.

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

Voit seurata työn nykyistä tilaa soittamalla numeroon DescribeTopicDetectionJob operaatio. Työn tila voi olla jokin seuraavista:

  • LÄHETETTY – Työ on vastaanotettu ja on jonossa käsittelyä varten
  • IN_PROGRESS – Amazon Comprehend käsittelee työtä
  • VALMIS – Työ suoritettiin onnistuneesti ja tulos on saatavilla
  • FAILED – Työtä ei suoritettu loppuun
# 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)

Kun työ on suoritettu onnistuneesti, se palauttaa pakatun arkiston, joka sisältää kaksi tiedostoa: topic-terms.csv ja doc-topics.csv. Ensimmäinen tulostiedosto, topic-terms.csv, on luettelo kokoelman aiheista. Jokaisen aiheen kohdalla luettelo sisältää oletusarvoisesti suosituimmat termit aiheittain painon mukaan. Toinen tiedosto, doc-topics.csv, luettelee aiheeseen liittyvät asiakirjat ja aiheeseen liittyvän asiakirjan osuuden. Koska määritimme ONE_DOC_PER_LINE aikaisemmin input_doc_format muuttuja, dokumentti tunnistetaan tiedostonimen ja tiedoston sisällä olevan 0-indeksoidun rivinumeron perusteella. Lisätietoja aiheen mallintamisesta on kohdassa Aiheen mallintaminen.
Amazon Comprehendin tulosteet kopioidaan paikallisesti seuraavia vaiheita varten.

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

Koska aiheita on paljon vähemmän kuin asiakirjakokoelmaan liittyvä sanasto, aihetilan esitystä voidaan pitää myös ulottuvuuden vähentämisprosessina. Voit käyttää tätä asiakirjojen aihetilaesitystä klusteroinnin suorittamiseen. Toisaalta voit analysoida sanojen tiheyttä kussakin klusterissa määrittääksesi kuhunkin klusteriin liittyvän aiheen. Tässä viestissä emme suorita muita tekniikoita, kuten klusterointia.

Käytämme kolmatta muistikirjaa (topic_mapping_sentiment_generation.ipynb).

Voimme yhdistää edellisen muistikirjan tuotoksia saadaksemme aiheita ja niihin liittyviä termejä kullekin aiheelle. Aiheet ovat kuitenkin numeroituja, ja niistä voi puuttua selitystä. Siksi käytämme mieluummin in-the-loop-ihmistä, jolla on riittävästi verkkotuntia ja aiheen asiantuntemusta, jotta voimme nimetä aiheet tarkastelemalla niihin liittyviä termejä. Tätä prosessia voidaan pitää aiheiden numeroiden yhdistämisenä aiheiden nimiin. On kuitenkin huomionarvoista, että aiheiden yksittäinen termiluettelo voi sisältää toisensa ja siksi voi luoda useita kartoituksia. Ihmisen silmukassa tulisi muotoilla kartoitukset käyttötapauksen kontekstin perusteella. Muuten loppupään suorituskyky voi heikentyä.

Aloitamme ilmoittamalla muuttujat. Jokaisessa arvostelussa voi olla useita aiheita. Laskemme niiden esiintymistiheyden ja valitsemme enintään kolme yleisintä aihetta. Nämä aiheet raportoidaan katsauksen edustavina aiheina. Ensin määritämme muuttujan TOP_TOPICS mahdollisimman monta edustavaa aihetta. Toiseksi määritämme ja asetamme arvot language_code muuttuja tukee Amazon Comprehendin vaadittua kieliparametria. Lopuksi luomme topicMaps, joka on sanakirja, joka yhdistää aiheiden numerot aiheiden nimiin.

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

Seuraavaksi käytämme Amazon Comprehendin luomaa topic-terms.csv-tiedostoa yhdistämään kuhunkin aiheeseen liittyvät ainutlaatuiset termit. Sitten yhdistämme yksilölliset termit aiheiden nimiin käyttämällä kartoitussanakirjaa tähän aihe-termiyhdistykseen.

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

Tämä kartoitus parantaa Amazon Comprehendin luomien aiheiden luettavuutta ja selitettävyyttä, kuten voimme nähdä seuraavasta DataFramesta.

Lisäksi yhdistämme aiheen numeron, termit ja nimet alkusyöttötietoihin, kuten seuraavissa vaiheissa näytetään.

Tämä palauttaa kutakin arvostelua vastaavat aihetermit ja nimet. Aihenumerot ja termit yhdistetään jokaisen arvostelun yhteydessä ja liitetään sitten takaisin alkuperäiseen DataFrame-kehykseen, jonka tallensimme ensimmäiseen muistikirjaan.

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

Luomme mielipiteitä arvostelutekstille käyttämällä detect_sentiment. Se tarkastelee tekstiä ja palauttaa päätelmän vallitsevasta tunteesta (POSITIIVINEN, NEUTRAALI, SEKAINEN tai NEGATIIVINEN).

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)

Sekä aiheet että tunteet liittyvät tiiviisti arvosteluihin. Koska kokoamme aiheita ja mielipiteitä tuotetasolla, meidän on luotava yhdistelmäavain yhdistämällä Amazon Comprehendin luomat aiheet ja tunteet.

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

Myöhemmin aggregoimme tuotetasolla ja laskemme kunkin tuotteen yhdistelmäavaimet.

Tämä viimeinen vaihe auttaa meitä ymmärtämään paremmin tuotekohtaisten arvostelujen tarkkuuden ja luokittelemaan ne aihekohtaisesti koostetulla tavalla. Voimme esimerkiksi ottaa huomioon topicDF DataFramen arvot. Ensimmäisestä tuotteesta, kaikista sitä koskevista arvosteluista, asiakkailla oli positiivinen kokemus tuotteen palautuksesta, koosta ja mukavuudesta. Toisen tuotteen osalta asiakkailla oli enimmäkseen sekoitettu positiivinen kokemus tuotteen palautuksesta ja positiivinen kokemus tuotteen koosta.

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

Suosituimmat aiheet per tuote

Lopullinen DataFrame koostuu näistä aihetiedoista ja mielipidetiedoista, jotka on yhdistetty lopulliseen DataFrame-nimiseen feedbackTopics jonka tallensimme Amazon S3:lle ensimmäiseen muistikirjaamme.

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

Käytä Amazon QuickSightia tietojen visualisointiin

QuickSightin avulla voit visualisoida tiedot ja luoda raportteja. QuickSight on business intelligence (BI) -palvelu, jonka avulla voit kuluttaa tietoa useista eri lähteistä ja rakentaa älykkäitä kojetauluja. Tässä esimerkissä luomme QuickSight-analyysin käyttämällä lopullista tuottamaamme tietojoukkoa, kuten seuraavissa esimerkkivisualisoinneissa esitetään.

QuickSight-visualisointi

Lisätietoja Amazon QuickSightista on osoitteessa Amazon Quicksightin käytön aloittaminen.

Uudelleenjärjestäminen

Lopuksi meidän on suljettava tässä kokeilussa käyttämämme kannettavan tietokoneen ilmentymä AWS-konsolista.

Yhteenveto

Tässä viestissä osoitimme, kuinka Amazon Comprehendia käytetään tuotearvostelujen analysoimiseen ja suosituimpien aiheiden löytämiseen käyttämällä aihemallinnusta tekniikkana. Aihemallinnuksen avulla voit tarkastella useita aiheita ja järjestää, ymmärtää ja tehdä niistä yhteenvedon mittakaavassa. Voit nopeasti ja helposti löytää piilotettuja kuvioita, jotka ovat läsnä tiedoissa, ja käyttää tätä tietoa datalähtöisten päätösten tekemiseen. Aihemallinnuksen avulla voit ratkaista lukuisia liiketoimintaongelmia, kuten automaattisen asiakastukilippujen merkitsemisen, keskustelujen ohjaamisen oikeille ryhmille aiheen perusteella, tukilippujen kiireellisyyden havaitsemisen, parempien näkemysten saamisen keskusteluista, datapohjaisten suunnitelmien luomisesta, ongelman luomisesta. - keskittynyt sisältö, myyntistrategian parantaminen ja asiakasongelmien ja kitkan tunnistaminen.

Nämä ovat vain muutamia esimerkkejä, mutta voit ajatella monia muita liiketoimintaongelmia, joita kohtaat organisaatiossasi päivittäin, ja kuinka voit käyttää aihemallinnusta muiden ML-tekniikoiden kanssa niiden ratkaisemiseen.


Tietoja Tekijät

Gurpreet CheemaGurpreet on Kanadasta peräisin oleva AWS Professional Services -tutkija. Hän on intohimoinen auttaa asiakkaita innovoimaan koneoppimis- ja tekoälyteknologian avulla hyödyntääkseen datasta liiketoiminta-arvoa ja oivalluksia. Vapaa-ajallaan hän nauttii ulkoilusta ja kirjojen lukemisesta.i

Rushdi ShamsRushdi Shams on datatutkija AWS Professional Services -palvelussa, Kanadassa. Hän rakentaa koneoppimistuotteita AWS-asiakkaille. Hän rakastaa lukea ja kirjoittaa tieteiskirjallisuutta.

Wrick TalukdarWrick Talukdar on vanhempi arkkitehti Amazon Comprehend Service -tiimin kanssa. Hän työskentelee AWS-asiakkaiden kanssa auttaakseen heitä ottamaan käyttöön koneoppimisen laajassa mittakaavassa. Työn ulkopuolella hän pitää lukemisesta ja valokuvaamisesta.

Aikaleima:

Lisää aiheesta AWS-koneoppiminen