Kaip aš analizavau Habrą, 1 dalis: tendencijos

Kai baigėsi Naujųjų metų Olivier, aš neturėjau ką veikti ir nusprendžiau atsisiųsti visus straipsnius iš Habrahabr (ir susijusių platformų) į savo kompiuterį ir atlikti tam tikrą tyrimą.

Tai pasirodė kelios įdomios istorijos. Pirmasis iš jų yra straipsnių formato ir temų plėtra per 12 svetainės gyvavimo metų. Pavyzdžiui, kai kurių temų dinamika yra gana orientacinė. Tęsinys po pjūviu.

Kaip aš analizavau Habrą, 1 dalis: tendencijos

Analizavimo procesas

Norint suprasti, kaip vystėsi Habras, reikėjo perskaityti visus jo straipsnius ir iš jų išgauti metainformaciją (pavyzdžiui, datas). Apeiti buvo lengva, nes nuorodos į visus straipsnius atrodo taip „habrahabr.ru/post/337722/“, o skaičiai nurodyti griežtai eilės tvarka. Žinodamas, kad paskutinio įrašo skaičius yra šiek tiek mažesnis nei 350 tūkstančių, aš tiesiog perėjau visus galimus dokumentų ID (Python kodas):

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

Funkcija download_document bando įkelti puslapį su atitinkamu id ir bando išgauti prasmingą informaciją iš html struktūros.

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)

Analizuodamas atradau keletą naujų dalykų.

Pirma, jie sako, kad sukurti daugiau procesų nei branduolių procesoriuje yra nenaudinga. Bet mano atveju paaiškėjo, kad ribojantis resursas yra ne procesorius, o tinklas, o 100 procesų veikia greičiau nei 4 ar, tarkime, 20.

Antra, kai kuriuose įrašuose buvo specialiųjų simbolių derinių, pavyzdžiui, eufemizmai, tokie kaip „%&#@“. Paaiškėjo, kad html.parser, kurį panaudojau pirmiausia, reaguoja į derinį &# skausminga, laikant tai html subjekto pradžia. Ketinau atlikti juodąją magiją, bet forume buvo pasiūlyta, kad galėčiau tiesiog pakeisti analizatorių.

Trečia, man pavyko atsisiųsti visus leidinius, išskyrus tris. Mano antivirusinė programa akimirksniu ištrynė dokumentus, kurių numeriai yra 65927, 162075 ir 275987. Tai yra straipsniai atitinkamai apie „Javascript“ grandinę, kuri atsisiunčia kenkėjišką PDF failą, SMS išpirkos reikalaujančią programinę įrangą naršyklėms skirtų papildinių rinkinio pavidalu ir svetainę CrashSafari.com, kuri siunčia „iPhone“ įrenginius paleisti iš naujo. Vėliau, per sistemos nuskaitymą, antivirusinė aptiko kitą straipsnį: paskelbkite 338586 apie scenarijus naminių gyvūnėlių parduotuvės svetainėje, kurie naudoja vartotojo procesorių kriptovaliutai išgauti. Taigi antivirusinės programos darbą galime laikyti pakankamai tinkamu.

Buvo tik pusė galimo „gyvų“ straipsnių maksimumo – 166307 XNUMX vienetai. Apie likusią dalį Habras pateikia parinktis „puslapis pasenęs, buvo ištrintas arba jo visai nebuvo“. Na, visko gali nutikti.

Po straipsnių įkėlimo sekė techninis darbas: pavyzdžiui, publikavimo datas teko konvertuoti iš formato „21 m. gruodžio 2006 d. 10:47“ į standartinį. datetime, o „12,8 tūkst.“ peržiūrų – 12800 65535. Šiame etape įvyko dar keli incidentai. Juokingiausias yra susijęs su balsų skaičiavimu ir duomenų tipais: kai kuriuose senuose pranešimuose buvo perpildyta int, jie gavo XNUMX balsus.

Kaip aš analizavau Habrą, 1 dalis: tendencijos

