Pridobite boljši vpogled iz pregledov z uporabo Amazon Comprehend PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Pridobite boljši vpogled iz mnenj z uporabo Amazon Comprehend

"85 % kupcev zaupa spletnim pregledom toliko kot osebnemu priporočilu" – Gartner

Potrošniki vse bolj sodelujejo s podjetji prek digitalnih površin in več stičnih točk. Statistični podatki kažejo, da večina kupcev na podlagi ocen odloča, katere izdelke kupiti in katere storitve uporabiti. Glede na Raziskovalni center Spiegel, je verjetnost nakupa izdelka s petimi ocenami 270 % večja od verjetnosti nakupa izdelka brez ocene. Ocene lahko vplivajo na odločitve potrošnikov in krepijo vrednost blagovne znamke.

V tej objavi uporabljamo Amazonsko razumevanje pridobiti pomembne informacije iz ocen izdelkov, jih analizirati, da bi razumeli, kako se uporabniki različnih demografskih kategorij odzivajo na izdelke, in odkriti združene informacije o naklonjenosti uporabnikov do izdelka. Amazon Comprehend je v celoti upravljana in stalno izobražena storitev za obdelavo naravnega jezika (NLP), ki lahko pridobi vpogled v vsebino dokumenta ali besedila.

Pregled rešitev

Danes lahko stranke zagotovijo ocene na različne načine, kot so ocene z zvezdicami, prosto besedilo ali naravni jezik ali deljenje v družbenih medijih. Pregledi brezplačnega besedila ali naravnega jezika pomagajo zgraditi zaupanje, saj gre za neodvisno mnenje potrošnikov. Pogosto ga uporabljajo produktne ekipe za interakcijo s strankami prek kanalov za pregledovanje. Dokazano dejstvo je, da ko se kupci počutijo slišane, se njihov občutek o blagovni znamki izboljša. Medtem ko je sorazmerno lažje analizirati ocene z zvezdicami ali deljenje v družabnih omrežjih, recenzije naravnega jezika ali prosta besedila predstavljajo več izzivov, kot je prepoznavanje ključnih besed ali besednih zvez, tem ali konceptov ter občutkov ali občutkov na ravni entitet. Izziv je predvsem posledica variabilnosti dolžine pisnega besedila in verjetne prisotnosti tako signalov kot šuma. Poleg tega so lahko informacije zelo jasne in eksplicitne (na primer s ključnimi besedami in ključnimi frazami) ali nejasne in implicitne (abstraktne teme in koncepti). Še večji izziv pa je razumevanje različnih vrst občutkov in njihovo povezovanje z ustreznimi izdelki in storitvami. Kljub temu je zelo pomembno razumeti te informacije in besedilne signale, da bi zagotovili nemoteno uporabniško izkušnjo.

V tej objavi uporabljamo javno dostopno NLP – fast.ai nabor podatkov za analizo mnenj o izdelkih, ki so jih zagotovile stranke. Začnemo z uporabo tehnike nenadzorovanega strojnega učenja (ML), znane kot modeliranje teme. To je priljubljena nenadzorovana tehnika, ki odkriva abstraktne teme, ki se lahko pojavijo v zbirki pregledov besedil. Modeliranje tem je problem združevanja v gruče, ki je nenadzorovan, kar pomeni, da modeli nimajo znanja o možnih ciljnih spremenljivkah (kot so teme v pregledu). Teme so predstavljene kot grozdi. Pogosto se o številu skupin v korpusu dokumentov odloča s pomočjo strokovnjakov za področje ali z uporabo neke standardne statistične analize. Izhodi modela imajo na splošno tri komponente: oštevilčene skupine (tema 0, tema 1 itd.), ključne besede, povezane z vsako gručo, in reprezentativne skupine za vsak dokument (ali pregled v našem primeru). Po svoji inherentni naravi modeli tem ne ustvarjajo človeško berljivih oznak za gruče ali teme, kar je pogosta napačna predstava. Pri modeliranju tem na splošno je treba opozoriti na to, da gre za model mešanega članstva – vsak dokument v modelu je lahko podoben vsaki temi. Model teme se v iterativnem Bayesovem procesu nauči določiti verjetnost, da je vsak dokument povezan z dano temo ali temo. Rezultat modela je odvisen od izbire optimalnega števila tem. Majhno število tem lahko povzroči, da so teme preširoke, večje število tem pa lahko povzroči odvečne teme ali teme s podobnostjo. Obstaja več načinov za ocenjevanje modelov tem:

  • Človeška presoja – temelji na opazovanju, temelji na interpretaciji
  • Kvantitativne metrike – Perplexity, koherenčni izračuni
  • Mešani pristop – kombinacija pristopov, ki temeljijo na presoji, in kvantitativnih pristopov

