Kako sem razčlenil Habr, 1. del: trendi

Ko je bil novoletni Olivier končan, nisem imel kaj početi in sem se odločil, da vse članke s Habrahabra (in sorodnih platform) prenesem na svoj računalnik in raziščem.

Bilo je kar nekaj zanimivih zgodb. Prvi med njimi je razvoj formata in tem člankov v 12 letih obstoja spletnega mesta. Na primer, dinamika nekaterih tem je precej indikativna. Nadaljevanje - pod rezom.

Kako sem razčlenil Habr, 1. del: trendi

Postopek razčlenjevanja

Da bi razumeli, kako se je Habr razvil, je bilo treba pregledati vse njegove članke in iz njih izluščiti metainformacije (na primer datume). Obvoz je bil enostaven, saj so povezave do vseh člankov videti kot "habrahabr.ru/post/337722/", številke pa so podane strogo po vrstnem redu. Ker vem, da ima zadnja objava številko nekaj manj kot 350 tisoč, sem v zanki pregledal vse možne ID-je dokumenta (koda Python):

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

Funkcija download_document poskuša naložiti stran z ustreznim ID-jem in poskuša pridobiti pomembne informacije iz strukture html.

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)

V procesu razčlenjevanja sem odkril nekaj novih stvari.

Prvič, pravijo, da je ustvarjanje več procesov, kot je jeder v procesorju, neuporabno. Toda v mojem primeru se je izkazalo, da omejevalni vir ni procesor, ampak omrežje, in 100 procesov deluje hitreje kot 4 ali recimo 20.

Drugič, v nekaterih objavah so bile kombinacije posebnih znakov - na primer evfemizmi, kot je "%&#@". Izkazalo se je, da html.parser, ki sem ga uporabil prvi, reagira na kombinacijo &# boleče, saj je to začetek entitete html. Sem se že nameraval ukvarjati s črno magijo, pa so na forumu predlagali, da lahko samo zamenjaš parser.

Tretjič, uspelo mi je raztovoriti vse publikacije, razen treh. Dokumente s številkami 65927, 162075 in 275987 je moj protivirusni program takoj izbrisal. To so članki o verigi javascript, ki prenese zlonamerno datoteko pdf, izsiljevalski programski opremi SMS v obliki nabora vtičnikov brskalnika in o spletnem mestu CrashSafari.com, ki telefone iPhone pošlje v ponovni zagon. Protivirusni program je pozneje, med pregledovanjem sistema, odkril še en članek: objava 338586 o skriptih na spletnem mestu trgovine za male živali, ki uporabljajo procesor uporabnika za rudarjenje kriptovalute. Tako lahko štejemo, da je delo protivirusnega programa povsem ustrezno.

Izkazalo se je, da so "živi" članki le polovica potencialnega maksimuma - 166307 kosov. Za ostalo Habr daje možnosti "stran je zastarela, izbrisana ali sploh ni obstajala." No, vse se lahko zgodi.

Nalaganju člankov je sledilo tehnično delo: na primer datume objav je bilo treba pretvoriti iz zapisa »'21. december 2006 ob 10:47« v standardni datetime, in "12,8k" ogledov - v 12800. Na tej stopnji je prišlo do še nekaj incidentov. Najbolj smešna je povezana s štetjem glasov in vrstami podatkov: nekatere stare objave so imele int overflow in so prejele vsaka 65535 glasov.

Kako sem razčlenil Habr, 1. del: trendi

Posledično so mi besedila člankov (brez slik) vzela 1.5 gigabajta, komentarji z metainformacijami - še 3 in približno sto megabajtov - metainformacije o člankih. To je mogoče v celoti hraniti v RAM-u, kar me je prijetno presenetilo.

Analize člankov nisem začel iz samih besedil, ampak iz metainformacij: datumov, oznak, vozlišč, ogledov in všečkov. Izkazalo se je, da zna povedati marsikaj.

Trendi razvoja Habrahabra

Članki na spletnem mestu so objavljeni od leta 2006; najbolj intenzivno - v letih 2008-2016.

Kako sem razčlenil Habr, 1. del: trendi

Kako aktivno so bili ti članki brani v različnih obdobjih, ni tako enostavno oceniti. Več komentarjev in ocen so dobila besedila letnika 2012 in mlajša, več ogledov in zaznamkov pa imajo novejša besedila. Te metrike so se obnašale enako (prepolovljene) le enkrat, leta 2015. Morda se je v razmerah gospodarske in politične krize pozornost bralcev preusmerila z IT blogov na bolj boleča vprašanja.

Kako sem razčlenil Habr, 1. del: trendi

Poleg samih člankov sem prenesla še komentarje nanje. Bilo je 6 milijonov komentarjev, vendar jih je bilo 240 tisoč prepovedanih ("priletel NLP in objavil ta napis tukaj"). Koristna lastnost komentarjev je, da imajo časovni žig. Če preučite čas komentarjev, lahko približno razumete, kdaj se članki sploh berejo.

Izkazalo se je, da je večina člankov tako napisanih kot komentiranih nekje od 10. do 20. ure, tj. na običajen moskovski delovni dan. To lahko pomeni, da se Habr bere v poklicne namene in da je to dober način za odlašanje pri delu. Mimogrede, ta porazdelitev časa je stabilna od same ustanovitve Habra do danes.

