Kako sam analizirao Habr, prvi dio: trendovi

Kada je novogodišnji Olivier bio gotov, nisam imao šta da radim i odlučio sam da preuzmem sve članke sa Habrahabra (i srodnih platformi) na svoj računar i istražim.

Bilo je nekoliko zanimljivih priča. Prvi od njih je razvoj formata i tematika članaka tokom 12 godina postojanja sajta. Na primjer, dinamika nekih tema je prilično indikativna. Nastavak - ispod reza.

Kako sam analizirao Habr, prvi dio: trendovi

Proces parsiranja

Da bismo razumjeli kako se Habr razvijao, bilo je potrebno proći kroz sve njegove članke i iz njih izvući meta-informacije (na primjer, datume). Zaobići je bilo lako, jer linkovi na sve članke izgledaju kao "habrahabr.ru/post/337722/", a brojevi su dati striktno redom. Znajući da zadnji post ima broj nešto manji od 350 hiljada, samo sam prošao kroz sve moguće id dokumenta u petlji (Python kod):

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

funkcija download_document pokušava učitati stranicu s odgovarajućim ID-om i pokušava izvući smislene informacije iz html strukture.

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)

U procesu raščlanjivanja otkrio sam nekoliko novih stvari.

Prvo, kažu da je stvaranje više procesa nego što ima jezgri u procesoru beskorisno. Ali u mom slučaju se pokazalo da ograničavajući resurs nije procesor, već mreža, a 100 procesa radi brže od 4 ili, recimo, 20.

Drugo, u nekim objavama su postojale kombinacije specijalnih znakova - na primjer, eufemizmi poput "%&#@". Ispostavilo se da html.parser, koji sam prvi koristio, reagira na kombinaciju &# bolno, smatrajući to početkom html entiteta. Već sam htela da uradim crnu magiju, ali forum je predložio da jednostavno promenite parser.

Treće, uspio sam istovariti sve publikacije, osim tri. Dokumente pod brojevima 65927, 162075 i 275987 je odmah izbrisao moj antivirus. Riječ je o člancima o javascript lancu koji preuzima zlonamjerni pdf, SMS ransomwareu u obliku skupa dodataka za preglednik i CrashSafari.com stranici koja šalje iPhone uređaje u ponovno pokretanje. Antivirus je kasnije, tokom skeniranja sistema, otkrio još jedan članak: objavite 338586 o skriptama na web stranici trgovine za kućne ljubimce koje koriste procesor korisnika za rudarenje kriptovalute. Tako da možemo smatrati da je rad antivirusa sasvim adekvatan.

Ispostavilo se da su "živi" članci samo polovina potencijalnog maksimuma - 166307 komada. Što se ostalog tiče, Habr daje opcije "stranica je zastarjela, obrisana ili uopće nije postojala." Pa, svašta se može dogoditi.

Nakon postavljanja članaka uslijedio je tehnički rad: na primjer, datumi objavljivanja su morali biti konvertirani iz formata "'21. decembar 2006. u 10:47 ujutro" u standardni datetime, i "12,8k" pregleda - u 12800. U ovoj fazi je otkriveno još nekoliko incidenata. Najsmješniji se odnosi na brojanje glasova i tipove podataka: neki stari postovi su imali int overflow i svaki je dobio po 65535 glasova.

Kako sam analizirao Habr, prvi dio: trendovi

Kao rezultat toga, tekstovi članaka (bez slika) su mi uzeli 1.5 gigabajta, komentari sa metainformacijama - još 3, i oko stotinu megabajta - meta-informacije o člancima. Ovo se može u potpunosti držati u RAM-u, što je za mene bilo prijatno iznenađenje.

Analizu članaka nisam započeo od samih tekstova, već od meta-informacija: datuma, oznaka, hubova, pregleda i lajkova. Ispostavilo se da može puno toga reći.

Habrahabrovi trendovi razvoja

Članci na sajtu se objavljuju od 2006. godine; najintenzivnije - u periodu 2008-2016.

Kako sam analizirao Habr, prvi dio: trendovi

Koliko su se ti članci aktivno čitali u različito vrijeme, nije tako lako procijeniti. Tekstovi iz 2012. godine i mlađi dobili su više komentara i ocjena, ali noviji tekstovi imaju više pregleda i oznaka. Ove metrike su se ponašale na isti način (prepolovljene) samo jednom, u 2015. Možda se u situaciji ekonomske i političke krize pažnja čitatelja pomjerila sa IT blogova na bolnije teme.

Kako sam analizirao Habr, prvi dio: trendovi

Osim samih članaka, preuzeo sam još komentara na njih. Bilo je 6 miliona komentara, međutim, 240 hiljada ih je zabranjeno ("NLO je doleteo i objavio ovaj natpis ovde"). Korisno svojstvo komentara je da imaju vremensku oznaku. Proučavanjem vremena komentara možete otprilike shvatiti kada se članci uopće čitaju.

Pokazalo se da je većina članaka i napisana i komentarisana negdje od 10 do 20 sati, tj. tipičnog moskovskog radnog dana. To može značiti da se Habr čita u profesionalne svrhe i da je to dobar način za odugovlačenje na poslu. Inače, ovakva raspodjela doba dana je stabilna od samog osnivanja Habra do danas.