Perplexity se izračuna tako, da se nabor podatkov razdeli na dva dela – niz za usposabljanje in niz za testiranje. Verjetnost se običajno izračuna kot logaritem, zato se ta metrika včasih imenuje zadržana logaritmična verjetnost. Zmedenost je napovedna metrika. Ocenjuje zmožnost tematskega modela, da predvidi testni niz po tem, ko se je uril na učnem nizu. Ena od pomanjkljivosti perplexity je, da ne zajame konteksta, kar pomeni, da ne zajame razmerja med besedami v temi ali temami v dokumentu. Vendar pa je ideja o pomenskem kontekstu pomembna za človeško razumevanje. Meritve, kot je pogojna verjetnost sočasnega pojavljanja besed v temi, so lahko v pomoč. Ti pristopi se skupaj imenujejo skladnost. Za to objavo se osredotočamo na pristop človeške presoje (na podlagi opazovanja), in sicer na opazovanje prvih n besed v temi.

Rešitev je sestavljena iz naslednjih korakov na visoki ravni:

  1. Nastavite Amazon SageMaker primerek prenosnika.
  2. Ustvarite zvezek.
  3. Izvedite raziskovalno analizo podatkov.
  4. Izvedite nalogo modeliranja teme Amazon Comprehend.
  5. Ustvarite teme in razumejte čustva.
  6. Uporaba Amazon QuickSight za vizualizacijo podatkov in ustvarjanje poročil.

To rešitev lahko uporabljate v kateri koli regiji AWS, vendar se morate prepričati, da sta API-ja Amazon Comprehend in SageMaker v isti regiji. Za to objavo uporabljamo regijo US East (N. Virginia).

Nastavite svoj primerek prenosnika SageMaker

Z Amazon Comprehend lahko komunicirate prek Konzola za upravljanje AWS, AWS vmesnik ukazne vrstice (AWS CLI)ali Amazon Comprehend API. Za več informacij glejte Kako začeti uporabljati Amazon Comprehend. V tej objavi uporabljamo prenosni računalnik SageMaker in kodo Python (Boto3) za interakcijo z API-ji Amazon Comprehend.

  1. Na konzoli Amazon SageMaker v razdelku Beležnica v navigacijskem podoknu izberite
    Primerki zvezkov.
  2. Izberite Ustvari primerek zvezka.Primerki prenosnih računalnikov
  3. Podajte ime primerka prenosnega računalnika in nastavite vrsto primerka kot ml.r5.2xlarge.
  4. Pustite ostale privzete nastavitve.
  5. Ustvari AWS upravljanje identitete in dostopa (IAM) vlogo z AmazonSageMakerFullAccess in dostop do vseh potrebnih Preprosta storitev shranjevanja Amazon (Amazon S3) vedra in API-ji Amazon Comprehend.
  6. Izberite Ustvari primerek zvezka.
    Po nekaj minutah je vaš primerek prenosnika pripravljen.
  7. Za dostop do Amazon Comprehend iz primerka prenosnega računalnika morate priložiti ComprehendFullAccess vašo vlogo IAM.

Za varnostni pregled Amazon Comprehend glejte Varnost v Amazon Comprehend.

