Hoe ik Habr ontleed, deel 1: trends

Toen Olivier op het nieuwe jaar klaar was, had ik niets te doen en besloot ik alle artikelen van Habrahabr (en gerelateerde platforms) naar mijn computer te downloaden en te verkennen.

Er waren verschillende interessante verhalen. De eerste daarvan is de ontwikkeling van het formaat en de onderwerpen van artikelen gedurende de 12 jaar van het bestaan ​​van de site. Zo is de dynamiek van sommige onderwerpen vrij indicatief. Vervolg - onder de snit.

Hoe ik Habr ontleed, deel 1: trends

Parseerproces

Om te begrijpen hoe Habr zich ontwikkelde, was het nodig om al zijn artikelen door te nemen en er meta-informatie uit te halen (bijvoorbeeld datums). De omleiding was gemakkelijk, omdat links naar alle artikelen eruitzien als "habrahabr.ru/post/337722/", en de nummers strikt op volgorde worden gegeven. Wetende dat het laatste bericht een nummer heeft van iets minder dan 350 duizend, heb ik zojuist alle mogelijke document-ID's in een lus doorgenomen (Python-code):

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

Functie download_document probeert de pagina met de bijbehorende id te laden en probeert zinvolle informatie uit de html-structuur te halen.

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)

Tijdens het ontleden ontdekte ik verschillende nieuwe dingen.

Ten eerste zeggen ze dat het nutteloos is om meer processen te creëren dan er kernen in de processor zijn. Maar in mijn geval bleek dat de beperkende bron niet de processor is, maar het netwerk, en 100 processen werken sneller dan 4 of bijvoorbeeld 20.

Ten tweede waren er in sommige berichten combinaties van speciale tekens, bijvoorbeeld eufemismen zoals "%&#@". Het bleek dat html.parser, die ik als eerste gebruikte, reageert op de combinatie &# pijnlijk, gezien het het begin van de html-entiteit. Ik ging al zwarte magie doen, maar het forum suggereerde dat je gewoon de parser kunt veranderen.

Ten derde slaagde ik erin alle publicaties uit te laden, behalve drie. Documenten met de nummers 65927, 162075 en 275987 werden onmiddellijk verwijderd door mijn antivirusprogramma. Dit zijn respectievelijk artikelen over een javascript-keten die een kwaadaardige pdf downloadt, sms-ransomware in de vorm van een set browser-plug-ins en de CrashSafari.com-site die iPhones opnieuw opstart. Antivirus ontdekte later, tijdens een systeemscan, een ander artikel: post 338586 over scripts op de website van de dierenwinkel die de processor van de gebruiker gebruiken om cryptocurrency te minen. We kunnen dus aannemen dat het werk van de antivirus behoorlijk toereikend is.

"Live" artikelen bleken slechts de helft van het potentiële maximum te zijn - 166307 stuks. Over de rest geeft Habr opties "de pagina is verouderd, is verwijderd of bestond helemaal niet." Nou, er kan van alles gebeuren.

Na het uploaden van artikelen volgde het technische werk: zo moesten publicatiedata worden omgezet van het formaat "'21 december 2006 om 10:47 uur" naar het standaardformaat datetime, en "12,8k" views - in 12800. In dit stadium kwamen er nog een paar incidenten naar buiten. De grappigste heeft te maken met het aantal stemmen en gegevenstypen: sommige oude berichten hadden een int-overflow en kregen elk 65535 stemmen.

Hoe ik Habr ontleed, deel 1: trends

Als gevolg hiervan kostten de teksten van artikelen (zonder afbeeldingen) me 1.5 gigabyte, opmerkingen met meta-informatie - nog eens 3 en ongeveer honderd megabytes - meta-informatie over artikelen. Dit kan volledig in RAM worden bewaard, wat voor mij een aangename verrassing was.

Ik begon de analyse van artikelen niet vanuit de teksten zelf, maar vanuit meta-informatie: data, tags, hubs, views en likes. Ze bleek veel te kunnen vertellen.

Ontwikkelingstrends van Habrahabr

Artikelen op de site zijn gepubliceerd sinds 2006; meest intensief - in 2008-2016.

Hoe ik Habr ontleed, deel 1: trends

Hoe actief deze artikelen op verschillende tijdstippen werden gelezen, is niet zo eenvoudig te beoordelen. Teksten uit 2012 en jonger kregen meer opmerkingen en beoordelingen, maar nieuwere teksten hebben meer weergaven en bladwijzers. Deze statistieken gedroegen zich slechts één keer op dezelfde manier (gehalveerd), in 2015. Misschien is de aandacht van lezers in een situatie van economische en politieke crisis verschoven van IT-blogs naar meer pijnlijke kwesties.

Hoe ik Habr ontleed, deel 1: trends

Naast de artikelen zelf heb ik er meer opmerkingen over gedownload. Er waren 6 miljoen reacties, maar 240 duizend van hen werden verbannen ("een UFO vloog naar binnen en publiceerde deze inscriptie hier"). Een handige eigenschap van opmerkingen is dat ze een tijdstempel hebben. Door het tijdstip van reacties te bestuderen, kun je grofweg begrijpen wanneer artikelen überhaupt worden gelezen.

Het bleek dat de meeste artikelen ergens tussen 10 uur en 20 uur zijn geschreven en becommentarieerd, d.w.z. op een typische werkdag in Moskou. Dit kan betekenen dat Habr voor professionele doeleinden wordt gelezen en dat dit een goede manier is om uitstelgedrag op het werk te voorkomen. Trouwens, deze verdeling van de tijd van de dag is stabiel vanaf de oprichting van Habr tot op de dag van vandaag.

