En algoritmstyrd sajt

Anna Viklund
vkmedia-dev
Published in
7 min readSep 4, 2018

På en nyhetssajt utgör startsidan en av de viktigaste delarna. På VK.se, som är vår största nyhetssajt på VK Media, kan drygt 60% av alla artikelvisningar härledas direkt från startsidan. Många av våra läsare besöker startsidan flera gånger om dagen för att få en bild över nyhetsläget. Den utgör en viktig källa till information om aktuella händelser och måste alltid kännas relevant och uppdaterad.

Sedan lång tid tillbaka har våra nyhetssajter på VK Media styrts av redaktörer. Från tidig morgon till sen kväll har dessa personer pusslat med startsidorna och tagit beslut om vilka artiklar som ska visas och i vilken ordning. Som ni kanske förstår var detta ett tidskrävande arbete för redaktörerna och i slutet av 2017 började vi att utforska en ny metod för att styra både startsidor och övriga sidor på våra nyhetssajter. Vi ställde oss frågan om det skulle vara möjligt att låta en algoritm styra våra nyhetsflöden och samtidigt bibehålla relevans, artikelvisningar och antal köp. Det visade sig att svaret var ja! I det här inlägget kommer vi att berätta om hur vår väg till en algoritmstyrd sajt har sett ut och vilka utmaningar vi har stött på längs vägen.

Vägen från publicering till utritning

Kort sagt kan man säga att algoritmstyrning av en nyhetssajt handlar om att:

  1. Definiera ett antal faktorer som har möjlighet att påverka en artikels placering
  2. Väga samman dessa faktorer på ett sätt för att optimera en rad andra mätbara faktorer
En typisk “artikelpuff” med bild, rubrik och en kort inledande text. Artikelpuffen fungerar som ingång till den faktiska artikeln.

För att förklara mer i detalj hur vi har gjort detta kommer vi stegvis beskriva hur vägen ser ut från att en journalist publicerar en artikel via vårt CMS till att den ritas ut på sajten i form av en så kallad “artikelpuff” (se bild).

I samband med en publicering sätter reportern en rad algoritmparametrar för artikeln. Dessa parametrar bestämmer artikelns initiala placering på sajten.

Steg 1: Artikeln publiceras

Journalisterna skriver idag artiklarna i Wordpress och i samband med en publicering sätts en rad algoritmparametrar (se bild) för artikeln. Dessa parametrar kommer senare användas för att bestämma artikelns initiala placering på sajten.

Parametern Sajtvärde beskriver artikelns “nyhetsvärde” och handlar om hur stor nyheten är och hur många som berörs. Här sätter reportern vanligtvis ett värde mellan 1 och 5. För en liten nyhet där intresset är väldigt lokalt skulle värdet 1 kunna användas, medan en stor nyhet som berör många, till exempel en skogsbrand, skulle kunna få värdet 5. För extrema fall finns även möjlighet att sätta nyhetsvärde 6.

Parametern Livslängd handlar om hur länge nyheten beräknas vara relevant. Granskande reportage kan till exempel vara relevanta under en längre tid, medan ett trafikproblem kanske endast är intressant under en kort period. Livslängden som sätts kommer sedan översättas till 4–48 h.

Parametern Artikeltyp finns tillgänglig för att kunna applicera regler för hur olika typer av artiklar ska kunna placeras på sajten. Vi tillåter till exempel inte artiklar av typen “Opinion” att toppa sajten.

Utöver dessa parametrar finns även en rad andra inställningar, till exempel möjligheten att “nåla fast” en artikel, det vill säga låsa en artikel till toppen av startsidan. Detta är ett sätt att kringgå algoritmen, vilket kan vara nödvändigt om det till exempel rör sig om samhällskritisk information som måste toppa sidan oavsett vad algoritmen tycker.

Steg 2: Data skickas och placeras i kö

När en artikel publiceras, eller om en artikel uppdateras efter publicering, kommer data för motsvarande artikelpuff skickas till en annan liten tjänst som vi har byggt. Denna tjänst har i uppgift att ta emot data, applicera information på mottagen data (till exempel information om vilken typ av ändring det rör sig om) och sedan lägga till data i en meddelandekö (vi använder RabbitMQ, en så kallad work queue som går att läsa mer om här för den som vill). Anledningen till att vi använder en meddelandekö är att vi vill kunna hämta meddelanden ett i taget. Mer om detta i nästa steg!

Steg 3: Algoritmen poängsätter

Nästa steg sker via vår tjänst “Automaten”. Det är här de faktiska besluten tas om hur artiklarna ska placeras på sajten. Automaten hämtar meddelanden från kön, betygsätter artiklarna enligt vår algoritm och sparar sedan sorterade listor med artikeldata baserat på poängsättningen. Anledningen till att vi hämtar data från en meddelandekö är att vi inte vill ta hänsyn till eventuella uppdateringar under en pågående beräkning. Det är helt enkelt en fråga om belastning.