Ko odprete primerek prenosnega računalnika, ki ste ga opremili, na konzoli Jupyter izberite Novo in nato Python 3 (Data Science). Lahko pa dostopate do datoteke vzorčne kode v GitHub repo. Datoteko lahko naložite v primerek prenosnega računalnika, da jo zaženete neposredno ali jo klonirate.

Repo GitHub vsebuje tri zvezke:

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

Izvedite raziskovalno analizo podatkov

Uporabljamo prvi zvezek (data_processing.ipynb) za raziskovanje in obdelavo podatkov. Začnemo s preprostim nalaganjem podatkov iz vedra S3 v 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)

V naslednjem razdelku izvajamo raziskovalno analizo podatkov (EDA) za razumevanje podatkov. Začnemo z raziskovanjem oblike podatkov in metapodatkov. Za pristnost uporabljamo samo preverjene ocene.

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

Nadalje raziščemo število vsake kategorije in preverimo, ali so prisotni podvojeni podatki.

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

Ko smo z rezultati zadovoljni, preidemo na naslednji korak predobdelave podatkov. Amazon Comprehend priporoča, da zagotovite vsaj 1,000 dokumentov za vsako nalogo modeliranja teme, pri čemer je vsak dokument dolg vsaj tri stavke. Dokumenti morajo biti v besedilnih datotekah v formatu UTF-8. V naslednjem koraku poskrbimo, da so podatki v priporočenem formatu UTF-8 in da vsak vnos ni večji od 5,000 bajtov.

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)

Podatke nato shranimo v Amazon S3 in hranimo lokalno kopijo v instanci prenosnika.

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

S tem je naša faza obdelave podatkov zaključena.

Zaženite nalogo modeliranja teme Amazon Comprehend

Nato preidemo na naslednjo fazo, kjer uporabimo vnaprej obdelane podatke za izvedbo opravila modeliranja teme z uporabo Amazon Comprehend. Na tej stopnji lahko uporabite drugi zvezek (model_training.ipynb) ali uporabite konzolo Amazon Comprehend za izvajanje opravila modeliranja tem. Za navodila o uporabi konzole glejte Izvajanje opravil analize z uporabo konzole. Če uporabljate prenosni računalnik, lahko začnete z ustvarjanjem odjemalca Amazon Comprehend z uporabo Boto3, kot je prikazano v naslednjem primeru.

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

Svoje dokumente za modeliranje teme lahko predložite na dva načina: en dokument na datoteko ali en dokument na vrstico.

Začnemo s 5 temami (k-število) in uporabimo en dokument na vrstico. Ni enega samega najboljšega načina kot standardne prakse za izbiro k ali števila tem. Lahko preizkusite različne vrednosti k in izberete tisto, ki ima največjo verjetnost.

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

Naše delo modeliranja teme Amazon Comprehend zahteva, da opravite InputDataConfig slovarski objekt s S3, InputFormatin DocumentReadAction kot zahtevane parametre. Podobno morate zagotoviti OutputDataConfig objekt s S3 in DataAccessRoleArn kot zahtevane parametre. Za več informacij glejte dokumentacijo Boto3 za 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,
}

Nato lahko zaženete asinhrono opravilo zaznavanja tem, tako da posredujete število tem, vhodni konfiguracijski objekt, izhodni konfiguracijski objekt in vlogo IAM, kot je prikazano v naslednjem primeru.

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

Trenutno stanje dela lahko spremljate tako, da pokličete na DescribeTopicDetectionJob delovanje. Status delovnega mesta je lahko eden od naslednjih:

  • PREDLOŽENO – Posel je bil prejet in je v čakalni vrsti za obdelavo
  • IN_PROGRESS – Amazon Comprehend obdeluje opravilo
  • KONČANO – opravilo je bilo uspešno zaključeno in rezultat je na voljo
  • NEUSPEŠNO – opravilo ni dokončano
# 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)

