Hur jag analyserade Habr, del 1: trender

När nyårs Olivier var klar hade jag inget att göra, och jag bestämde mig för att ladda ner alla artiklar från Habrahabr (och relaterade plattformar) till min dator och utforska.

Det fanns flera intressanta historier. Den första av dem är utvecklingen av formatet och ämnena för artiklar under de 12 åren av webbplatsens existens. Till exempel är dynamiken i vissa ämnen ganska vägledande. Fortsättning - under snittet.

Hur jag analyserade Habr, del 1: trender

Parsingprocess

För att förstå hur Habr utvecklades var det nödvändigt att gå igenom alla hans artiklar och extrahera metainformation från dem (till exempel datum). Förbikopplingen var lätt, eftersom länkar till alla artiklar ser ut som "habrahabr.ru/post/337722/", och siffrorna anges i strikt ordning. Eftersom jag visste att det sista inlägget har ett nummer något mindre än 350 tusen, gick jag precis igenom alla möjliga dokument-id i en loop (Python-kod):

import numpy as np
from multiprocessing import Pool
with Pool(100) as p:
    docs = p.map(download_document, np.arange(350000))

Funktion download_document försöker ladda sidan med motsvarande id och försöker extrahera meningsfull information från html-strukturen.

import requests
from bs4 import BeautifulSoup

def download_document(pid):
    """ Download and process a Habr document and its comments """
    # выгрузка документа
    r = requests.get('https://habrahabr.ru/post/' +str(pid) + '/')
    # парсинг документа
    soup = BeautifulSoup(r.text, 'html5lib') # instead of html.parser
    doc = {}
    doc['id'] = pid
    if not soup.find("span", {"class": "post__title-text"}):
        # такое бывает, если статья не существовала или удалена
        doc['status'] = 'title_not_found'
    else:
        doc['status'] = 'ok'
        doc['title'] = soup.find("span", {"class": "post__title-text"}).text
        doc['text'] = soup.find("div", {"class": "post__text"}).text
        doc['time'] = soup.find("span", {"class": "post__time"}).text
        # create other fields: hubs, tags, views, comments, votes, etc.
        # ...
    # сохранение результата в отдельный файл
    fname = r'files/' + str(pid) + '.pkl'
    with open(fname, 'wb') as f:
        pickle.dump(doc, f)

I processen med att analysera upptäckte jag flera nya saker.

För det första säger de att det är värdelöst att skapa fler processer än det finns kärnor i processorn. Men i mitt fall visade det sig att den begränsande resursen inte är processorn, utan nätverket, och 100 processer fungerar snabbare än 4 eller till exempel 20.

För det andra, i vissa inlägg fanns det kombinationer av specialtecken - till exempel eufemismer som "%&#@". Det visade sig att html.parser, som jag använde först, reagerar på kombinationen &# smärtsamt, med tanke på att det är början på html-entiteten. Jag tänkte redan göra svart magi, men forumet föreslog att du bara kan ändra parsern.

För det tredje lyckades jag ladda ur alla publikationer, utom tre. Dokument numrerade 65927, 162075 och 275987 raderades omedelbart av mitt antivirusprogram. Det här är artiklar, respektive om en javascript-kedja som laddar ner en skadlig pdf, SMS ransomware i form av en uppsättning webbläsarplugins och webbplatsen CrashSafari.com som skickar iPhones till en omstart. Antivirus upptäckte en annan artikel senare, under en systemgenomsökning: post 338586 om skript på djurbutikens webbplats som använder användarens processor för att bryta kryptovaluta. Så vi kan anse att antivirusarbetet är ganska tillräckligt.

"Live"-artiklar visade sig bara vara hälften av det potentiella maximumet - 166307 stycken. Om resten ger Habr alternativ "sidan är föråldrad, har tagits bort eller existerade inte alls." Tja, allt kan hända.

Uppladdningen av artiklar följdes av tekniskt arbete: till exempel måste publiceringsdatum konverteras från formatet "'21 december 2006 kl. 10:47" till standarden datetime, och "12,8k" visningar - år 12800. I det här skedet kom några fler incidenter ut. Det roligaste har med röstantal och datatyper att göra: några gamla inlägg hade en int overflow och fick 65535 röster var.

Hur jag analyserade Habr, del 1: trender

Som ett resultat tog texterna i artiklar (utan bilder) mig 1.5 gigabyte, kommentarer med metainformation - ytterligare 3, och cirka hundra megabyte - metainformation om artiklar. Detta kan hållas helt i RAM, vilket var en trevlig överraskning för mig.

Jag började analysera artiklar inte från själva texterna, utan från metainformation: datum, taggar, nav, vyer och likes. Det visade sig att hon kunde berätta mycket.

Habrahabr utvecklingstrender

Artiklar på sajten har publicerats sedan 2006; mest intensivt - 2008-2016.

Hur jag analyserade Habr, del 1: trender

Hur aktivt dessa artiklar lästes vid olika tidpunkter är inte så lätt att bedöma. Texter från 2012 och yngre fick fler kommentarer och betyg, men nyare texter har fler visningar och bokmärken. Dessa mätvärden fungerade på samma sätt (halverades) bara en gång, 2015. Kanske, i en situation av ekonomisk och politisk kris, har läsarnas uppmärksamhet flyttats från IT-bloggar till mer smärtsamma frågor.

Hur jag analyserade Habr, del 1: trender

