Det finns saker som AI, machine learning och besläktad teknik gör bra och andra saker som fortfarande har en del att bevisa. Något som funkar bra sedan några år tillbaka är att identifiera oönskad epost. Detta görs med en teknik kallad NLP (Natural Language Processing), alltså att med matematik och algoritmer bearbeta språk på ett automatiskt sätt.
Vad NLP gör bra, ok och mindre bra
Andra saker som NLP är bra på (åtminstone på engelska som språk) är Named Entity Recognition (NER) och parts-of-speech tagging (POS eller POST). NER handlar om att i en textmassa hitta innehåll som omnämnda organisationer och personer. Ett typiskt exempel i det jag läst är “Steve Jobs var VD på Apple Corp under 2010”. I det fallet skulle en lyckosam NER-algoritm hitta att Steve Jobs är en person, att Apple Corp är en organisation och att 2010 har med tid att göra.
POS handlar om att grammatiskt gå igenom en textmassa. Bland annat kan man posta in en text till en POS-algoritm och få tillbaka en lista som anger ord tillsammans med dess ordklass. Exempelvis att ordet allergi är ett substantiv och genom en kombination av NLP-metoder kan man försöka ta reda på vem som har besvär med allergi.
Ganska bra inom NLP
Något som jobbas på men kanske är bara lite bättre än slumpen är sentiment analysis. Det innebär att försöka förstå den känsla eller de åsikter som en text framför och kan handla om att försöka förstå om texten indikerar att någon är förbannad, lycklig, irriterad, nöjd eller liknande.
En annan sak inom NLP som nästan fungerar tillfredsställande är maskinöversättning. De flesta av oss har sett komiska översättningar, inte minst på Facebook med Bings översättningar av vänners statusmeddelanden. Men vill man se hur förvanskat det blir med maskinöversättning är det inte svårare än att anlita Google, Bing eller någon av de andra, skriva en text på svenska och översätta till kinesiska. Sedan tar du det kinesiska och översätter tillbaka till svenska så ser du viskningsleken vid en enkel interaktion. Ofta fungerar det hjälpligt, men inte helt sällan blir innebörden det rakt motsatta.
En ytterligare grej inom NLP som bara nästan fungerar är att extrahera information ur en text. Utan att lägga extremt mycket tid på definitionerna (likt min kära kollega Lars L) så kan man säga att det är skillnad på text, information och kunskap. Ur text kan man i bästa fall finna information och av det kan kunskap skapas. Information Extraction handlar om att med säkerhet utvinna information, att hitta strukturerad information i en ostrukturerad källa. Exempel på sådana ostrukturerade uppgifter i vården är anamnes, det vill säga den sjukdomshistoria som en patient redogör för. Det är text, en berättelse som beskriver något. Den typen av text står i tydlig kontrast till en klassificeringskod som pekar ut en exakt diagnos för patienten. Anamnes kan innehålla samma sak, men strukturen är inte nödvändigtvis där. Utan struktur är det svårt att veta om patienten är glad för att ha blivit frisk från diagnosen, orolig för att drabbas, eller pratar om en närståendes hälsoproblem.
Inte så imponerande (ännu)
Du har säkert inte missat hajpen med chatbottar. Och att varenda framåtlutad organisation numera tänker anlita maskiner till sin kundtjänst. Well, det gjorde SJ redan på 1990-talet och de i min krets av vänner minns det som en enorm frustration över den komplett idiotiska maskinen. Då var komplexiteten begränsad till vilken ort man ville resa till och varje gång behövde man skärpa till sig.
”Nej dumjävel, jag sa BAAASTUTRÄSK!1!”
Interaktion med SJ:s bot på 90-talet.
Numera fungerar detta en hel del bättre, men i ärlighetens namn verkar det fortfarande svårt. Jag övningskörde talstyrning på Microsofts Azure-tjänster för någon vecka sedan. Sittandes på ett kafé och fortfarande lite tät i näsan efter en förkylning skulle jag träna deras AI på min röst. Självklart valde jag frasen “I’m gonna make him an offer he can’t refuse”. Frasen skulle läsas in några gånger. Jag misslyckades fyra gånger på raken att göra mig förstådd trots att tjänsten visste vilken fras jag läste.
Så nej, det funkar inte under rimliga och vardagliga omständigheter. För nog bör dessa saker funka på ens andraspråk, när man är förkyld och i miljöer med bakgrundsljud?
Läraren i den NLP-kurs jag läst på Udemy tog upp att detta är ett problem även för de med engelska som modersmål. Ett komiskt exempel är när frasen “recognize speech” översätts till “wreck a nice beach”. Här uppstår problem inte helt olikt när en AI identifierade en sköldpadda som ett vapen oavsett vilken vinkel den sågs ur.
En annan svår del av NLP är parafrasering och summering. Just summering är något jag och kollegor inom psykiatrin tittat på eftersom journaler för vissa patienter kan vara oerhört långa. Så dels finns behovet av att inom rimlig tid sätta sig in i en patients historia men också summera viktiga livshändelser så man inte missar viktiga detaljer i dokumentationen.
AI:s klassiska ”toy problems”
Många gånger när man närmar sig AI är det naiva eller grovt förenklade problem som löses med hjälp av tekniken. Spam är på sätt och vis ett sådant eftersom konsekvenserna av ett misslyckande är relativt harmlösa. Jämför med om vi misslyckas med en summering av en journal och ofta missar att lyfta fram patienters tidigare suicidförsök.
Vilken pricksäkerhet krävs för att sjösätta en lösning som bygger på AI i din verksamhet?
“Vi slänger lite AI på problemet!”
Vad som vid första anblick verkar vara den där magin många tror och hoppas AI kan bidra med upptäcker jag när jag provkör AdaBoost för att klassificera oönskad epost.
Att skilja önskad från oönskad epost är egentligen ett typiskt sökproblem. Det handlar om att bearbeta texten statistiskt, vilket görs med en formel kallad TF-IDF (term frequency–inverse document frequency).
I ovanstående exempel är pricksäkerheten nästan alltid bättre om man drar nytta av AdaBoost. Men hur hanterar man de fall där algoritmen underpresterar? För att ens veta om det behöver man samköra flera algoritmer samtidigt och låta dem skvallra på varandra.
Projektets datakälla
Då AI-projektet jag är inblandad i delvis har anamnes (typ fritext som beskriver patientens berättelse, fast ofta med en vårdpersons ord) är det av intresse att studera vad NLP kan bidra med. Det vi gör just nu handlar om att med NLP bearbeta anamnes för att försöka matcha den mot ett kodverk vid namn ICPC-2. ICPC-2 används för att beskriva primärvårdens perspektiv på vård och består av 726 definitioner av hälsotillstånd, allt från demens, relationsproblem med barn, till akne.
En (av mig påhittad) anamnes kan se ut så här:
”Haft hosta under den senaste tiden. Är rökare och har känt sig snuvig i faktiskt flera månader och har även misstanke om någon form av allergi”
Om man med hjälp av NLP undersöker en anamnes kan man välja att plocka ut det som är intressant. För att en sån här automatisering ska vara genomförbar i stor skala behöver man tänka på prestanda. Då vi ska försöka matcha mot kodverket ICPC-2 är det bra att göra sig av med ord som aldrig kommer finnas en matchning mellan anamnes och kodverket. Till att börja med kan man ta bort alla stoppord, det vill säga sådant som inte påverkar innehållet. Efter det är det säkert smart att inspektera datakällan och lista de mest vanliga orden för att sedan exkludera dem från användning.
I de stickprov jag gjort inom thorax får jag också uppfattningen att det som beskriver problemet alltid är ett substantiv (anges som NN nedan), men jag har ännu inte bestämt mig om det bara är substantiv som ska matchas mot kodverket. Det krävs en hel del mer utforskande innan den typ av åtgärder kan tas.
Så här blir ovanstående anamnes om jag tar bort stoppord:
(S
haft/NN
hosta/NN
senaste/NN
tiden/NN
rökare/NN
känt/FW
snuvig/NN
faktiskt/NN
flera/NN
månader/NN
även/NNP
misstanke/VBZ
form/NN
allergi/NN)
Det man troligen behöver göra utöver detta är att jobba med stemming, alltså att få ner respektive ord till sin grundform. Detsamma för kodverket så det finns något att matcha mot. Det handlar om att omvandla ord som “allergier” till “allergi”, “snuvig” till “snuva” och så vidare.
Vad detta kan lösa på sikt? Självtriagering över nätet?
I den bästa av världar kan en sån här lösning dels bearbeta anamnes som ens vårdgivare antecknar under ett vårdbesök och ge beslutsstöd. I ett sådant scenario finns en vårdkunnig person som kan avgöra träffsäkerheten i det stöd som erbjuds.
I en förlängning kanske något liknande detta användas för självtriagering över nätet. Triage är för många det första som händer när de kommer till akuten. Erfaren personal gör en bedömning och prioritering av patientens tillstånd.
Nog hade det varit bra om vården blev så pass tillgänglig att man kunde rådgöra med sin klocka om de krämpor man har är illa nog för att åka till akuten, en jourmottagning eller vänta till nästa tid på den vårdcentral där man är listad?
Din klocka, mobil och annan personlig utrustning sitter dessutom på delar av sanningen kring din hälsa. Bland annat hur du rör dig, inte sällan hur du sover (genom interaktion med väckarklockan) och kanske rent utav en del träningsdata.
Du som vill följa den prototypkod vi tar fram i projektet kan kolla in Github-länken nedan. Känns dig varmt välkommen att ha åsikter och inspel.
Mer om AI-projektet och NLP
- Koden för dig som inte räds lite Python: GitHub – marcusosterberg/triage-at-home: ML-testprojekt för att använda NLP-teknik för att klassificera, ge beslutsstöd och erbjuda självtriage på distans
- AdaBoost – Wikipedia
- Part-of-speech tagging – Wikipedia
- Named-entity recognition – Wikipedia
- Sentiment analysis – Wikipedia
- Information extraction – Wikipedia
Sjukt bra och spännande initiativ!! Vore kul att träffas och få veta mer! Ha det så gott!!