
Varje tjÀnst vars anvÀndare kan skapa eget innehÄll (UGC - User-generated content) tvingas inte bara att lösa affÀrsproblem, utan ocksÄ att upprÀtta ordning i UGC. DÄlig eller bristfÀllig moderering av innehÄll kan slutligen minska tjÀnstens attraktivitet för anvÀndarna, Ànda till att den slutar fungera.
Idag ska vi berÀtta om synergierna mellan Jula och Odnoklassniki, som hjÀlper oss att effektivt moderera annonser pÄ Jula.
Synergi Àr överlag en mycket anvÀndbar sak, och i dagens vÀrld, dÀr teknologier och trender förÀndras mycket snabbt, kan den bli en riktig rÀddare i nöden. Varför slösa knappa resurser och tid pÄ att Äteruppfinna det som redan har uppfunnits och finslipats av andra?
SÄ tÀnkte vi ocksÄ, nÀr vi stod inför uppgiften att moderera anvÀndargenererat innehÄll - bilder, texter och lÀnkar. VÄra anvÀndare laddar varje dag upp miljontals enheter av innehÄll pÄ Jula, och utan automatisk behandling Àr det helt orealistiskt att moderera all denna data manuellt.
DÀrför anvÀnde vi en redan fÀrdig modereringsplattform som vÄra kollegor frÄn Odnoklassniki hade finslipat till ett tillstÄnd av "nÀstan perfektion".
Varför Odnoklassniki?
Varje dag kommer tiotals miljoner anvÀndare till det sociala nÀtverket och publicerar miljarder enheter av innehÄll: frÄn fotografier till videor och texter. Modereringsplattformen frÄn Odnoklassniki hjÀlper till att granska mycket stora datamÀngder och motverka spammare och bottar.
Modereringsteamet pÄ OK har samlat pÄ sig mycket stor erfarenhet, eftersom de har utvecklat sitt verktyg i 12 Är. Det Àr viktigt att de inte bara kunde dela med sig av sina fÀrdiga lösningar, utan ocksÄ anpassa arkitekturen pÄ sin plattform för vÄra specifika uppgifter.

För korthetens skull kommer vi hÀrefter att kalla modereringsplattformen frÄn OK helt enkelt "plattformen".
SÄ hÀr Àr det uppbyggt
Mellan Jula och Odnoklassniki Àr datautbytet ordnat via .
Varför vi valde det hÀr verktyget:
- PÄ Jula genomgÄr alla annonser postmoderering, sÄ ett synkront svar behövdes inte frÄn början.
- Om det skulle uppstÄ ett stort problem, och Jula eller Odnoklassniki skulle bli otillgÀngliga, Àven pÄ grund av nÄgon typ av toppbelastning, sÄ kommer datan frÄn Kafka inte att försvinna; den kan senare lÀsas igen.
- Plattformen har redan integrerats med Kafka, sÄ de flesta sÀkerhetsfrÄgorna har lösts.

För varje annons som skapas eller Àndras av anvÀndaren i Jula skapas en JSON med data, som lÀggs i Kafka för efterföljande moderering. FrÄn Kafka laddas annonserna upp till plattformen, dÀr beslut fattas automatiskt eller manuellt. DÄliga annonser blockeras med en angivelse av orsak, medan de annonser som plattformen inte finner nÄgra brott mot reglerna i, mÀrkts som 'bra'. Sedan skickas alla beslut tillbaka till Jula och tillÀmpas i tjÀnsten.
För Jula handlar det helt enkelt om följande ÄtgÀrder: att skicka en annons till plattformen för Odnoklassniki och fÄ tillbaka en resolution om 'okej', eller varför det inte Àr 'okej'.
Automatisk behandling
Vad hÀnder med annonsen efter att den kommit in pÄ plattformen? Varje annons delas upp i flera entiteter:
- titel,
- beskrivning,
- foton,
- vald kategori och underkategori av annonsen,
- pris.

DÀrefter genomför plattformen klustring för varje entitet för att hitta dubbletter. BÄde text och foton klustras enligt olika scheman.
Texten normaliseras före klustring för att ta bort specialtecken, Àndrade bokstÀver och annat skrÀp. De erhÄllna uppgifterna delas upp i N-gram, var och en av dem hashas. I slutÀndan erhÄlls mÄnga unika hashkoder. Likheten mellan texterna berÀknas enligt mellan de tvÄ resulterande mÀngderna. Om likheten överstiger tröskelvÀrdet klistras texterna samman i ett kluster. För att pÄskynda sökningen efter liknande kluster anvÀnds MinHash och lokalt kÀnslig hashing.
För foton har olika alternativ för att slÄ ihop bilder utvecklats, frÄn att jÀmföra pHash av bilder till att söka dubbletter med hjÀlp av neurala nÀtverk.
Den sista metoden Àr den mest 'strÀnga'. För att trÀna modellen valdes sÄdana tredubblar av bilder (N, A, P), dÀr N inte liknar A, medan P liknar A (Àr en halv dubblett). DÀrefter lÀrde sig neurala nÀtverket att A och P skulle vara sÄ nÀra som möjligt, medan A och N skulle vara sÄ lÄngt ifrÄn varandra som möjligt. Detta ger fÀrre falska positiv Àn att bara ta inbÀddningar frÄn ett förtrÀnat nÀtverk.
NÀr neuronnÀtverket fÄr bilder som input, genererar det en N(128)-dimensionell vektor för varje bild och gör en förfrÄgan om att bedöma bildens likhet. DÀrefter berÀknas en tröskel för att avgöra vilka bilder som anses vara dubbletter.
Modellen Àr mÀsterligt bra pÄ att hitta spamare som medvetet fotograferar samma produkt frÄn olika vinklar för att kringgÄ jÀmförelsen med pHash.