Ko je opravilo uspešno zaključeno, vrne stisnjen arhiv, ki vsebuje dve datoteki: topic-terms.csv in doc-topics.csv. Prva izhodna datoteka, topic-terms.csv, je seznam tem v zbirki. Za vsako temo seznam privzeto vključuje najpogostejše izraze po temah glede na njihovo težo. Druga datoteka, doc-topics.csv, navaja dokumente, povezane s temo, in delež dokumenta, ki se nanaša na temo. Ker smo določili ONE_DOC_PER_LINE prej v input_doc_format spremenljivke, je dokument identificiran z imenom datoteke in številko vrstice, indeksirano z 0, znotraj datoteke. Za več informacij o modeliranju teme glejte Tema modeliranje.
Izhodi Amazon Comprehend so kopirani lokalno za naše naslednje korake.

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

Ker je število tem veliko manjše od besedišča, povezanega z zbirko dokumentov, lahko na predstavitev prostora teme gledamo tudi kot na proces zmanjševanja dimenzij. To prostorsko predstavitev dokumentov lahko uporabite za izvajanje združevanja v gruče. Po drugi strani pa lahko analizirate pogostost besed v vsaki skupini, da določite temo, povezano z vsako skupino. Za to objavo ne izvajamo nobenih drugih tehnik, kot je združevanje v gruče.

Uporabljamo tretji zvezek (topic_mapping_sentiment_generation.ipynb), da bi ugotovili, kako se uporabniki z različnimi demografskimi podatki odzivajo na izdelke, in tudi analizirali združene informacije o afiniteti uporabnikov do določenega izdelka.

Izhode iz prejšnjega zvezka lahko združimo, da dobimo teme in povezane izraze za vsako temo. Vendar pa so teme oštevilčene in jih morda ni mogoče razložiti. Zato raje uporabimo posrednika z dovolj znanja o področju in strokovnega znanja o zadevi, da poimenuje teme tako, da pogleda njihove povezane izraze. Ta postopek lahko obravnavamo kot preslikavo številk tem v imena tem. Vendar pa je treba omeniti, da lahko posamezni seznam izrazov za teme medsebojno vključuje in zato lahko ustvari več preslikav. Človek v zanki bi moral formalizirati preslikave na podlagi konteksta primera uporabe. V nasprotnem primeru lahko vpliva na zmogljivost na nižji stopnji.

Začnemo z deklaracijo spremenljivk. Za vsak pregled je lahko več tem. Preštejemo njihovo pogostost in izberemo največ tri najpogostejše teme. Te teme so navedene kot reprezentativne teme pregleda. Najprej definiramo spremenljivko TOP_TOPICS imeti največje število reprezentativnih tem. Drugič, definiramo in nastavimo vrednosti za language_code spremenljivka za podporo zahtevanega jezikovnega parametra Amazon Comprehend. Končno ustvarjamo topicMaps, ki je slovar, ki preslika številke tem v imena tem.

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

Nato uporabimo datoteko topic-terms.csv, ki jo ustvari Amazon Comprehend, da povežemo edinstvene izraze, povezane z vsako temo. Nato z uporabo slovarja za preslikavo na tej povezavi tema-izraz povežemo edinstvene izraze z imeni tem.

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

To preslikavo izboljša berljivost in razložljivost tem, ki jih ustvari Amazon Comprehend, kot lahko vidimo v naslednjem DataFrame.

Poleg tega začetnim vhodnim podatkom pridružimo številko teme, izraze in imena, kot je prikazano v naslednjih korakih.

To vrne izraze tem in imena, ki ustrezajo vsaki recenziji. Številke tem in izrazi so združeni z vsakim pregledom in nato nadalje združeni nazaj v izvirni DataFrame, ki smo ga shranili v prvi zvezek.

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

Ustvarimo razpoloženje za besedilo ocene z uporabo detect_sentiment. Pregleda besedilo in vrne sklep o prevladujočem občutku (POZITIVNO, NEVTRALNO, MEŠANO ali NEGATIVNO).

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)

Teme in občutki so tesno povezani z ocenami. Ker bomo združevali teme in občutke na ravni izdelka, moramo ustvariti sestavljeni ključ s kombiniranjem tem in občutkov, ki jih ustvari 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']

