Bygg din egen Instagram-upptäcktsmotor: En steg-för-steg-handledning

Är det inte bra hur Instagram's "Explore" -avsnitt visar innehåll som matchar dina intressen? När du öppnar applikationen är innehållet och rekommendationerna som visas nästan alltid relevanta för dina specifika gillar, intressen, anslutningar, etc. Även om det kan vara kul att tro att vi är centrum för Instagram-universum, är verkligheten den personliga, relevanta innehåll är också unikt samlat för 400 miljoner andra människor dagligen. Med 400M aktiva användare och 80M foton publicerade dagligen, hur bestämmer Instagram vad som ska läggas på din utforskningsavdelning? Låt oss utforska de viktigaste faktorerna som Instagram använder för att bestämma poäng för inlägg i din Instagram-tidslinje och utforska avsnittet.

Innan vi kommer in i den nitty-gritty, här är några funktioner som Instagram använder för att bestämma vilket innehåll som ska serveras:

  • Tidpunkt: ju nyare inlägget, desto högre poäng.
  • Engagemang: kan bestämmas av antalet likes, kommentarer och / eller visningar. Om en användare använder ofta vissa taggar, till exempel snowboard, kommer användaren att få fler bilder av snowboard.
  • Tidigare interaktioner: hur ofta du har interagerat med den här användaren tidigare. Ju mer du engagerar dig med vissa användare indikerar hur relevanta deras inlägg är för dig.
  • Affinitet: hur du är släkt med denna person. En vän till en vän, en vän som du inte har anslutit till ännu eller någon du inte känner?

Låt oss nu använda dessa funktioner för att bygga vår egen Instagram-upptäckmotor. För att fråga data från Instagram kommer jag att använda det väldigt coola, men ändå inofficiella, Instagram API skrivet av Pasha Lev. För Mac-användare bör följande komma igång. Alla andra bibliotek är pipinstallerbara och all Python-kod kördes i en Jupyter-anteckningsbok.

Steg 1: Konfigurera Jupyter Notebook och beroende

Kör följande i din terminal för att komma igång:

Kör sedan jupyter anteckningsbok i din terminal, som öppnas i din standardwebbläsare. Jag skulle också rekommendera att du verifierar ditt Instagram-telefonnummer innan du fortsätter. Detta förhindrar några oväntade omdirigeringar.

Nu till de goda sakerna. Låt oss börja med att hitta mitt sociala nätverk och lite grafanalys.

Om allt går bra bör du få en "inloggningssucces!" svar.

Vi kan nu bygga ett riktigt socialt nätverk genom att hitta alla jag följer samt alla de följer. För en snabb introduktion om socialt nätverksanalys och personaliserad personsökare, titta på detta blogginlägg.

Innan vi går in i koden, låt oss ta en titt på min egen profil för att se vad vi försöker analysera.

Som ni ser följer jag 42 personer som betraktas som mitt omedelbara nätverk, vilket inte är för många. Om vi ​​börjar titta på anslutningar i andra graden växer antalet snabbt. I mitt fall, om vi tittar på anslutningar på andra graden, når antalet noder över 24 000. En fin visualisering av detta kan ses i steg 2.

Cool, nu låt oss få det till ett snyggt format Pandas Dataframe.

Steg 2: Nätverksvisualisering (valfritt)

Även om det inte är viktigt att visualisera ditt nätverk för att bygga din egen upptäcktsmotor, är det ganska intressant och kan hjälpa dig med att förstå personliga personsökare. Jag kommer att använda ett av mina nya favoritbibliotek, grafik (kolla in dem någon gång). Men om du inte vill vänta på en API-nyckel (även om jag fick svar från samma dag) finns det många andra bra bibliotek som Lightning och NetworkX.

I det här exemplet kommer jag att visa till src_id och dst_id för att ge mina vänner lite integritet, även om det är ganska roligt att visa användarnamn (vilket är vad koden nedan kommer att göra). Den första grafen visar bara kanter som kommer från mig och filtreras med de inbyggda verktygen i grafik.

Den andra grafen visar allt mitt utökade nätverk.

Är det inte coolt? Du kan redan se ett par intressanta funktioner som de få externa centroiderna och hur de interagerar med resten av mitt sociala nätverk.

Steg 3: Hitta bästa bilder från sociala nätverk

Det är nu dags att ta tag i de senaste bilderna från alla och betygsätta dem efter hur relevanta de är för mig. Eftersom det finns cirka 24 000 noder kan det ta lite tid att ladda ner all data.