Dėl to straipsnių tekstai (be paveikslėlių) man užėmė 1.5 gigabaito, komentarai su meta informacija - dar 3, ir apie šimtą megabaitų - metainformacija apie straipsnius. Tai galima visiškai laikyti RAM, o tai man buvo maloni staigmena.

Straipsnius pradėjau analizuoti ne nuo pačių tekstų, o su metainformacija: datomis, žymomis, centrais, peržiūromis ir „patinka“. Paaiškėjo, kad ji taip pat gali daug pasakyti.

Habrahabr plėtros tendencijos

Straipsniai svetainėje publikuojami nuo 2006 m.; intensyviausiai 2008-2016 m.

Kaip aš analizavau Habrą, 1 dalis: tendencijos

Kaip aktyviai šie straipsniai buvo skaitomi skirtingu metu, įvertinti nėra taip paprasta. 2012 m. ir jaunesni tekstai sulaukė aktyvesnių komentarų ir įvertinimų, tačiau naujesni tekstai turi daugiau peržiūrų ir žymių. Šios metrikos taip pat elgėsi (sumažėjo per pusę) tik vieną kartą – 2015 m. Galbūt ekonominės ir politinės krizės situacijoje skaitytojų dėmesys nuo IT tinklaraščių nukrypo į skaudesnes problemas.

Kaip aš analizavau Habrą, 1 dalis: tendencijos

Be pačių straipsnių, atsisiunčiau ir komentarus prie jų. Komentarų buvo 6 mln., tačiau uždrausta 240 tūkst. („atskrido NSO ir paskelbė čia šį užrašą“). Naudinga komentarų savybė yra ta, kad jie turi laiko žymą. Išstudijavę komentarų laiką, galite apytiksliai suprasti, kada straipsniai apskritai skaitomi.

Paaiškėjo, kad dauguma straipsnių rašomi ir komentuojami kažkur nuo 10 iki 20 val., t.y. įprastą Maskvos darbo dieną. Tai gali reikšti, kad Habras skaitomas profesiniais tikslais ir kad tai yra geras būdas atidėlioti darbą. Beje, toks paros laiko pasiskirstymas buvo stabilus nuo pat Habro įkūrimo iki šių dienų.

Kaip aš analizavau Habrą, 1 dalis: tendencijos

Tačiau pagrindinis komentaro laiko žymos pranašumas yra ne paros metas, o straipsnio „aktyvus gyvenimas“. Paskaičiavau, kaip pasiskirstė laikas nuo straipsnio paskelbimo iki jo komentaro. Paaiškėjo, kad dabar mediana komentaras (žalia linija) ateina maždaug po 20 valandų, t.y. Pirmą dieną po publikavimo vidutiniškai paliekama šiek tiek daugiau nei pusė visų straipsnio komentarų. Ir per dvi dienas paliekama 75% visų komentarų. Be to, ankstesni straipsniai buvo skaitomi dar greičiau – pavyzdžiui, 2010 m. pusė komentarų atkeliavo per pirmąsias 6 valandas.

Kaip aš analizavau Habrą, 1 dalis: tendencijos

Man buvo netikėta, kad komentarai pailgėjo: vidutinis simbolių skaičius komentare išaugo beveik dvigubai per Habr!

Kaip aš analizavau Habrą, 1 dalis: tendencijos

Atsiliepimai, kurie yra paprastesni už komentarus, yra balsai. Skirtingai nuo daugelio kitų išteklių, Habré galite įdėti ne tik privalumus, bet ir trūkumus. Tačiau pastarąja galimybe skaitytojai naudojasi ne taip dažnai: šiuo metu nepatinkančių dalis sudaro apie 15% visų atiduotų balsų. Anksčiau jų buvo daugiau, bet laikui bėgant skaitytojai tapo malonesni.

Kaip aš analizavau Habrą, 1 dalis: tendencijos

Laikui bėgant keitėsi ir patys tekstai. Pavyzdžiui, nepaisant krizių, įprastas teksto ilgis nenustojo nuolat augti nuo pat svetainės paleidimo. Per dešimtmetį tekstai tapo kone dešimt kartų ilgesni!

