Da den nyårsaftens oliviesalat var spist, havde jeg ikke noget at lave, og jeg besluttede mig for at downloade alle artikler fra Habr (og beslægtede platforme) til min computer og undersøge dem.
Det resulterede i flere interessante historier. Den første er udviklingen af formatet og emnerne for artiklerne over de 12 år, webstedet har eksisteret. For eksempel er dynamikken i nogle emner temmelig afslørende. Fortsættelse følger.

Parsingprocessen
For at forstå, hvordan Habr har udviklet sig, var jeg nødt til at gå igennem alle dets artikler og indsamle meta-information (for eksempel datoer). Det var nemt at navigere, fordi links til alle artikler har formatet "habrahabr.ru/post/337722/", og numrene tildeles strengt i rækkefølge. Jeg vidste, at den seneste post har et nummer lidt under 350.000, så jeg gik bare igennem alle mulige dokument-id'er med en løkke (kode i Python):
import numpy as np
from multiprocessing import Pool
with Pool(100) as p:
docs = p.map(download_document, np.arange(350000))Funktion download_document forsøger at hente siden med det tilsvarende id og forsøger at udtrække væsentlig information fra HTML-strukturen.
import requests
from bs4 import BeautifulSoup
def download_document(pid):
""" Download og bearbejd et Habr-dokument og dets kommentarer """
# download dokumentet
r = requests.get('https://habrahabr.ru/post/' + str(pid) + '/')
# parse dokumentet
soup = BeautifulSoup(r.text, 'html5lib') # i stedet for html.parser
doc = {}
doc['id'] = pid
if not soup.find("span", {"class": "post__title-text"}):
# dette sker, hvis artiklen ikke eksisterede eller blev slettet
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
# opret andre felter: hubs, tags, visninger, kommentarer, stemmer, osv.
# ...
# gem resultatet i en separat fil
fname = r'files/' + str(pid) + '.pkl'
with open(fname, 'wb') as f:
pickle.dump(doc, f)Under parsingprocessen opdagede jeg flere nye ting.
For det første, siger man, at det er nytteløst at oprette flere processer end kerner i processoren. Men i mit tilfælde viste det sig, at den begrænsende ressource ikke var processoren, men nettet, og 100 processer fungerer hurtigere end 4 eller for den sags skyld 20.
For det andet stødte jeg i nogle indlæg på kombinationer af specialtegn — for eksempel eufemismer som "%&#@". Det viser sig, at html.parser, som jeg brugte i starten, reagerer på kombinationen &# Smerteligt, da det betragtes som begyndelsen på html-entiteten. Jeg var næsten klar til at lave sort magi, men på forumet blev jeg informeret om, at man bare kan ændre parseren.
For det tredje lykkedes det mig at eksportere alle publikationer undtagen tre. Dokumenterne med numrene 65927, 162075 og 275987 blev straks slettet af mit antivirus. Disse artikler handler henholdsvis om en kæde af javascript, der downloader en ondsindet pdf, en SMS-udpresser i form af et sæt browser-plugins, og hjemmesiden CrashSafari.com, som genstarter iPhones. Endnu en artikel, som antivirusprogrammet fandt senere under en systemscan: post 338586 om scripts på en dyrebutikshjemmeside, der bruger brugerens processor til at mine kryptovaluta. Så man kan sige, at antivirusprogrammets arbejde er helt passende.
"Levende" artikler udgjorde kun halvdelen af det potentielle maksimum — 166307 stykker. For de øvrige giver Habr mulighederne "siden er forældet, er blevet slettet eller har aldrig eksisteret". Nå ja, der sker alt.
Efter eksporten af artiklerne fulgte det tekniske arbejde: for eksempel skulle publiceringsdatoer oversættes fra formatet "’21 december 2006 kl. 10:47" til standard datetime, og "12,8k" visninger til 12800. På dette tidspunkt kom der flere små problemer frem. Den sjoveste var relateret til stemmeoptællinger og datatyper: i nogle gamle indlæg skete der et integer overflow, og de fik 65535 stemmer.

Som et resultat fyldte artiklerne (uden billeder) 1,5 gigabyte, kommentarer med metadata fyldte yderligere 3, og omkring hundrede megabyte — metadata om artiklerne. Det kunne nemt holdes i RAM, hvilket var en dejlig overraskelse for mig.
Jeg begyndte at analysere artiklerne ikke med selve teksterne, men med metadata: datoer, tags, hublag, visninger og "likes". Det viste sig, at det også kunne fortælle meget.
Trends i udviklingen af Habrakhabra
Artikler på hjemmesiden er blevet publiceret siden 2006; mest intensivt — fra 2008 til 2016.

Det er ikke så nemt at vurdere, hvor aktivt disse artikler blev læst på forskellige tidspunkter. Tekster fra 2012 og yngre er blevet kommenteret og vurderet mere aktivt, men nyere tekster har flere visninger og gemmelser. Disse målinger opførte sig ens (faldt med det halve) kun én gang, nemlig i 2015. Måske, i en situation med økonomisk og politisk krise, flyttede læsernes opmærksomhed fra it-bloggerne til mere smertefulde spørgsmål.