I vår poängberäkning har vi tagit inspiration från hur sidorna Hacker News och Reddit jobbar med algoritmstyrning, men tillämpat många egna regler. De parametrar vi tar hänsyn till är dels de parametrar som reportrarna har satt vi publiceringstillfället (se Steg 1), men också annan data som hör till artikeln, till exempel klick- och köpstatistik. Denna tilläggsdata hämtas från andra system som hanterar realtidsdata. Algoritmen tar också hänsyn till hur länge artikeln har visats på sajten.

Nyhetsvärdet utgör den initiala poängen och över tid kommer poängen minska med en hastighet som beror på hur länge artikeln visats på sajten. Artikelvisningar och köp kan dock generera mer poäng för artikeln. När artikelns livslängd är slut, det vill säga när artikeln funnits på sajten längre än den livslängd som angivits vis publiceringstillfället kan poängen inte längre påverkas och den betraktas som “icke aktiv”. Om en artikel presterar bra kan dess livslängd utökas eftersom placeringen ändå kommer balanseras av poängen.

De sorterade listorna kommer innehålla alla aktiva artiklar sorterade efter poängsättning, följt av icke aktiva artiklar sorterade i kronologisk ordning. Den data vi sparar är både puffdata, till exempel rubrik och bild för artikelpuffen, men även layoutdata. Listorna sparas i en Redis som utgör vårt primära cache-lager. Här finns alltid dom senaste listorna tillgängliga och skulle till exempel Automaten gå ner kommer forfarande vår Redis innehålla data som kan användas för utritning.

Steg 4: Sorterade artikellistor hämtas

När en klient besöker startsidan på VK.se kommer utritningapplikationen begära data från vår “content service”-tjänst. Denna tjänst kommer i första hand att försöka hämta cache:ad data från Redis, alltså hämta de sorterade listorna som Automten sparat (se Steg 3). Skulle Redisen av någon anledning tappa sin data finns möjlighet att hämta data direkt från Wordpress och använda en förenklad algoritm för att bestämma ordningen på artiklarna. Vid lokal utveckling använder vi oftast denna metod.

Administratörer kan se en “algoritmbar” tillsammans med varje artikelpuff.

Steg 5: Artikelpuffen renderas

Dags för utritning! När utritningsapplikationen fått svar från vår “content service”-tjänst kan artikelpuffarna ritas ut på sajten. För inloggade administratörer finns möjlighet att se en “algoritmbar” med siffror som förklarar artiklarnas placering. Här visas antalet sidvisningar per minut, artikelns algoritmpoäng, antalet köp som artikeln genererat, nyhetsvärdet, tid kvar på sajten och totala antalet sidvisningar. Vi tycker att det är viktigt och intressant att hela tiden kunna förstå hur algoritmen fattat sina beslut.

Tankar och reflektioner

Vår automatiseringstjänst har genomgått en rad versioner. Den första versionen gick live vid årsskiftet och vid detta tillfälle var automatiseringen inte en egen tjänst, utan enbart ett utökat steg i vår dataprocessering. Vi kunde redan i detta stadie säkerställa att algoritmen presterade lika bra som den redaktörsstyrda sidan. Vi kunde däremot konstatera att vår lastbalansering försvårade beräkningsarbetet. Vi kör nämligen flera instanser av vårt system för content service och dataprocessering, och vi insåg snabbt att vi inte ville inte ville tillföra mer komplexitet till ett system vars egentliga uppgift är att serva content. Vi bröt därför ut beräkningarna till en egen tjänst och gjorde även denna tjänst mer konfigurerbar. Vi har efter detta kontinuerligt kunnat tweaka algoritmen för att uppnå bästa möjliga resultat.

En utmaning när det gäller algoritmstyrning är just att definiera vad som ska räknas som ett “lyckat” resultat. Vilka mått är är egentligen viktiga? Att optimera en sida enbart med hänsyn till artikelvisningar och köp är enkelt, men på en nyhetsredaktion finns det andra faktorer som kanske är ännu viktigare, men svårare att mäta. Det är viktigt att inte glömma den samhällsfunktion journalistiken fyller och att kunna ta detta i beaktning vid en beräkning. Här har redaktionen lagt ner ett stort arbete kring hur vi ska jobba med parametrar som “Nyhetsvärde” och vi har även fått många bra tips från Svenska Dagbladet som var tidigt ute med algoritmstyrning.

En annan utmaning handlar om att undvika att algoritmen blir självuppfyllande. Låt säga att vår algoritm tar stor hänsyn till artikelvisningar. Då kommer artiklar med högt antal sidvisningar hamna högt upp på sidan, vilket kommer göra att de får större exponering, vilket i sin tur kommer leda till ännu fler sidvisningar och att de ligger kvar högt upp på sidan. Att jobba med algoritmstyrning handlar mycket om att försöka hitta en balans. Vi har kommit en god bit på vägen, men det är ett ständigt pågående arbete. Tur att det är kul!

--

--