Kā es analizēju Habru, 1. daļa: tendences

Kad Jaungada Olivjē bija beidzies, man nebija ko darīt, un es nolēmu lejupielādēt visus rakstus no Habrahabr (un saistītām platformām) savā datorā un izpētīt.

Bija vairāki interesanti stāsti. Pirmais no tiem ir rakstu formāta un tēmu attÄ«stÄ«ba vietnes pastāvÄ“Å”anas 12 gadu laikā. Piemēram, dažu tēmu dinamika ir visai orientējoÅ”a. Turpinājums - zem griezuma.

Kā es analizēju Habru, 1. daļa: tendences

ParsēŔanas process

Lai saprastu, kā attÄ«stÄ«jās Habrs, bija jāizlasa visi viņa raksti un jāizņem no tiem metainformācija (piemēram, datumi). ApvedceļŔ bija viegls, jo saites uz visiem rakstiem izskatās kā "habrahabr.ru/post/337722/", un cipari ir doti stingri secÄ«bā. Zinot, ka pēdējā ierakstā ir skaitlis, kas ir nedaudz mazāks par 350 tÅ«kstoÅ”iem, es tikko cilpā pārbaudÄ«ju visu iespējamo dokumenta ID (Python kods):

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

Funkcija download_document mēģina ielādēt lapu ar atbilstoÅ”o id un mēģina izvilkt jēgpilnu informāciju no html struktÅ«ras.

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)

ParsÄ“Å”anas procesā es atklāju vairākas jaunas lietas.

Pirmkārt, viņi saka, ka ir bezjēdzÄ«gi izveidot vairāk procesu, nekā procesorā ir kodoli. Bet manā gadÄ«jumā izrādÄ«jās, ka ierobežojoÅ”ais resurss ir nevis procesors, bet tÄ«kls, un 100 procesi darbojas ātrāk nekā 4 vai, teiksim, 20.

Otrkārt, dažos ierakstos bija speciālo rakstzÄ«mju kombinācijas, piemēram, eifēmismi, piemēram, "%&#@". IzrādÄ«jās, ka html.parser, ko izmantoju vispirms, reaģē uz kombināciju &# sāpÄ«gi, uzskatot to par html entÄ«tijas sākumu. Es jau grasÄ«jos taisÄ«t melno maÄ£iju, bet forumā tika ieteikts, ka var vienkārÅ”i mainÄ«t parsētāju.

TreÅ”kārt, man izdevās izlādēt visas publikācijas, izņemot trÄ«s. Mans antivÄ«russ uzreiz izdzēsa dokumentus ar numuru 65927, 162075 un 275987. Tie ir attiecÄ«gi raksti par JavaScript ķēdi, kas lejupielādē ļaunprātÄ«gu pdf failu, SMS izspiedējvÄ«rusu pārlÅ«kprogrammas spraudņu kopas veidā un vietni CrashSafari.com, kas nosÅ«ta iPhone tālruņus atsāknÄ“Å”anai. Vēlāk, veicot sistēmas skenÄ“Å”anu, antivÄ«russ atklāja vēl vienu rakstu: ievietojiet 338586 par mājdzÄ«vnieku veikala tÄ«mekļa vietnes skriptiem, kas izmanto lietotāja procesoru, lai iegÅ«tu kriptovalÅ«tu. Tātad mēs varam uzskatÄ«t, ka antivÄ«rusa darbs ir diezgan atbilstoÅ”s.

"Live" raksti izrādījās tikai puse no potenciālā maksimuma - 166307 gab. Par pārējo Habr sniedz opcijas "lapa ir novecojusi, ir izdzēsta vai vispār nepastāvēja". Nu var notikt jebkas.

Pēc rakstu augÅ”upielādes sekoja tehnisks darbs: piemēram, publicÄ“Å”anas datumi bija jāpārveido no formāta "'21 plkst. 2006:10" uz standartu. datetime, un "12,8 k" skatÄ«jumi ā€” 12800. Å ajā posmā atklājās vēl daži incidenti. SmieklÄ«gākais ir saistÄ«ts ar balsu skaitu un datu veidiem: daži veci ieraksti bija pārpildÄ«ti, un katrs saņēma 65535 balsis.

Kā es analizēju Habru, 1. daļa: tendences

Rezultātā rakstu teksti (bez bildēm) man aizņēma 1.5 gigabaitus, komentāri ar metainformāciju - vēl 3 un ap simt megabaitu - metainformācija par rakstiem. Šo var pilnībā paturēt RAM, kas man bija patīkams pārsteigums.