Kako sam analizirao Habr, prvi dio: trendovi

Međutim, glavna prednost vremenske oznake komentara nije doba dana, već trajanje "aktivnog života" članka. Izračunao sam kako je raspoređeno vrijeme od objavljivanja članka do njegovog komentara. Ispostavilo se da sada srednji komentar (zelena linija) dolazi za oko 20 sati, tj. prvog dana nakon objavljivanja u prosjeku se ostavi nešto više od polovine svih komentara na članak. I za dva dana ostave 75% svih komentara. Istovremeno, raniji članci su čitani još brže - na primjer, 2010. godine polovina komentara dolazila je u prvih 6 sati.

Kako sam analizirao Habr, prvi dio: trendovi

Iznenadilo me je da su se komentari produžili: prosječan broj znakova u komentaru se skoro udvostručio tokom trajanja Habra!

Kako sam analizirao Habr, prvi dio: trendovi

Glasovi su lakše povratne informacije od komentara. Za razliku od mnogih drugih resursa, na Habréu možete staviti ne samo pluseve, već i minuse. Međutim, čitaoci ne koriste tako često posljednju priliku: trenutni udio dislajkova je oko 15% svih datih glasova. Nekada ih je bilo više, ali vremenom su čitaoci postali ljubazniji.

Kako sam analizirao Habr, prvi dio: trendovi

Sami tekstovi su se vremenom mijenjali. Na primjer, tipična dužina teksta ne prestaje stalno rasti od samog pokretanja stranice, uprkos krizama. Za jednu deceniju tekstovi su postali skoro deset puta duži!

Kako sam analizirao Habr, prvi dio: trendovi

Promijenjen je i stil tekstova (u prvoj aproksimaciji). U prvim godinama postojanja Habra, na primjer, povećao se udio koda i brojeva u tekstovima:

Kako sam analizirao Habr, prvi dio: trendovi

Nakon što sam shvatio ukupnu dinamiku stranice, odlučio sam izmjeriti kako se promijenila popularnost različitih tema. Teme se mogu automatski birati iz tekstova, ali za početak, ne možete ponovo izmisliti točak, već koristiti gotove oznake koje postavljaju autori svakog članka. Nacrtao sam četiri tipična trenda na grafikonu. Tema "Google" je u početku dominirala (možda uglavnom zbog SEO-a), ali je gubila na težini tokom godina. Javascript je bio popularna tema i nastavlja polako da raste, ali mašinsko učenje je počelo brzo da dobija na popularnosti tek poslednjih godina. Linux je, s druge strane, ostao jednako relevantan tokom cijele decenije.

Kako sam analizirao Habr, prvi dio: trendovi

Naravno, zainteresovalo me koje teme privlače više čitalačke aktivnosti. Izračunao sam srednji broj pregleda, glasova i komentara u svakoj temi. Evo šta se dogodilo:

  • Najgledanije teme: arduino, web dizajn, web razvoj, sažetak, linkovi, css, html, html5, nginx, algoritmi.
  • Najviše "lajkovane" teme: vkontakte, humor, jquery, opera, c, html, web development, html5, css, web dizajn.
  • Najzastupljenije teme: opera, skype, freelance, vkontakte, ubuntu, posao, nokia, nginx, arduino, firefox.

Usput, pošto ja poredim teme, možete ih rangirati po učestalosti (i uporediti rezultate sa sličan članak iz 2013).

  • Za sve godine postojanja Habra, najpopularniji tagovi (silaznim redom) su google, android, javascript, microsoft, linux, php, apple, java, python, programiranje, startup, razvoj, ios, startup, društvene mreže
  • U 2017. godini najpopularniji su bili javascript, python, java, android, development, linux, c++, programiranje, php, c#, ios, mašinsko učenje, informaciona bezbednost, microsoft, react

Kada se porede ove ocene, može se obratiti pažnja, na primer, na pobednički pohod Pythona i izumiranje php-a, ili na "zalazak sunca" startup tema i uspon mašinskog učenja.

Nemaju sve oznake na Habréu tako očiglednu tematsku boju. Na primjer, evo desetak tagova koji su se sreli samo jednom, ali su mi se činili smiješnim. Dakle: "ideja je pokretačka snaga napretka", "podizanje sa slike diskete", "država Ajova", "drama", "superaleš", "parna mašina", "stvari koje treba uraditi u subotu", "imam lisica u mašini za mljevenje mesa", "ispalo je kao i uvijek", "nismo mogli smisliti smiješne oznake". Da biste odredili temu takvih članaka, oznake nisu dovoljne - morat ćete provesti tematsko modeliranje na tekstovima članaka.

Detaljnija analiza sadržaja članaka bit će u sljedećem postu. Prvo, napraviću model koji predviđa broj pregleda stranice za članak na osnovu njegovog sadržaja. Drugo, želim da naučim neuronsku mrežu da generiše tekstove u istom stilu kao i autori Habra. Zato se pretplatite 🙂

PS A evo i zvučnog signala skup podataka.

izvor: www.habr.com

Dodajte komentar