Låt oss göra en snabb provkörning av endast de 44 personer jag följer omedelbart för att se till att vi är på rätt väg. Baserat på vad jag trodde kan bestämma den relativa poängen för Instagram-inlägg, måste vi ta antalet gillar, # kommentarer och den tid då fotot togs för alla senaste foton av personer jag följer (i det här exemplet ansåg jag att det var nyligen motsvarande en vecka och klipp av bilder äldre än det). Det skulle också vara bra att ta reda på hur många gånger jag har "gillad" användarens inlägg och hur kopplad den personen är till mig. Allt förutom "hur ansluten" den användaren är för mig är en enkel summa. För att beräkna det "anslutna" stycket använder vi en personlig personsökare. När vi har sammanställt den informationen kan vi definiera ett viktighetsvärde som:

Okej, nu när vi har definierat det, låt oss se hur det fungerar! Jag ber om ursäkt för att det stora antalet kod kommer upp, men oroa dig inte ... det finns en bild av min nya valp i slutet!

Vilket ger mig:

Det här ser verkligen mycket ut som min personliga tidslinje - coolt! Nu när vi vet att vi är på något, låt oss ta itu med upptäcktsavsnittet.

Steg 4: Utöka användarbasen

Vi kan ta samma strategi som tidigare genom att beräkna den relativa poängen för varje foto av vänner till vänner. För att göra detta skulle vi börja med den första sociala grafen som vi beräknade ... men som har över 24K-noder och jag är för lat för att vänta på alla data. Låt oss istället ta bilder av vänner till vänner vars inlägg jag "gillade". Detta minskar antalet noder till drygt 1 500 vilket, beroende på din internethastighet, är den perfekta tiden för en kaffepaus.

Det finns ett par mindre justeringar av ovanstående kod som behövs för att hantera den utökade användarbasen, men de flesta av koden är densamma.

Resultaten slutade med att visa en hel del bilder från National Geographic och Red Bull, som jag för närvarande inte följer, men kanske börjar nu!

Steg 5: Intressebaserad analys

Intressen har ännu inte beaktats ännu. En trevlig aspekt av Instagram är dess rika uppsättning #hashtags som används för att beskriva foton. Låt oss se om vi kan upptäcka mina intressen genom att använda hashtags för foton som jag "gillade" och foton som jag har taggats i. Medan Instagram troligen använder klickdata tillsammans med "liknande" data, har vi inte åtkomst att klicka, så vi kommer att hålla oss med gillar bara.

Vilket ger:

Låt oss nu ta de mest populära bilderna för var och en av dessa taggar:

Nu när vi har den mest populära bilden från varje hashtag-flöde kan vi visa dem.

Låt oss nu kombinera dessa två tekniker.

Steg 6: Sätta samman allt

Du kanske har lagt märke till att jag sparat alla insamlade bilddata till top_graph_img och images_top_tags. Låt oss kombinera dem med en ganska naiv teknik, slumpmässig sampling:

Det är inte för illa! Jag tycker personligen att några av dessa foton är ganska coola, men det kan definitivt vara bättre.

Sätt att förbättra upptäcktsmotorn:

  • Med tillgång till hela den sociala grafen kan vi köra en liknande analys med vikter mellan noder, bestämda av antalet likes och kommentarer.
  • Kombinera klickdata tillsammans med "liknande" data för att dra nytta av implicit feedback och engagemangsmetik. Detta kan vara oerhört användbart för att nedgradera fler inlägg av clickbait-stil som inte har så många gillar och visa intressen hos användare som inte tenderar att "gilla" ofta.
  • Beräkna bildfunktioner med hjälp av convolutional neurala nät. Ta bort de sista täta lagren och beräkna och visa liknande bilder som de som användaren gillade baserat på dessa funktioner. Integrera Facebooks sociala nätverk för att visa bilder av människor du är ansluten till.
  • Använd Matrix Factorization för att se om vi kan rekommendera innehåll. Du kan till och med använda bildfunktioner och hashtags för att konstruera funktionsvektorer för hybridtekniker.
  • Använd naturlig språkbearbetning (NLP) och klusteringstekniker för att hitta liknande hashtags (även sådana med emoji!). Detta ger normalisering av hashtags (cykel vs cykling) och likhetsmetriker (natur vs berg)

Detta är inte alls en uttömmande lista, så om du har några andra idéer, låt mig veta!

För mer information om upptäcktsmotorer, kolla in vår personaliseringssida eller schema en demo för att lära dig mer om Streams personliga flöden.

Lycklig byggnad!

Detta är ett samarbete från teamet på GetStream.io, under ledning av Balazs Horanyi, Data Scientist på GetStream.io. Det ursprungliga blogginlägget finns på https://getstream.io/blog/building-instagram-discovery-engine-step-step-tutorial/.