Rakstu analÄ«zi sāku nevis no paÅ”iem tekstiem, bet no metainformācijas: datumiem, tagiem, centriem, skatÄ«jumiem un simpātijām. IzrādÄ«jās, ka viņa var daudz pastāstÄ«t.

Habrahabr attīstības tendences

Raksti vietnē ir publicēti kopÅ” 2006. gada; visintensÄ«vāk - 2008.-2016.g.

Kā es analizēju Habru, 1. daļa: tendences

Cik aktÄ«vi Å”ie raksti tika lasÄ«ti dažādos laikos, nav tik viegli novērtēt. 2012. gada un jaunāki teksti saņēma vairāk komentāru un vērtējumu, bet jaunākiem tekstiem ir vairāk skatÄ«jumu un grāmatzÄ«mju. Å ie rādÄ«tāji darbojās vienādi (samazināti uz pusi) tikai vienu reizi ā€” 2015. gadā. Iespējams, ekonomiskās un politiskās krÄ«zes situācijā lasÄ«tāju uzmanÄ«ba no IT blogiem ir novirzÄ«jusies uz sāpÄ«gākām problēmām.

Kā es analizēju Habru, 1. daļa: tendences

Papildus paÅ”iem rakstiem es lejupielādēju vairāk komentāru tiem. Komentāru bija 6 miljoni, tomēr 240 tÅ«kstoÅ”i no tiem tika aizliegti ("Iellidoja NLO un publicēja Å”o uzrakstu Å”eit"). NoderÄ«ga komentāru Ä«paŔība ir tā, ka tiem ir laika zÄ«mogs. Izpētot komentāru laiku, var aptuveni saprast, kad raksti vispār tiek lasÄ«ti.

IzrādÄ«jās, ka lielākā daļa rakstu ir gan rakstÄ«ti, gan komentēti kaut kur no 10 lÄ«dz 20, t.i. tipiskā Maskavas darba dienā. Tas var nozÄ«mēt, ka Habrs tiek lasÄ«ts profesionāliem nolÅ«kiem, un tas ir labs veids, kā atlikt darbu. Starp citu, Å”is diennakts laika sadalÄ«jums ir stabils no paÅ”iem Habras dibināŔanas lÄ«dz mÅ«sdienām.

Kā es analizēju Habru, 1. daļa: tendences

Taču galvenais komentāra laikspiedola ieguvums ir nevis diennakts laiks, bet gan raksta "aktÄ«vās dzÄ«ves" ilgums. Parēķināju, kā sadalās laiks no raksta publicÄ“Å”anas lÄ«dz tā komentāram. IzrādÄ«jās, ka tagad mediānas komentārs (zaļā lÄ«nija) nāk apmēram pēc 20 stundām, t.i. pirmajā dienā pēc publicÄ“Å”anas rakstam tiek atstāta vidēji nedaudz vairāk kā puse no visiem komentāriem. Un divu dienu laikā viņi atstāj 75% no visiem komentāriem. Tajā paŔā laikā agrākie raksti tika lasÄ«ti vēl ātrāk - piemēram, 2010. gadā puse komentāru nāca pirmajās 6 stundās.

Kā es analizēju Habru, 1. daļa: tendences

Man bija pārsteigums, ka komentāri ir pagarinājuÅ”ies: vidējais rakstzÄ«mju skaits komentārā Habr dzÄ«ves laikā ir gandrÄ«z dubultojies!

Kā es analizēju Habru, 1. daļa: tendences

Vieglāka atsauksme nekā komentāri ir balsoÅ”ana. AtŔķirÄ«bā no daudziem citiem resursiem, vietnē HabrĆ© varat ievietot ne tikai plusus, bet arÄ« mÄ«nusus. Tiesa, pēdējo iespēju lasÄ«tāji neizmanto tik bieži: paÅ”reizējais nepatiku Ä«patsvars ir aptuveni 15% no visām nodotajām balsÄ«m. Kādreiz bija vairāk, bet laika gaitā lasÄ«tāji kļuvuÅ”i laipnāki.

Kā es analizēju Habru, 1. daļa: tendences

PaÅ”i teksti laika gaitā ir mainÄ«juÅ”ies. Piemēram, neraugoties uz krÄ«zēm, teksta tipiskais garums nebeidz nepārtraukti pieaugt no paÅ”as vietnes palaiÅ”anas. Desmitgades laikā teksti ir kļuvuÅ”i gandrÄ«z desmit reizes garāki!