Nato združimo na ravni izdelka in preštejemo sestavljene ključe za vsak izdelek.

Ta zadnji korak nam pomaga bolje razumeti razdrobljenost mnenj na izdelek in jih kategorizirati glede na temo na združeni način. Upoštevamo lahko na primer vrednosti, prikazane za topicDF DataFrame. Od vseh ocen za prvi izdelek so imele stranke na splošno pozitivne izkušnje glede vračila izdelka, velikosti in udobja. Pri drugem izdelku so imeli kupci večinoma mešane do pozitivne izkušnje z vračilom izdelka in pozitivno izkušnjo z velikostjo izdelka.

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

Najbolj priljubljene teme na izdelek

Naš končni DataFrame je sestavljen iz teh informacij o temi in informacij o razpoloženju, združenih nazaj v končni DataFrame z imenom feedbackTopics ki smo jih shranili na Amazon S3 v našem prvem prenosniku.

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

Uporabite Amazon QuickSight za vizualizacijo podatkov

QuickSight lahko uporabite za vizualizacijo podatkov in ustvarjanje poročil. QuickSight je storitev poslovne inteligence (BI), ki jo lahko uporabite za uporabo podatkov iz številnih različnih virov in izdelavo inteligentnih nadzornih plošč. V tem primeru ustvarimo analizo QuickSight z uporabo končnega nabora podatkov, ki smo ga izdelali, kot je prikazano v naslednjih primerih vizualizacij.

Vizualizacija QuickSight

Če želite izvedeti več o Amazon QuickSight, glejte Kako začeti uporabljati Amazon Quicksight.

Pospravi

Na koncu moramo iz konzole AWS zapreti primerek prenosnika, ki smo ga uporabili v tem poskusu.

zaključek

V tej objavi smo pokazali, kako uporabiti Amazon Comprehend za analizo pregledov izdelkov in iskanje najboljših tem z uporabo modeliranja tem kot tehnike. Modeliranje tem vam omogoča, da pregledate več tem in jih organizirate, razumete in povzamete v velikem obsegu. Hitro in enostavno lahko odkrijete skrite vzorce, ki so prisotni v podatkih, in nato ta vpogled uporabite za sprejemanje odločitev na podlagi podatkov. Modeliranje tem lahko uporabite za reševanje številnih poslovnih težav, kot je samodejno označevanje vstopnic za podporo strankam, usmerjanje pogovorov k pravim skupinam glede na temo, zaznavanje nujnosti prijav podpore, pridobivanje boljših vpogledov iz pogovorov, ustvarjanje načrtov, ki temeljijo na podatkih, ustvarjanje težav -osredotočena vsebina, izboljšanje prodajne strategije in prepoznavanje težav in trenj strank.

To je le nekaj primerov, lahko pa si omislite veliko več poslovnih težav, s katerimi se vsakodnevno soočate v svoji organizaciji, in kako lahko uporabite modeliranje tem z drugimi tehnikami ML, da jih rešite.


O avtorjih

Gurpreet CheemaGurpreet je podatkovni znanstvenik pri AWS Professional Services iz Kanade. Strastno želi pomagati strankam pri inovacijah s tehnologijami strojnega učenja in umetne inteligence, da iz podatkov izkoristijo poslovno vrednost in vpoglede. V prostem času se rada sprehaja po naravi in ​​bere knjige.i

Rushdi ShamsRushdi Shams je podatkovni znanstvenik pri AWS Professional Services, Kanada. Gradi izdelke strojnega učenja za stranke AWS. Rad bere in piše znanstveno fantastiko.

Wrick TalukdarWrick Talukdar je višji arhitekt pri skupini Amazon Comprehend Service. Sodeluje s strankami AWS, da bi jim pomagal sprejeti strojno učenje v velikem obsegu. Poleg dela se ukvarja z branjem in fotografijo.

Časovni žig:

Več od Strojno učenje AWS