Kuidas ma Habrit sõelusin, 1. osa: trendid

Kui uusaasta Olivier sai läbi, polnud mul midagi teha ja otsustasin kõik Habrahabri (ja sellega seotud platvormide) artiklid arvutisse alla laadida ja uurida.

Huvitavaid lugusid oli mitu. Esimene neist on artiklite formaadi ja teemade arendamine saidi 12-aastase eksisteerimise jooksul. Näiteks mõne teema dünaamika on üsna indikatiivne. Jätkamine - lõike all.

Kuidas ma Habrit sõelusin, 1. osa: trendid

Parsimise protsess

Et mõista, kuidas Habr arenes, oli vaja läbi vaadata kõik tema artiklid ja ammutada neist metainfot (näiteks kuupäevi). Möödasõit oli lihtne, sest kõikide artiklite lingid näevad välja nagu "habrahabr.ru/post/337722/" ja numbrid on antud rangelt järjekorras. Teades, et viimase postituse number on veidi alla 350 tuhande, vaatasin lihtsalt tsüklina läbi kõik võimalikud dokumendi ID (Pythoni kood):

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

Funktsioon download_document proovib laadida lehte vastava id-ga ja püüab html-i struktuurist sisulist infot välja tõmmata.

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)

Sõelumise käigus avastasin mitmeid uusi asju.

Esiteks ütlevad nad, et rohkemate protsesside loomine, kui protsessoris on tuumasid, on kasutu. Kuid minu puhul selgus, et piirav ressurss ei ole protsessor, vaid võrk ja 100 protsessi töötavad kiiremini kui 4 või näiteks 20.

Teiseks olid mõnes postituses erimärkide kombinatsioonid – näiteks eufemismid nagu "%&#@". Selgus, et html.parser, mida kasutasin esimesena, reageerib kombinatsioonile &# valusalt, pidades seda html-üksuse alguseks. Hakkasin juba musta maagiat tegema, aga foorumis soovitati, et võiks lihtsalt parserit vahetada.

Kolmandaks õnnestus mul maha laadida kõik väljaanded, välja arvatud kolm. Minu viirusetõrje kustutas koheselt dokumendid numbritega 65927, 162075 ja 275987. Need on artiklid vastavalt javascripti keti kohta, mis laadib alla pahatahtliku PDF-faili, SMS-i lunavarast brauseri pistikprogrammide komplekti kujul ja saidi CrashSafari.com kohta, mis saadab iPhone'id taaskäivitama. Viirusetõrje avastas hiljem süsteemikontrolli käigus veel ühe artikli: postitage 338586 lemmikloomapoe veebisaidi skriptide kohta, mis kasutavad krüptovaluuta kaevandamiseks kasutaja protsessorit. Seega võime pidada viirusetõrje töö üsna piisavaks.

"Live" artiklid osutusid vaid pooleks potentsiaalsest maksimumist - 166307 tükki. Ülejäänu kohta annab Habr valikuid "leht on aegunud, kustutatud või seda ei eksisteerinud üldse." No kõike võib juhtuda.

Artiklite üleslaadimisele järgnes tehniline töö: näiteks tuli muuta ilmumiskuupäevad vormingust "'21. detsember 2006 kell 10:47" standardiks. datetime, ja "12,8 12800" vaatamist – aastal 65535. Selles etapis ilmnes veel paar intsidenti. Kõige naljakam puudutab häälte lugemist ja andmetüüpe: mõned vanad postitused olid int overflow'ga ja said igaüks XNUMX häält.

Kuidas ma Habrit sõelusin, 1. osa: trendid

Selle tulemusena võtsid artiklite tekstid (ilma piltideta) mul 1.5 gigabaiti, kommentaarid metainfoga - veel 3 ja umbes sada megabaiti - artiklite metainfot. Seda saab täielikult RAM-is hoida, mis oli minu jaoks meeldiv üllatus.

Alustasin artiklite analüüsi mitte tekstidest endist, vaid metainfost: kuupäevad, sildid, jaoturid, vaated ja meeldimised. Selgus, et ta oskas palju rääkida.

Habrahabri arengusuunad

Artikleid saidil on avaldatud alates 2006. aastast; kõige intensiivsemalt - 2008.-2016.

Kuidas ma Habrit sõelusin, 1. osa: trendid

Kui aktiivselt neid artikleid eri aegadel loeti, pole nii lihtne hinnata. 2012. aasta ja nooremad tekstid said rohkem kommentaare ja hinnanguid, kuid uuematel tekstidel on rohkem vaateid ja järjehoidjaid. Need mõõdikud käitusid samamoodi (poolitatud) vaid korra, 2015. aastal. Võib-olla on majandus- ja poliitilises kriisiolukorras lugejate tähelepanu nihkunud IT-blogidelt valusamatele teemadele.

Kuidas ma Habrit sõelusin, 1. osa: trendid

Lisaks artiklitele endile laadisin neile alla veel kommentaare. Kommentaare oli 6 miljonit, neist 240 tuhat aga keelustati ("lendas sisse UFO ja avaldas selle kirja siin"). Kommentaaride kasulik omadus on see, et neil on ajatempel. Uurides kommenteerimise aega, saab umbkaudu aru, millal artikleid üldse loetakse.

Selgus, et enamik artikleid on nii kirjutatud kui ka kommenteeritud kuskil kella 10-20, st. tavalisel Moskva tööpäeval. See võib tähendada, et Habrit loetakse ametialastel eesmärkidel ja see on hea viis tööga edasi lükata. Muide, selline kellaaja jaotus on stabiilne Habri asutamisest kuni tänapäevani.