Kā es analizēju Habru, 1. daļa: tendences

MainÄ«jās arÄ« tekstu stils (pirmā aptuvenā veidā). Piemēram, pirmajos Hābra pastāvÄ“Å”anas gados tekstos pieauga koda un skaitļu Ä«patsvars:

Kā es analizēju Habru, 1. daļa: tendences

Pēc vietnes vispārējās dinamikas izpratnes es nolēmu izmērÄ«t, kā mainÄ«jās dažādu tēmu popularitāte. Tēmas var tikt atlasÄ«tas automātiski no tekstiem, taču iesākumam var nevis izgudrot riteni no jauna, bet izmantot jau gatavas birkas, kuras piestiprina katra raksta autori. Diagrammā esmu uzzÄ«mējis četras tipiskas tendences. Sākumā dominēja tēma "Google" (iespējams, galvenokārt SEO dēļ), taču gadu gaitā tā zaudē svaru. Javascript ir bijusi populāra tēma un turpina lēnām augt, taču maŔīnmācÄ«Å”anās ir sākusi strauji iegÅ«t popularitāti tikai pēdējos gados. No otras puses, Linux ir saglabājies vienlÄ«dz aktuāls visas desmitgades laikā.

Kā es analizēju Habru, 1. daļa: tendences

Protams, sāku interesēties, kādas tēmas piesaista lielāku lasītāju aktivitāti. Es aprēķināju vidējo skatījumu, balsojumu un komentāru skaitu katrā tēmā. Lūk, kas notika:

  • SkatÄ«tākās tēmas: arduino, web dizains, tÄ«mekļa izstrāde, Ä«ssavilkums, saites, css, html, html5, nginx, algoritmi.
  • Visvairāk "patÄ«k" tēmas: vkontakte, humors, jquery, opera, c, html, web izstrāde, html5, css, web dizains.
  • Visbiežāk apspriestās tēmas: opera, skype, ārÅ”tata, vkontakte, ubuntu, darbs, nokia, nginx, arduino, firefox.

Starp citu, tā kā es salīdzinu tēmas, varat tās sarindot pēc biežuma (un salīdzināt rezultātus ar līdzīgs raksts no 2013. gada).

  • Visus Habra pastāvÄ“Å”anas gadus populārākie tagi (dilstoŔā secÄ«bā) ir google, android, javascript, microsoft, linux, php, apple, java, python, programmÄ“Å”ana, starta uzņēmumi, izstrāde, ios, startÄ“Å”ana, sociālie tÄ«kli
  • 2017. gadā populārākie bija javascript, python, java, android, izstrāde, linux, c++, programmÄ“Å”ana, php, c#, ios, maŔīnmācÄ«Å”anās, informācijas droŔība, microsoft, react

SalÄ«dzinot Å”os reitingus, var pievērst uzmanÄ«bu, piemēram, Python uzvaras gājienam un php iznÄ«kÅ”anai vai startup tēmu "saulrietam" un maŔīnmācÄ«bas uzplaukumam.

Ne visiem HabrĆ© tagiem ir tik acÄ«mredzams tematiskais krāsojums. Piemēram, Å”eit ir ducis tagu, kas satikās tikai vienu reizi, bet man vienkārÅ”i Ŕķita smieklÄ«gi. Tātad: "ideja ir progresa virzÄ«tājspēks", "sāknÄ“Å”ana no disketes attēla", "Aiovas Å”tats", "drāma", "superaleÅ”s", "tvaika dzinējs", "darbi sestdienā", "man ir lapsa gaļas maŔīnā", "a sanāca kā vienmēr", "nevarējām izdomāt smieklÄ«gas birkas". Lai noteiktu Ŕādu rakstu tēmu, nepietiek ar tagiem - jums bÅ«s jāveic rakstu tekstu tematiskā modelÄ“Å”ana.

SÄ«kāka rakstu satura analÄ«ze bÅ«s nākamajā ierakstā. Pirmkārt, es izveidoÅ”u modeli, kas paredz lapas skatÄ«jumu skaitu rakstam, pamatojoties uz tā saturu. Otrkārt, es vēlos iemācÄ«t neironu tÄ«klam Ä£enerēt tekstus tādā paŔā stilā kā Habr autori. Tāpēc abonējiet šŸ™‚

PS Un Ŕeit ir pīkstiens datu kopa.

Avots: www.habr.com

Pievieno komentāru