Exempel pÄ spam-bilder som kombineras av neuronnÀtverket som dubbletter.
I det slutliga steget söks dubbletter av annonser samtidigt efter text och bild.
Om tvÄ eller fler annonser klumpas ihop i en kluster, startar systemet en automatisk blockering som vÀljer, enligt vissa algoritmer, vilka dubbletter som ska tas bort och vilka som ska behÄllas. Till exempel, om tvÄ anvÀndare har samma bilder i sina annonser, sÄ blockeras den nyare annonsen.
Efter skapandet gÄr alla kluster igenom en rad automatiska filter. Varje filter tilldelar klustret ett antal poÀng (score): hur stor sannolikhet det har att innehÄlla en hot som detta filter upptÀcker.
Till exempel analyserar systemet beskrivningen i annonsen och vÀljer potentiella kategorier för den. Sedan tar det den med den högsta sannolikheten och jÀmför den med kategorin som annonsförfattaren angav. Om de inte matchar blockeras annonsen för fel kategori. Eftersom vi Àr snÀlla och Àrliga, sÀger vi tydligt till anvÀndaren vilken kategori de bör vÀlja för att annonsen ska gÄ igenom moderering.

Meddelande om blockering för fel kategori.
PÄ vÄr plattform trivs maskininlÀrning som fisken i vattnet. Till exempel gör vi det möjligt att söka efter förbjudna varor i titlar och beskrivningar. NeuronnÀtsmodellerna inspekterar kritiskt bilder för att se om det finns nÄgra URL-adresser, spamtexter, telefonnummer och den dÀr förbjudna varan.
För fall dÀr en förbjuden vara försöker sÀljas genom att maskeras som nÄgot lagligt, och det inte finns nÄgon text varken i titeln eller i beskrivningen, anvÀnder vi bildtaggning. För varje bild kan upp till 11 000 olika taggar anges som beskriver vad som finns pÄ bilden.

En vattenpipa försöker sÀljas, maskerad som en samovar.
Parallellt med de komplexa filtren fungerar ocksÄ de enkla som löser uppenbara problem relaterade till texten:
- anti-matter;
- detektor för URL-adresser och telefonnummer;
- nÀmnande av meddelandetjÀnster och andra kontakter;
- lÄgt pris;
- annonser dÀr ingenting sÀljs, osv.
Idag passerar varje annons genom en finmaskig sil av mer Àn 50 automatiska filter som försöker hitta nÄgot dÄligt i annonsen.
Om ingen av detektorerna slÄr till, sÄ skickas ett svar till Yula att annonsen "förmodligen" Àr i full ordning. Detta svar tillÀmpar vi, och anvÀndarna som har följt sÀljaren fÄr en notification om att en ny produkt har kommit.

En notifikation om att sÀljaren har fÄtt en ny produkt.
Som ett resultat "vÀxer" varje annons med metadata, varav en del genereras vid skapandet av annonsen (avsÀndarens IP-adress, user-agent, plattform, geografisk plats osv.), och resten Àr poÀng som ges av varje filter.
Köer av annonser
NÀr en annons kommer in pÄ plattformen placeras den i en av köerna. Varje kö formuleras med hjÀlp av en matematisk formel som kombinerar metadata av annonsen pÄ ett sÀtt för att upptÀcka nÄgot dÄligt mönster.
Till exempel kan man skapa en kö av annonser i kategorin "Mobiltelefoner" frÄn Yula-anvÀndare som pÄstÄs vara frÄn Sankt Petersburg, men vars IP-adresser Àr frÄn Moskva eller andra stÀder.

Exempel pÄ annonser som publicerats av en anvÀndare i olika stÀder.
Eller sÄ kan köer formas baserat pÄ poÀng som neuronnÀtverket tilldelar annonserna i fallande ordning.
Varje kö tilldelar ett slutgiltigt poÀng till annonsen enligt sin formel. DÀrefter kan man handla pÄ olika sÀtt:
- ange en tröskel för nÀr annonsen ska fÄ en viss typ av blockering;
- skicka alla annonser i kön till moderatorerna för manuell granskning;
- eller kombinera de tidigare alternativen: ange en tröskel för automatisk blockering och skicka till moderatorerna de annonser som inte har nÄtt denna tröskel.

