Eller “ Meget ryddig og avklarende. Den/de ansvarlige for layout og kommunikasjon fortjener en honnør i en eller annen form.”

Det er alltid fint å vite hva brukerne mener om den siste endringen din. Om du har et ønske om å raskt teste ut maskinlæring er sentimentanalyse et flott sted å starte. Sentiment kan defineres som “En oppfatning eller vurdering, oftest bygd på følelse.” Kort sagt:

I denne bloggen går jeg gjennom hva du trenger for å lage en liten enkel modell som kan klassifisere tilbakemeldinger som positive eller negative. Vi snakker altså om utsagn som tittelen på posten, eller som dette

  • “Alt for mye dill dall, og tullete skrift. Er tydeligvis en data-fjortis tekno frik som har designet dette.. Med ingen omtanke for at ikke alle er like data-intreserte.”
  • “Den ser moderne ut, og jeg setter pris på de dype følelsene designet viser.”

Det finnes mange grunner til at det er viktig å kunne avgjøre stemningen i henvendelser fra kunder. Blant annet

  • Generell markedsmessig overvåkning, billig form for KTI
  • Oppdage mulig kundefrafall (churn), sentiment er en meget sterk indikator
  • Sortere henvendelser for å svare eller behandle i riktig rekkefølge

Det er svært sjelden en tilbakemelding er nøytral, så for å forenkle problemet kommer vi bare til å klassifisere tilbakemeldingen som enten positiv eller negativ.


Data
Det første vi trenger er treningsdata. Du trenger ikke så mye for å få brukbare resultater. Vi har gjort forsøk med ulike mengder treningsdata, fra 250 til ca 28 000 tilbakemeldinger.

Antall tilbakemelding i treningsgrunnlag langs x-aksen og presisjon (F1-score) på y-aksen

Kurven viser hvor nøyaktig man kan forvente at modellen blir. Som vi ser så får vi rimelig bra resultater allerede ved 500 tilbakemeldinger (i ren tekst snakker vi her om ca 25 kb data, altså ikke det som kan kalles «big data»). Et viktig moment her er at vi kun klassifiserer tilbakemeldingene i positiv og negativ. Presisjonen hadde nok blitt vesentlig dårligere dersom også nøytral skulle vært et alternativ.

Treningssettet er en enkel semikolonseparert tekstfil:

Score;Tilbakemelding
1;Det ble i hvert fall enklere å finne frem til kontoutskriftene!
-1;Den er dårlig
1;Beste bank-appen i Norge

Implementering

Det finnes mange alternativer når det gjelder algoritmer og bibliotek for å løse dette. Vi brukte scikit-learn og en enkel Bag-of-Words modell

Dette er all koden som trengs:

Kode for å trene en enkel sentimentmodell

I praksis er det linje 14–16 som er de viktige;

cv: CountVectorizer gjør både tokenisering og telling av forekomster av ord/grupper av ord.

tfidf: Står for “term-frequency times inverse document-frequency”. Altså viktigheten av ofte forekommende ord tones ned, siden disse bidrar lite til å skille tekstene fra hverandre.

sgd: Stochastic gradient descent classifier. Uten parametere benyttes en lineær SVM (Support Vector Machine). Super til tekstklassifisering der data ofte blir skrinn (dvs enormt mange kombinasjoner som sjelden/aldri forekommer igjen). Store muligheter for tuning.

Vi har brukt en Bag-of-Words modell. Denne modellen har ikke noe forhold til rekkefølgen av ord, den bare teller opp forekomster, og det er for å bøte på dette at vi bruker n-gram i tillegg (n står for antall ord). Du kan tenke deg at det er et glidende vindu over teksten slik at du til enhver tid ser n-ord. Ta disse eksemplene

"Dette likte jeg, det var ikke dårlig""Dette likte jeg ikke, det var dårlig"

To setninger med de samme ordene, men helt ulik betydning. Takket være bruk at n-gram fanger vi opp også betydning som ligger i rekkefølgen/sekvensen ordene står.


Andre kjekke hjelpemidler

ELI5 er et pyton bibliotek for å visualisere ML-modeller. Det støtter flere ML-rammeverk og fungerer utmerket sammen med scikit-learn. ELI5 står for “Explain Like I’m 5”.

Sammen med Jupyter er dette en enkel og bra måte å få innsyn i hvordan modellen presterer og faktisk fungerer.

De viktigste ord og uttrykk som ligger bak selve klassifiseringen

Grønn sone: Viktige ord og uttrykk for klassifiseringen. F.eks er
«bra» viktig for klassifisering av positiv tilbakemelding mens
«dårligere» er viktig for negativ.

Rød sone: Viktige ‘anti-trekk’ for klassifiseringen. Det betyr at
f.eks uttrykket «ikke bedre» teller veldig negativt i det som
likevel er en positiv tilbakemelding

Man kan også få ut dette for den enkelte prediksjon

Her skal man legge merke til at at grønt brukes til det som underbygger konklusjonen og rødt til det som taler mot.

Konklusjonen i dette tilfellet ble negativ (Y=-1)


I teorien skal man få bedre resultater om man har en mer sofistikert representasjon av teksten, mer bestemt word embeddings. Her kan man enten lage sine egne word embeddings (typisk 100 eller 300 dimensjonale vektor representasjoner av hvert ord) eller bruke ferdig genererte word embeddings der kanskje Word2Vec er den mest kjente. Ved å bruke egne word embeddings kom vi opp i 91% accuracy, mens ved bruk av Facebooks fastText fikk vi 94%, altså ikke bedre enn hva den enklere bag-of-words representasjonen ga.​

For bag-of-words ser det ut som man når et slags tak med tanke på presisjon, mens det er rimelig å forvente at word embeddings vil gi enda bedre resultater med mer treningsdata.

En enkel og rask måte å teste ut maskinlæring på, er å lage en sentimentmodell:

  • Trenger lite data
  • Enkel å forstå/verifisere
  • Trenger lite kode
  • Går raskt å trene (bare et par sekunder)

SpareBank 1 Utvikling

Vi jobber med digitale løsninger hos SpareBank 1. Vi liker å skrive om det vi brenner for

Thanks to Anders Gjendem, Inge Johnsen, and Vidar Moe.

Jan Erik Modal

Written by

SpareBank 1 Utvikling

Vi jobber med digitale løsninger hos SpareBank 1. Vi liker å skrive om det vi brenner for