Hoe ik Habr ontleed, deel 1: trends

Het belangrijkste voordeel van een tijdstempel voor opmerkingen is echter niet het tijdstip van de dag, maar de duur van het "actieve leven" van het artikel. Ik heb berekend hoe de tijd is verdeeld vanaf de publicatie van het artikel tot het commentaar. Het bleek dat nu de gemiddelde opmerking (groene lijn) binnen ongeveer 20 uur komt, d.w.z. op de eerste dag na publicatie is gemiddeld iets meer dan de helft van alle commentaren op het artikel achtergelaten. En in twee dagen laten ze 75% van alle reacties achter. Tegelijkertijd werden eerdere artikelen nog sneller gelezen - in 2010 kwam bijvoorbeeld de helft van de reacties binnen de eerste 6 uur.

Hoe ik Habr ontleed, deel 1: trends

Het kwam als een verrassing voor mij dat de commentaren langer zijn geworden: het gemiddelde aantal karakters in een commentaar is bijna verdubbeld gedurende de levensduur van Habr!

Hoe ik Habr ontleed, deel 1: trends

Gemakkelijker feedback dan opmerkingen zijn stemmen. In tegenstelling tot veel andere bronnen, kun je op Habré niet alleen plussen, maar ook minnen zetten. Lezers maken echter niet zo vaak gebruik van de laatste mogelijkheid: het huidige aandeel antipathieën is ongeveer 15% van alle uitgebrachte stemmen. Vroeger waren er meer, maar na verloop van tijd zijn lezers vriendelijker geworden.

Hoe ik Habr ontleed, deel 1: trends

De teksten zelf zijn in de loop van de tijd veranderd. Zo blijft de typische lengte van de tekst ondanks de crises vanaf de lancering van de site gestaag groeien. In een decennium zijn teksten bijna tien keer langer geworden!

Hoe ik Habr ontleed, deel 1: trends

De stijl van de teksten (naar een eerste benadering) veranderde ook. Tijdens de eerste jaren van het bestaan ​​van Habr nam bijvoorbeeld het aandeel van code en cijfers in teksten toe:

Hoe ik Habr ontleed, deel 1: trends

Nadat ik de algehele dynamiek van de site had begrepen, besloot ik te meten hoe de populariteit van verschillende onderwerpen veranderde. Onderwerpen kunnen automatisch uit teksten worden geselecteerd, maar om te beginnen kunt u niet het wiel opnieuw uitvinden, maar kant-en-klare tags gebruiken die door de auteurs van elk artikel zijn aangebracht. Ik heb vier typische trends op de kaart getekend. Het thema "Google" domineerde aanvankelijk (misschien vooral door SEO), maar is in de loop der jaren aan het afvallen. Javascript is een populair onderwerp en blijft langzaam groeien, maar machine learning wint pas de laatste jaren snel aan populariteit. Linux daarentegen is het hele decennium even relevant gebleven.

Hoe ik Habr ontleed, deel 1: trends

Natuurlijk raakte ik geïnteresseerd in welke onderwerpen meer lezersactiviteit aantrekken. Ik berekende het mediane aantal weergaven, stemmen en opmerkingen in elk onderwerp. Dit is wat er gebeurde:

  • Meest bekeken onderwerpen: arduino, webdesign, webontwikkeling, digest, links, css, html, html5, nginx, algoritmen.
  • De meest "geliefde" onderwerpen: vkontakte, humor, jquery, opera, c, html, webontwikkeling, html5, css, webdesign.
  • De meest besproken onderwerpen: opera, skype, freelance, vkontakte, ubuntu, werk, nokia, nginx, arduino, firefox.

Trouwens, aangezien ik onderwerpen vergelijk, kun je ze rangschikken op frequentie (en de resultaten vergelijken met vergelijkbaar artikel uit 2013).

  • Gedurende al de jaren dat Habr bestaat, zijn de meest populaire tags (in aflopende volgorde) google, android, javascript, microsoft, linux, php, apple, java, python, programmering, startups, ontwikkeling, ios, startup, sociale netwerken
  • In 2017 waren javascript, python, java, android, ontwikkeling, linux, c++, programmeren, php, c#, ios, machine learning, informatiebeveiliging, microsoft, reageren de meest populaire

Bij het vergelijken van deze beoordelingen kan men bijvoorbeeld letten op de zegevierende opmars van Python en het uitsterven van php, of op de "zonsondergang" van startup-onderwerpen en de opkomst van machine learning.

Niet alle tags op Habré hebben zo'n duidelijke thematische kleuring. Hier zijn bijvoorbeeld een tiental tags die elkaar maar één keer hebben ontmoet, maar die me gewoon grappig leken. Dus: "idee is de drijvende kracht achter vooruitgang", "opstarten vanaf een diskette-image", "Iowa State", "drama", "superalesh", "stoommachine", "dingen om te doen op zaterdag", "Ik heb een vos in een vleesmolen", "a het bleek zoals altijd", "we konden geen grappige tags bedenken". Om het onderwerp van dergelijke artikelen te bepalen, zijn tags niet voldoende - u zult thematische modellering moeten uitvoeren op de teksten van de artikelen.

Een meer gedetailleerde analyse van de inhoud van de artikelen volgt in de volgende post. Eerst ga ik een model bouwen dat het aantal paginaweergaven voor een artikel voorspelt op basis van de inhoud ervan. Ten tweede wil ik het neurale netwerk leren om teksten te genereren in dezelfde stijl als de auteurs van Habr. Dus abonneer je 🙂

PS En hier is de pieptoon gegevensset.

Bron: www.habr.com

Voeg een reactie