Varför behövs dessa köer? Anta att en anvÀndare laddar upp ett foto pÄ ett vapen. NeuralnÀtverket ger det ett poÀng frÄn 95 till 100 och med 99 procents precision identifierar det att bilden förestÀller ett vapen. Men om poÀngen Àr under 95 % börjar modellens precision att sjunka (detta Àr en egenskap hos neuralnÀtmodeller).
Resultatet blir en kö baserad pÄ modellens poÀng, och de annonser som fÄtt mellan 95 och 100 blockeras automatiskt som "Förbjuden vara". Annonser med poÀng under 95 skickas för manuell granskning av moderatorerna.

Choklad Beretta med patroner. Endast för manuell granskning! đ
Manuell granskning
I början av 2019 modererades cirka 94 % av alla annonser pÄ Yula automatiskt.

Om plattformen inte kan avgöra statusen för vissa annonser, skickas de för manuell granskning. Odnoklassniki har utvecklat ett eget verktyg: i uppgifterna för moderatorer visas all nödvĂ€ndig information för att snabbt kunna fatta beslut â om annonsen Ă€r godkĂ€nd eller ska blockeras med en angiven anledning.
För att kvaliteten pĂ„ tjĂ€nsten inte ska försĂ€mras vid manuell granskning, övervakas arbetet löpande. Till exempel visas "fĂ€llor" i streamen av uppgifter â annonser som redan har fĂ€rdiga lösningar. Om moderatorns beslut inte stĂ€mmer överens med den fĂ€rdiga lösningen fĂ„r moderatorn en missrĂ€kning.
I genomsnitt lÀgger en moderator 10 sekunder pÄ att granska en annons. Antalet fel ligger pÄ högst 0,5 % av alla granskade annonser.
Folkmoderation
Kollegor frĂ„n Odnoklassniki gick Ă€nnu lĂ€ngre och anvĂ€nde "folkets hjĂ€lp": de skapade en spelapp för sociala nĂ€tverket dĂ€r man snabbt kan mĂ€rka stora mĂ€ngder data genom att identifiera dĂ„liga kĂ€nnetecken â Moderator Odnoklassniki (). Ett bra sĂ€tt att utnyttja hjĂ€lp frĂ„n anvĂ€ndare av OK, som strĂ€var efter att göra innehĂ„llet trevligare.

Ett spel dÀr anvÀndare markerar foton som innehÄller ett telefonnummer.
Alla annonsköer pÄ plattformen kan omdirigeras till spelet Moderator Okontakt. Allt som markerats av spelets anvÀndare skickas sedan till interna moderatorer för granskning. Denna metod gör det möjligt att blockera annonser dÀr inga filter har skapats Àn, samtidigt som man skapar trÀnings exempel.
Lagring av modereringsresultat
Vi sparar alla beslut som fattas under modereringen för att inte behöva bearbeta annonser som redan har bedömts pÄ nytt.
Det skapas varje dag miljoner kluster för annonser. Med tiden fÄr varje kluster en mÀrkning av "bra" eller "dÄlig". Varje ny annons eller dess redigering som hamnar i ett kluster med en mÀrkning fÄr automatiskt klustrets resolution. Det handlar om cirka 20 000 sÄdana automatiska resolutioner per dag.

Om inga nya annonser kommer till klustret tas det bort frÄn minnet, och dess hash och beslut skrivs in i Apache Cassandra.
NĂ€r plattformen fĂ„r en ny annons försöker den först att hitta ett liknande kluster bland de redan skapade och ta beslutet dĂ€rifrĂ„n. Om det inte finns nĂ„got sĂ„dant kluster gĂ„r plattformen till Cassandra och söker dĂ€r. Hittade den? UtmĂ€rkt, tillĂ€mpar beslutet pĂ„ klustret och skickar det till Yula. Det handlar om i genomsnitt 70 000 sĂ„dana "Ă„terkommande" beslut varje dag â 8 % av det totala antalet.
Sammanfattningsvis
Vi har anvÀnt Moderator Okontakt-plattformen i tvÄ och ett halvt Är. Resultaten gillar vi:
- Vi modererar automatiskt 94 % av alla annonser per dag.
- Kostnaden för att moderera en annons har minskat frÄn 2 rubel till 7 kopejki.
- Tack vare det fÀrdiga verktyget har vi glömt problemet med att hantera moderatorer.
- Vi har ökat antalet manuellt behandlade annonser med 2,5 gÄnger med samma antal moderatorer och budget. Dessutom har kvaliteten pÄ den manuella modereringen ökat tack vare automatiserad kontroll och ligger runt 0,5 % fel.
- Vi tÀcker snabbt nya typer av spam med filter.
- Vi kopplar snabbt nya avdelningar till modereringen . Sedan 2017 har Yula fÄtt vertikaler inom Fastigheter, Lediga platser och Bil.
KĂ€lla: habr.com