Kuidas ma Habrit sõelusin, 1. osa: trendid

Kommentaari ajatempli peamine eelis pole aga kellaaeg, vaid artikli "aktiivse elu" kestus. Arvutasin, kuidas jaotub aeg artikli avaldamisest selle kommenteerimiseni. Selgus, et nüüd tuleb mediaankommentaar (roheline joon) umbes 20 tunni pärast, st. esimesel päeval pärast avaldamist jäetakse artiklile keskmiselt veidi üle poole kõigist kommentaaridest. Ja kahe päeva jooksul jätavad nad 75% kõigist kommentaaridest. Samas loeti varasemaid artikleid veelgi kiiremini - näiteks 2010. aastal tulid pooled kommentaaridest esimese 6 tunniga.

Kuidas ma Habrit sõelusin, 1. osa: trendid

Mulle tuli üllatusena, et kommentaarid on pikenenud: keskmine tähemärkide arv kommentaaris on Habri eluea jooksul peaaegu kahekordistunud!

Kuidas ma Habrit sõelusin, 1. osa: trendid

Lihtsam tagasiside kui kommentaarid on hääled. Erinevalt paljudest teistest ressurssidest saate Habré'le lisada mitte ainult plusse, vaid ka miinuseid. Viimast võimalust lugejad aga nii sageli ei kasuta: praegune mittemeeldimiste osakaal on ligikaudu 15% kõigist antud häältest. Varem oli neid rohkem, kuid aja jooksul on lugejad muutunud lahkemaks.

Kuidas ma Habrit sõelusin, 1. osa: trendid

Tekstid ise on aja jooksul muutunud. Näiteks teksti tüüpiline pikkus ei lakka vaatamata kriisidele pidevalt kasvama saidi käivitamisest alates. Kümnendiga on tekstid muutunud pea kümme korda pikemaks!

Kuidas ma Habrit sõelusin, 1. osa: trendid

Muutus ka tekstide stiil (esimese lähenemise järgi). Habri esimestel eksisteerimisaastatel kasvas näiteks koodi ja numbrite osakaal tekstides:

Kuidas ma Habrit sõelusin, 1. osa: trendid

Olles mõistnud saidi üldist dünaamikat, otsustasin mõõta, kuidas erinevate teemade populaarsus muutus. Teemasid saab tekstide hulgast automaatselt valida, kuid alustuseks ei saa te jalgratast uuesti leiutada, vaid kasutada iga artikli autorite poolt kinnitatud valmis silte. Joonistasin graafikule neli tüüpilist trendi. Algselt domineeris (võib-olla peamiselt SEO tõttu) teema "Google", kuid on aastate jooksul kaalust alla võtnud. Javascript on olnud populaarne teema ja kasvab aeglaselt, kuid masinõpe on hakanud kiiresti populaarsust koguma alles viimastel aastatel. Teisest küljest on Linux kogu kümnendi jooksul olnud sama aktuaalne.

Kuidas ma Habrit sõelusin, 1. osa: trendid

Muidugi hakkas mind huvitama, millised teemad tõmbavad rohkem lugejate aktiivsust. Arvutasin välja iga teema vaatamiste, häälte ja kommentaaride mediaanarvu. See juhtus järgmiselt.

  • Enim vaadatud teemad: arduino, veebidisain, veebiarendus, kokkuvõte, lingid, css, html, html5, nginx, algoritmid.
  • Enim "meeldinud" teemad: vkontakte, huumor, jquery, opera, c, html, veebiarendus, html5, css, veebidisain.
  • Enim arutatud teemad: ooper, skype, vabakutseline, vkontakte, ubuntu, töö, nokia, nginx, arduino, firefox.

Muide, kuna ma võrdlen teemasid, saate neid järjestada sageduse järgi (ja võrrelda tulemusi Sarnane artikkel aastast 2013).

  • Habri kõigi eksisteerimisaastate jooksul on populaarseimad sildid (kahanevas järjekorras) google, android, javascript, microsoft, linux, php, apple, java, python, programmeerimine, käivitamine, arendus, ios, käivitamine, sotsiaalvõrgustikud
  • 2017. aastal olid populaarseimad javascript, python, java, android, arendus, linux, c++, programmeerimine, php, c#, ios, masinõpe, infoturve, microsoft, react

Nende reitingute võrdlemisel võib tähelepanu pöörata näiteks Pythoni võidukale marsile ja php väljasuremisele või startup-teemade "päikeseloojangule" ja masinõppe tõusule.

Kõigil Habré siltidel pole nii ilmset temaatilist värvi. Näiteks siin on kümmekond silti, mis kohtusid vaid korra, kuid tundusid mulle lihtsalt naljakad. Niisiis: "idee on progressi liikumapanev jõud", "käivitamine disketipildilt", "Iowa osariik", "draama", "superalesh", "aurumootor", "asjad, mida laupäeval teha", "mul on rebane hakklihamasinas", "a tuli välja nagu alati", "me ei suutnud naljakaid silte välja mõelda". Selliste artiklite teema kindlaksmääramiseks ei piisa siltidest - peate artiklite tekstide põhjal temaatilise modelleerimise.

Artiklite sisu täpsem analüüs on järgmises postituses. Esiteks koostan mudeli, mis ennustab artikli sisu põhjal lehevaatamiste arvu. Teiseks tahan õpetada närvivõrku genereerima Habri autoritega samas stiilis tekste. Nii et tellige 🙂

PS Ja siin on piiks andmestik.

Allikas: www.habr.com

Lisa kommentaar