Kako sem razčlenil Habr, 1. del: trendi

Vendar glavna prednost časovnega žiga komentarja ni čas v dnevu, temveč trajanje "aktivnega življenja" članka. Izračunal sem, kako je čas razporejen od objave članka do njegovega komentarja. Izkazalo se je, da zdaj mediana komentarja (zelena črta) pride v približno 20 urah, tj. prvi dan po objavi je v povprečju nekaj več kot polovica vseh komentarjev na članek. In v dveh dneh pustijo 75% vseh komentarjev. Hkrati so bili prejšnji članki prebrani še hitreje - na primer leta 2010 je polovica komentarjev prišla v prvih 6 urah.

Kako sem razčlenil Habr, 1. del: trendi

Presenetilo me je, da so se komentarji podaljšali: povprečno število znakov v komentarju se je v času trajanja Habra skoraj podvojilo!

Kako sem razčlenil Habr, 1. del: trendi

Lažje povratne informacije kot komentarji so glasovi. Za razliko od mnogih drugih virov lahko na Habré postavite ne samo pluse, ampak tudi minuse. Vendar pa bralci zadnje priložnosti ne izkoristijo tako pogosto: trenutni delež nevšečkov je približno 15% vseh oddanih glasov. Včasih jih je bilo več, a sčasoma so bralci postali prijaznejši.

Kako sem razčlenil Habr, 1. del: trendi

Sama besedila so se skozi čas spreminjala. Na primer, tipična dolžina besedila ne neha enakomerno rasti od samega zagona strani, kljub krizam. V desetletju so besedila postala skoraj desetkrat daljša!

Kako sem razčlenil Habr, 1. del: trendi

Spremenil se je tudi slog besedil (v prvem približku). V prvih letih obstoja Habra se je na primer povečal delež kod in številk v besedilih:

Kako sem razčlenil Habr, 1. del: trendi

Ko sem razumel celotno dinamiko spletnega mesta, sem se odločil izmeriti, kako se je spremenila priljubljenost različnih tem. Teme lahko samodejno izberete iz besedil, vendar za začetek ne morete znova izumiti kolesa, ampak uporabite že pripravljene oznake, ki jih pritrdijo avtorji vsakega članka. Na grafikonu sem narisal štiri tipične trende. Tema "Google" je sprva prevladovala (morda predvsem zaradi SEO), vendar je z leti izgubljala težo. Javascript je bil priljubljena tema in še naprej počasi raste, vendar je strojno učenje začelo hitro pridobivati ​​na priljubljenosti šele v zadnjih letih. Po drugi strani pa je Linux skozi desetletje ostal enako pomemben.

Kako sem razčlenil Habr, 1. del: trendi

Seveda me je začelo zanimati, katere teme pritegnejo večjo aktivnost bralcev. Izračunal sem mediano število ogledov, glasov in komentarjev v vsaki temi. Evo, kaj se je zgodilo:

  • Najbolj obiskane teme: arduino, spletno oblikovanje, spletni razvoj, povzetek, povezave, css, html, html5, nginx, algoritmi.
  • Najbolj všečne teme: vkontakte, humor, jquery, opera, c, html, spletni razvoj, html5, css, spletno oblikovanje.
  • Najbolj obravnavane teme: opera, skype, freelance, vkontakte, ubuntu, delo, nokia, nginx, arduino, firefox.

Mimogrede, ker primerjam teme, jih lahko razvrstite po pogostosti (in primerjate rezultate z podoben članek iz leta 2013).

  • Vsa leta obstoja Habra so najbolj priljubljene oznake (v padajočem vrstnem redu) google, android, javascript, microsoft, linux, php, apple, java, python, programiranje, startupi, razvoj, ios, startup, socialna omrežja
  • V letu 2017 so bili najbolj priljubljeni javascript, python, java, android, development, linux, c++, programiranje, php, c#, ios, strojno učenje, informacijska varnost, microsoft, react

Pri primerjavi teh ocen je mogoče biti pozoren na primer na zmagoviti pohod Pythona in izumrtje php-ja ali na "sončni zahod" startup tem in vzpon strojnega učenja.

Vse oznake na Habréju nimajo tako očitne tematske barve. Na primer, tukaj je ducat oznak, ki so se srečale samo enkrat, a so se mi zdele smešne. Torej: "ideja je gibalo napredka", "zagon s slike diskete", "država Iowa", "drama", "superalesh", "parni stroj", "stvari za početi v soboto", "imam lisica v mlinčku za meso«, »a izkazalo se je kot vedno«, »smešnih oznak nismo mogli izmisliti«. Za določitev teme takšnih člankov oznake niso dovolj - na besedilih člankov boste morali izvesti tematsko modeliranje.

Podrobnejša analiza vsebine člankov bo v naslednji objavi. Najprej bom zgradil model, ki predvideva število ogledov strani za članek glede na njegovo vsebino. Drugič, nevronsko mrežo želim naučiti generirati besedila v istem slogu kot avtorji Habra. Torej naročite se 🙂

PS In tukaj je pisk nabor podatkov.

Vir: www.habr.com

Dodaj komentar