Kaip aš analizavau Habrą, 1 dalis: tendencijos

Keitėsi ir tekstų stilius (pagal pirmąją apytikslę). Pavyzdžiui, pirmaisiais Habro gyvavimo metais išaugo kodo ir skaičių dalis tekstuose:

Kaip aš analizavau Habrą, 1 dalis: tendencijos

Suvokęs bendrą svetainės dinamiką, nusprendžiau pamatuoti, kaip keitėsi įvairių temų populiarumas. Temos iš tekstų gali būti identifikuojamos automatiškai, tačiau pirmiausia negalite išradinėti dviračio iš naujo, o naudoti paruoštas žymas, kurias pridėjo kiekvieno straipsnio autoriai. Diagramoje parodžiau keturias tipines tendencijas. „Google“ tema iš pradžių dominavo (galbūt daugiausia dėl SEO optimizavimo), tačiau kiekvienais metais svoris krito. „Javascript“ buvo populiari tema ir tebėra populiari, tačiau mašininis mokymasis pradėjo sparčiai populiarėti tik pastaraisiais metais. „Linux“ išlieka vienodai aktualus visą dešimtmetį.

Kaip aš analizavau Habrą, 1 dalis: tendencijos

Žinoma, pradėjau domėtis, kokios temos pritraukia daugiau skaitytojų aktyvumo. Apskaičiavau vidutinį kiekvienos temos peržiūrų, balsų ir komentarų skaičių. Štai kas atsitiko:

  • Žiūrimiausios temos: arduino, web dizainas, interneto svetainių kūrimas, santrauka, nuorodos, css, html, html5, nginx, algoritmai.
  • Labiausiai „patinka“ temos: VKontakte, humoras, jquery, opera, c, html, interneto svetainių kūrimas, html5, css, interneto dizainas.
  • Labiausiai aptarinėjamos temos: opera, skype, laisvai samdomas darbas, VKontakte, ubuntu, darbas, nokia, nginx, arduino, firefox.

Beje, kadangi lyginu temas, galiu jas reitinguoti pagal dažnumą (ir palyginti rezultatus su panašus straipsnis iš 2013 m).

  • Habro gyvavimo metais populiariausios žymos (mažėjimo tvarka) buvo google, android, javascript, microsoft, linux, php, apple, java, python, programavimas, paleisties, plėtra, ios, startup, socialiniai tinklai
  • 2017 m. populiariausi buvo javascript, python, java, android, plėtra, linux, c++, programavimas, php, c#, ios, mašininis mokymasis, informacijos sauga, microsoft, react

Lygindami šiuos įvertinimus galite atkreipti dėmesį, pavyzdžiui, į pergalingą Python žygį ir php išnykimą arba startuolių temos „sumažėjimą“ ir mašininio mokymosi iškilimą.

Ne visos Habré žymos turi tokią akivaizdžią teminę spalvą. Štai, pavyzdžiui, keliolika žymų, kurios pasirodė tik vieną kartą, bet man pasirodė juokingos. Taigi: „idėja yra progreso variklis“, „pakrovimas iš diskelio vaizdo“, „Ajovos valstija“, „drama“, „superalesha“, „garų variklis“, „ką veikti šeštadienį“, „aš turėti lapę malūnėlyje“, „ir pasirodė kaip visada“, „negalėjome sugalvoti juokingų etikečių“. Norint nustatyti tokių straipsnių temą, neužtenka žymų – turėsite atlikti temos modeliavimą pagal straipsnių tekstus.

Išsamesnė straipsnių turinio analizė bus kitame įraše. Pirma, aš sukursiu modelį, kuris numatytų, kiek peržiūrų straipsnis sulauks pagal jo turinį. Antra, norėčiau išmokyti neuroninį tinklą generuoti tekstus tokiu pat stiliumi kaip ir Habr autoriai. Taigi prenumeruokite :)

PS Ir štai, įrašyta duomenų rinkinys.

Šaltinis: www.habr.com

Добавить комментарий