Udover artiklerne har jeg også hentet kommentarerne til dem. Der var 6 millioner kommentarer, men 240.000 af dem blev blokeret ("et UFO er landet og har offentliggjort denne besked her"). Den nyttige egenskab ved kommentarerne er, at tidspunkterne er angivet. Ved at undersøge tidspunkterne for kommentarerne kan man nogenlunde se, hvornår artiklerne generelt bliver læst.
Det viste sig, at størstedelen af artiklerne bliver skrevet og kommenteret mellem kl. 10 og 20, altså i en typisk arbejdsdag i Moskva. Dette kan betyde, at Habr bliver læst af professionelle årsager, og at det er en god måde at procrastinere på arbejdet. For resten har denne tidsfordeling været stabil siden Habr's grundlæggelse til i dag.

Men den primære fordel ved tidsstemplet på kommentarerne er ikke tidspunktet på dagen, men 'den aktive livstid' for artiklen. Jeg har beregnet, hvordan tiden fra publiceringen af artiklen til dens kommentarer er fordelt. Det viste sig, at den nuværende median for kommentarer (den grønne linje) kommer cirka 20 timer efter publiceringen, altså i de første 24 timer efter publiceringen bliver der i gennemsnit givet lidt mere end halvdelen af alle kommentarer til artiklen. Og inden for 48 timer gives 75% af alle kommentarer. Tidligere læste man artiklerne endnu hurtigere — i 2010 kom halvdelen af kommentarerne allerede inden for de første 6 timer.

Det kom som en overraskelse for mig, at kommentarerne er blevet længere: det gennemsnitlige antal tegn i en kommentar er næsten fordoblet siden Habr's oprettelse!

En enklere måde at give feedback på end kommentarer er stemmer. I modsætning til mange andre ressourcer kan man på Habr ikke kun give positive, men også negative stemmer. Desuden bruges denne mulighed ikke så ofte: den nuværende andel af dislikes udgør cirka 15% af alle afgivne stemmer. Tidligere var det højere, men med tiden er læserne blevet mere venlige.

Teksterne selv har også ændret sig over tid. For eksempel fortsætter den typiske længde af en tekst med at vokse stabilt siden hjemmesidens lancering, på trods af kriserne. I løbet af ti år er teksterne næsten blevet ti gange længere!

Stilen i teksterne (i første omgang) har også ændret sig. I de første år af Habr's eksistens voksede andelen af kode og tal i teksterne:

Efter at have forstået den generelle dynamik på hjemmesiden besluttede jeg mig for at måle, hvordan populariteten af forskellige emner har ændret sig. Emner kan automatisk udtrækkes fra tekster, men for nu kan vi bruge de eksisterende tags, der er givet af forfatterne af hver artikel. Jeg har illustreret fire typiske tendenser i grafen. Emnet "Google" dominerede i starten (måske primært på grund af SEO-optimering), men mistede l постепенно vægt år for år. Javascript var et populært emne og fortsætter med gradvist at være det, mens maskinlæring først begyndte at vinde popularitet hurtigt de senere år. Linux forbliver derimod altid relevant gennem hele årtiet.

Selvfølgelig blev jeg nysgerrig efter, hvilke emner der tiltrækker mest læseraktivitet. Jeg beregnede det mediane antal visninger, stemmer og kommentarer for hvert emne. Her er hvad jeg fandt ud af:
- De mest sete emner: arduino, webdesign, webudvikling, digest, links, css, html, html5, nginx, algoritmer.
- De mest "likebare" emner: vk, humor, jquery, opera, c, html, webudvikling, html5, css, webdesign.
- De mest discutterede emner: opera, skype, freelancing, vk, ubuntu, job, nokia, nginx, arduino, firefox.
Forresten, da jeg sammenligner emner, kan jeg lave en rangordning baseret på hyppigheden (og sammenligne resultaterne med ).
- I løbet af hele Habr's eksistens har de mest populære tags (i faldende rækkefølge) været google, android, javascript, microsoft, linux, php, apple, java, python, programmering, startups, udvikling, ios, startup, sociale netværk.
- I 2017 var de mest populære javascript, python, java, android, udvikling, linux, c++, programmering, php, c#, ios, maskinlæring, informationssikkerhed, microsoft, react.
Når man sammenligner disse ranglister kan man for eksempel observere den sejrende march af Python og udfasningen af php, eller "solnedgangen" for startup-tematikken og stigningen af maskinlæring.
Ikke alle tags på Habr har en så åbenlys tematisk farve. Her er for eksempel et dusin tags, der kun er blevet brugt én gang, men som bare virkede sjove for mig. Så: "idé motor for fremskridt", "start fra billede på diskette", "delstat Iowa", "dramatik", "superalisha", "dampmaskine", "hvad man skal lave på en lørdag", "jeg har en ræv i kødhammeren", "men det blev som sædvanligt", "jeg kunne ikke finde på sjove tags". For at bestemme emnet for sådanne artikler er tags ikke nok - det kræver tematisk modellering af artiklernes tekster.
En mere detaljeret analyse af artikelindholdet vil være i det næste indlæg. For det første planlægger jeg at bygge en model, der forudser antallet af visninger af en artikel baseret på dens indhold. For det andet ønsker jeg at lære neuronet at generere tekster i samme stil som forfatterne på Habr. Så tilmeld dig 🙂
P.S. Her er den censurerede .
Kilde: habr.com
