AWS Comprehend: Var texten arg eller glad?

10 januari 2019

Snowflake, Matillion och AWS Comprehend hjälper dig analysera texten

Finns det något enkelt sätt att använda sig av AWS tjänster för textanalys och klassificera din data du lagrat i Snowflake? Klart det finns!

I denna bloggpost går vi igenom hur du med hjälp av AWS Comprehend och Matillion kan klassificera dina texter och få veta om de är positiva eller negativa, dvs vilket sentiment de har. Något som är riktigt bra för att t.ex. analysera feedback på ditt företags facebook-sida eller email som skickats till supporten. Eller varför inte analysera chatt-loggar från er kundtjänst för att identifiera kunder som kan vara på väg att lämna.

I ett tidigare blogginlägg tittade vi på hur man i SSIS kunde använda sig av textanalys i Microsoft Azure https://sparks.se/textanalys-med-azure-och-ssis/  Nu ska vi göra samma sak men med hjälp av Matillion, Snowflake och AWS Comprehend. Det gör vi genom att bygga ett flöde i Matillion som tar ut texter från Snowflake skickar dessa till AWS Comprehend och sedan uppdaterar tabellen i Snowflake med sentiment.

För både Snowflake och Matillion, som vi kommer använda i denna bloggpost, finns tidigare inlägg här på bloggen om hur du kommer igång. Även AWS är enkelt att komma igång med. Registrera ett test-konto, om du inte redan har det, på https://aws.amazon.com/free/.

Förberedelser i Matillion

Det första vi måste göra är att se till att vår Matillion-instans har rätt att prata med AWS Comprehend. Det gör vi genom att uppdatera vår säkerhetsgrupp. Så börjar med att gå in i EC2 och på vår maskin gå in på maskinens Security group, i bilden nedan, Matillion ETL for Snowflake-1-34-AutogenByAWS-

 

När vi gått in på den klickar vi på Attach policies.

I sökrutan kan vi sedan välja ComprehendRead och klicka Attach policy. Klart! Nu kan Matillion använda sig av Comprehend.

Förberedelser i Snowflake

I Snowflake har vi förberett ett schema som vi använder i Matillion kallat Dataloads. I detta schema skapar vi nu en tabell för att ha lite data att analysera genom att kopiera Promotion-tabellen från Snowflakes sample-databas.

CREATE TABLE DATALOADS.PUBLIC.PROMOTION AS
Select * from SNOWFLAKE_SAMPLE_DATA.TPCDS_SF10TCL.PROMOTION;

Efter att ha skapat den nya tabellen lägger vi även på en kolumn där vi kommer lagra vårt sentiment vi får fram.

ALTER TABLE DATALOADS.PUBLIC.PROMOTION ADD COLUMN Sentiment VARCHAR(50);

Flödet i Matillion

I Matillion skapar vi två flöden. Först ett orkestreringsflöde enligt nedan som läser ut vår tabell från Snowflake med rader som ännu inte fått något sentiment till en s.k. grid-variabel, dvs en tabell i minnet. Denna skickar vi sedan vidare till en Python-komponent som sedan kör ett dataflöde för att uppdatera vår tabell i Snowflake med sentimenten.

Det andra steget är att använda det uppdaterade datat i grid-variabeln och med ett Transformations-steg uppdatera tabellen i Snowflake.

Python

Själva hjärtat i lösningen är Python-komponenten, ”Läs ut Sentiment” ovan, som kommunicerar med AWS Comprehend. Det gör vi genom att importera Python-biblioteket Boto3 som gör att vi enkelt kan komma åt en rad tjänster inom AWS. Och tack vare att vi tidigare gav Matillion-maskinen access till tjänsten behöver vi inte bry oss om någon krånglig access-hantering med nycklar eller login.

Viktigt för att detta ska fungera är att använda Python2 som språk för vår komponent.

Det som sker i koden nedan är att läsa in vår grid-variabel kallad SentimentData från Matillion. Denna loopar vi och skickar varje text till AWS för klassificering. Svaret, Sentiment, uppdaterar vi sedan varje post med. Observera att vi endast använder Text-strängen i svaret från AWS, dvs Positivt / Negativt, men man får även ett mer detaljerat svar med bl a konfidens som kan användas för att exakt veta hur Comprehend klassat texten.

# import the AWS SDK
import boto3

# Create a client towards the comprehend service
client = boto3.client(’comprehend’, region_name=’eu-central-1′)

# Get the data from the grid variable
array = context.getGridVariable(’SentimentData’)

for data in array:
#print(data)
# Query the comprehend API with the current text
if len(data[0]):
result = client.detect_sentiment(Text=data[0], LanguageCode=’en’)
# set the sentiment to the current row
data[1] = result[’Sentiment’]
#print(data)

context.updateGridVariable(’SentimentData’, array)

Koden ovan är förenklad då man kan bygga den mer prestandaoptimerad genom att batcha klassificerings-körningen mot AWS istället för som ovan en rad i taget. Vi har även hårdkodat engelska som ses i koden ovan, detta kan man dock med funktionen Language Detection ta reda på och sedan använda som input. Vill man analysera fler språk som t ex svenska kan man först använda Language Detection, därefter tjänsten AWS Translate innan men ropar på Comprehend.

 Dags att testa flödet

Innan vi kör kan vi se att inga poster i vår tabell i Snowflake har något värde i sentiment-kolumnen, dvs null.

Startar vi nu vårt flöde för de 100 första posterna och sedan tittar igen kan vi se att 100 poster uppdaterats och fått ett värde satt i sentiment-kolumnen.

 

Det var allt för denna gång!

Hoppas du inspirerats till hur du kan få användning av tjänsterna vi gått igenom i bloggposten. Som vanligt är det bara höra av dig till mig eller någon annan av minna kollegor på Sparks om du har några frågor!

Är du intresserad av fler AI- och ML-tjänster från AWS? Läs även blogginlägget om bildigenkänning.