Förutom själva artiklarna laddade jag ner fler kommentarer till dem. Det fanns 6 miljoner kommentarer, men 240 tusen av dem förbjöds ("ett UFO flög in och publicerade denna inskription här"). En användbar egenskap hos kommentarer är att de har en tidsstämpel. Genom att studera tidpunkten för kommentarer kan du ungefär förstå när artiklar överhuvudtaget läses.

Det visade sig att de flesta artiklarna både är skrivna och kommenterade någonstans från klockan 10-20, d.v.s. på en typisk arbetsdag i Moskva. Det kan innebära att Habr läses i professionella syften, och att detta är ett bra sätt att skjuta upp på jobbet. Förresten, denna fördelning av tiden på dygnet är stabil från själva grunden av Habr till idag.

Hur jag analyserade Habr, del 1: trender

Den största fördelen med en kommentars tidsstämpel är dock inte tiden på dygnet, utan varaktigheten av artikelns "aktiva liv". Jag räknade ut hur tiden fördelar sig från publiceringen av artikeln till dess kommentar. Det visade sig att nu kommer mediankommentaren (grön linje) om ca 20 timmar, d.v.s. första dagen efter publicering lämnas i genomsnitt lite mer än hälften av alla kommentarer på artikeln. Och på två dagar lämnar de 75 % av alla kommentarer. Samtidigt lästes tidigare artiklar ännu snabbare – till exempel 2010 kom hälften av kommentarerna under de första 6 timmarna.

Hur jag analyserade Habr, del 1: trender

Det kom som en överraskning för mig att kommentarerna har blivit längre: det genomsnittliga antalet tecken i en kommentar har nästan fördubblats under Habrs livstid!

Hur jag analyserade Habr, del 1: trender

Enklare feedback än kommentarer är röster. Till skillnad från många andra resurser kan du på Habré sätta inte bara plus utan också minus. Läsarna använder dock inte sista tillfället så ofta: den nuvarande andelen ogillar är cirka 15 % av alla avgivna röster. Tidigare var det fler, men med tiden har läsarna blivit snällare.

Hur jag analyserade Habr, del 1: trender

Själva texterna har förändrats över tid. Till exempel slutar inte den typiska längden på texten att växa stadigt från själva lanseringen av sajten, trots kriserna. På ett decennium har texter blivit nästan tio gånger längre!

Hur jag analyserade Habr, del 1: trender

Texternas stil (till en första uppskattning) förändrades också. Under de första åren av Habrs existens ökade till exempel andelen kod och siffror i texter:

Hur jag analyserade Habr, del 1: trender

Efter att ha förstått den övergripande dynamiken på webbplatsen bestämde jag mig för att mäta hur populariteten för olika ämnen förändrades. Ämnen kan väljas automatiskt från texter, men till att börja med kan du inte uppfinna hjulet på nytt, utan använda färdiga taggar som fästs av författarna till varje artikel. Jag har ritat fyra typiska trender på diagrammet. "Google"-temat dominerade initialt (kanske främst på grund av SEO), men har gått ner i vikt genom åren. Javascript har varit ett populärt ämne och fortsätter att växa långsamt, men maskininlärning har börjat bli snabbt populär först på senare år. Linux, å andra sidan, har varit lika relevant under hela decenniet.

Hur jag analyserade Habr, del 1: trender

Naturligtvis blev jag intresserad av vilka ämnen som lockar mer läsaraktivitet. Jag beräknade mediantalet för visningar, röster och kommentarer i varje ämne. Här är vad som hände:

  • Mest visade ämnen: arduino, webbdesign, webbutveckling, digest, länkar, css, html, html5, nginx, algoritmer.
  • De mest "gillade" ämnena: vkontakte, humor, jquery, opera, c, html, webbutveckling, html5, css, webbdesign.
  • De mest diskuterade ämnena: opera, skype, frilans, vkontakte, ubuntu, arbete, nokia, nginx, arduino, firefox.

Förresten, eftersom jag jämför ämnen kan du rangordna dem efter frekvens (och jämföra resultaten med liknande artikel från 2013).

  • Under alla år av Habrs existens är de mest populära taggarna (i fallande ordning) google, android, javascript, microsoft, linux, php, apple, java, python, programmering, startups, utveckling, ios, startup, sociala nätverk
  • Under 2017 var de mest populära javascript, python, java, android, utveckling, linux, c++, programmering, php, c#, ios, maskininlärning, informationssäkerhet, microsoft, react

När man jämför dessa betyg kan man till exempel vara uppmärksam på Pythons segrande marsch och php:s utplåning, eller till "solnedgången" för uppstartsämnen och framväxten av maskininlärning.

Alla taggar på Habré har inte en så tydlig tematisk färgsättning. Till exempel, här är ett dussin taggar som bara träffades en gång, men som bara verkade roliga för mig. Så: "idé är drivkraften bakom framsteg", "starta från en diskettavbildning", "Iowa State", "drama", "superalesh", "ångmaskin", "saker att göra på lördag", "Jag har en räv i en köttkvarn", "a det blev som alltid", "vi kunde inte komma på roliga taggar". För att bestämma ämnet för sådana artiklar räcker det inte med taggar - du måste utföra tematisk modellering av artiklarnas texter.

En mer detaljerad analys av innehållet i artiklarna kommer i nästa inlägg. Först ska jag bygga en modell som förutsäger antalet sidvisningar för en artikel baserat på dess innehåll. För det andra vill jag lära det neurala nätverket att generera texter i samma stil som författarna till Habr. Så prenumerera 🙂

PS Och här är pipsignalen dataset.

Källa: will.com

Lägg en kommentar