Wie ich Habr durchsucht habe, Teil 1: Trends

Als der Neujahrs-Olivier aufgegessen war, hatte ich nichts mehr zu tun, also beschloss ich, mir alle Artikel von Habrhabr (und Àhnlichen Plattformen) auf meinen Computer herunterzuladen und zu erforschen.

Dabei entstanden einige interessante Themen. Eines davon ist die Entwicklung des Formats und der Themen der Artikel ĂŒber 12 Jahre Bestehen der Website. Zum Beispiel ist die Dynamik einiger Themen ziemlich aufschlussreich. Fortsetzung — nach dem Klick.

Wie ich Habr durchsucht habe, Teil 1: Trends

Der Parsing-Prozess

Um zu verstehen, wie Habr sich entwickelt hat, musste ich alle seine Artikel durchgehen und deren Metainformationen (zum Beispiel Daten) extrahieren. Die Durchsicht war einfach, da die Links zu allen Artikeln im Format "habrahabr.ru/post/337722/" vorliegen, wobei die Nummern streng aufeinander folgen. Wenn man weiß, dass der letzte Post eine Nummer knapp unter 350.000 hat, kann man einfach alle möglichen Dokumenten-IDs in einer Schleife durchgehen (Code in Python):

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

Funktion download_document versucht, die Seite mit der entsprechenden ID zu laden und versucht, aus der HTML-Struktur inhaltliche Informationen herauszuziehen.

import requests
from bs4 import BeautifulSoup

def download_document(pid):
    """ Dokument und Kommentare von Habr herunterladen und verarbeiten """
    # Dokument herunterladen
    r = requests.get('https://habrahabr.ru/post/' + str(pid) + '/')
    # Dokument parsen
    soup = BeautifulSoup(r.text, 'html5lib')  # anstelle von html.parser
    doc = {}
    doc['id'] = pid
    if not soup.find("span", {"class": "post__title-text"}):
        # Das kann vorkommen, wenn der Artikel nicht existiert oder gelöscht wurde
        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
        # andere Felder erstellen: Hubs, Tags, Ansichten, Kommentare, Stimmen usw.
        # ...
    # Ergebnis in einer separaten Datei speichern
    fname = r'files/' + str(pid) + '.pkl'
    with open(fname, 'wb') as f:
        pickle.dump(doc, f)

WĂ€hrend des Parse-Prozesses habe ich einige neue Erkenntnisse gewonnen.

Erstens sagt man, dass es sinnlos ist, mehr Prozesse zu erstellen, als Kerne im Prozessor vorhanden sind. In meinem Fall stellte sich jedoch heraus, dass die limitierende Ressource nicht der Prozessor, sondern das Netzwerk ist, und 100 Prozesse arbeiten schneller als 4 oder sagen wir 20.

Zweitens gab es in einigen Posts Kombinationen von Sonderzeichen — beispielsweise Eufemismen wie "%&#@". Es stellte sich heraus, dass html.parser, den ich zunĂ€chst verwendet habe, empfindlich auf die Kombination reagiert &# , da sie als Beginn einer HTML-EntitĂ€t betrachtet wird. Ich hatte schon vor, schwarze Magie zu praktizieren, aber im Forum wurde mir geraten, den Parser einfach zu wechseln.

Drittens ist es mir gelungen, alle Veröffentlichungen bis auf drei zu exportieren. Die Dokumente mit den Nummern 65927, 162075 und 275987 wurden sofort von meinem Antivirus gelöscht. Diese Artikel handeln entsprechend von einer JavaScript-Kette, die ein schĂ€dliches PDF lĂ€dt, einer SMS-Erpressung in Form von Plug-in-Sets fĂŒr Browser und der Website CrashSafari.com, die iPhones zum Neustart zwingt. Ein weiterer Artikel wurde spĂ€ter vom Antivirus entdeckt, wĂ€hrend des Systemscans: Post 338586 ĂŒber Skripte auf der Website eines ZoogeschĂ€fts, die die CPU des Nutzers zum Krypto-Mining nutzen. So kann man die Arbeit des Antivirus als durchaus angemessen betrachten.

"Lebendige" Artikel stellte sich nur als die HĂ€lfte des möglichen Maximums heraus – 166307 StĂŒck. FĂŒr die anderen gibt Habr alternativ an "Seite ist veraltet, wurde gelöscht oder existierte ĂŒberhaupt nicht". Na ja, das passiert.

Nach dem Export der Artikel folgten technische Arbeiten: beispielsweise mussten die Veröffentlichungsdaten von "’21. Dezember 2006 um 10:47" in das Standardformat umgewandelt werden, datetime, und "12,8k" Aufrufe in 12800. In diesem Stadium traten noch einige weitere KuriositĂ€ten auf. Die lustigste betraf die StimmenzĂ€hlung und Datentypen: In einigen alten Posts kam es zu einem Überlauf des Integers, und sie erhielten 65535 Stimmen.

Wie ich Habr durchsucht habe, Teil 1: Trends

Insgesamt belegten die Texte der Artikel (ohne Bilder) bei mir 1,5 Gigabyte, die Kommentare mit Metainformationen weitere 3, und etwa hundert Megabyte — Metainformationen ĂŒber die Artikel. Solches kann man komplett im Arbeitsspeicher halten, was fĂŒr mich eine angenehme Überraschung war.

Ich begann mit der Analyse der Artikel nicht mit den eigentlichen Texten, sondern mit den Metainformationen: Daten, Tags, Hubs, Aufrufe und "Likes". Es stellte sich heraus, dass auch diese viel zu erzÀhlen vermögen.

Entwicklungstrends von HabrHabr

Artikel auf der Website werden seit 2006 veröffentlicht; am intensivsten zwischen 2008 und 2016.

Wie ich Habr durchsucht habe, Teil 1: Trends

Wie aktiv diese Artikel zu verschiedenen Zeiten gelesen wurden, ist nicht so einfach zu beurteilen. Texte aus dem Jahr 2012 und jĂŒnger wurden aktiver kommentiert und bewertet, aber neuere Texte haben mehr Aufrufe und werden hĂ€ufiger in Lesezeichen gespeichert. Diese Metriken verhielten sich nur einmal gleich (sind halbiert), nĂ€mlich im Jahr 2015. Möglicherweise wandte sich die Aufmerksamkeit der Leser in einer Situation des wirtschaftlichen und politischen Krisens von IT-Blogs zu schmerzhaften Fragen.

Wie ich Habr durchsucht habe, Teil 1: Trends

Neben den Artikeln habe ich auch die Kommentare dazu extrahiert. Insgesamt gab es 6 Millionen Kommentare, wobei sich herausstellte, dass 240.000 davon gesperrt waren ("ein UFO landete und hinterließ diesen Kommentar hier"). Ein nĂŒtzliches Merkmal der Kommentare ist die Zeitangabe. Durch die Analyse der Zeit der Kommentare kann man grob verstehen, wann die Artikel ĂŒberhaupt gelesen werden.

Es stellte sich heraus, dass die meisten Artikel zwischen 10 und 20 Uhr geschrieben und kommentiert werden, also wĂ€hrend eines typischen Arbeitstags in Moskau. Das könnte bedeuten, dass Habr aus beruflichen GrĂŒnden gelesen wird, oder dass es eine gute Form der Prokrastination wĂ€hrend der Arbeit ist. Übrigens ist diese Tageszeitverteilung seit der GrĂŒndung von Habr bis heute stabil.

Wie ich Habr durchsucht habe, Teil 1: Trends

Der Hauptvorteil der Zeitmarke eines Kommentars besteht jedoch nicht in der Tageszeit, sondern in der "aktiven Lebensdauer" des Artikels. Ich habe berechnet, wie die Zeit von der Veröffentlichung eines Artikels bis zu seinem Kommentar verteilt ist. Es stellte sich heraus, dass der mediane Kommentar (grĂŒne Linie) derzeit etwa 20 Stunden nach Veröffentlichung eintrifft, d.h. an den ersten 24 Stunden werden im Durchschnitt etwas mehr als die HĂ€lfte aller Kommentare zu einem Artikel hinterlassen. Nach zwei Tagen werden 75 % aller Kommentare hinterlassen. FrĂŒher wurden Artikel jedoch sogar noch schneller gelesen – so kamen im Jahr 2010 bereits die HĂ€lfte der Kommentare in den ersten 6 Stunden.

Wie ich Habr durchsucht habe, Teil 1: Trends

Es war fĂŒr mich eine Überraschung, dass die Kommentare lĂ€nger wurden: Die durchschnittliche Anzahl der Zeichen in einem Kommentar ist seit der GrĂŒndung von Habr um fast das Doppelte gestiegen!

Wie ich Habr durchsucht habe, Teil 1: Trends

Eine einfachere Form des Feedbacks als Kommentare sind die Stimmen. Im Gegensatz zu vielen anderen Plattformen kann man auf Habr nicht nur positives, sondern auch negatives Feedback geben. Allerdings wird die letztere Möglichkeit von den Lesern nicht so hĂ€ufig genutzt: Derzeit liegt der Anteil der Dislikes bei etwa 15 % aller abgegebenen Stimmen. FrĂŒher war es mehr, aber im Laufe der Zeit sind die Leser freundlicher geworden.

Wie ich Habr durchsucht habe, Teil 1: Trends

Auch die Texte selbst haben sich im Laufe der Zeit verĂ€ndert. Zum Beispiel hat die typische TextlĂ€nge seit dem Start der Website kontinuierlich zugenommen, trotz der Krisen. Über ein Jahrzehnt hinweg haben die Texte fast um das Zehnfache zugenommen!

Wie ich Habr durchsucht habe, Teil 1: Trends

Auch der Stil der Texte hat sich (im Großen und Ganzen) verĂ€ndert. In den ersten Jahren von Habr beispielsweise stieg der Anteil von Code und Zahlen in den Texten an:

Wie ich Habr durchsucht habe, Teil 1: Trends

Nachdem ich die allgemeine Dynamik der Website analysiert hatte, beschloss ich, die VerĂ€nderungen in der Beliebtheit verschiedener Themen zu messen. Themen können automatisch aus Texten extrahiert werden, aber zunĂ€chst kann man sich auf die vorhandenen Tags verlassen, die von den Autoren jedes Artikels zugewiesen wurden. Vier typische Trends habe ich im Diagramm ausgegeben. Das Thema "Google" dominierte anfĂ€nglich (möglicherweise hauptsĂ€chlich aufgrund der SEO-Optimierung), verlor jedoch mit jedem Jahr an Bedeutung. Javascript war ein beliebtes Thema und bleibt es allmĂ€hlich, wĂ€hrend maschinelles Lernen erst in den letzten Jahren rasant an PopularitĂ€t zulegte. Linux bleibt hingegen ĂŒber das ganze Jahrzehnt hinweg relevant.

Wie ich Habr durchsucht habe, Teil 1: Trends

NatĂŒrlich wurde ich neugierig, welche Themen die höchste LeseraktivitĂ€t anziehen. Ich habe die mediane Anzahl von Aufrufen, Stimmen und Kommentaren fĂŒr jedes Thema gezĂ€hlt. Das ist das Ergebnis:

  • Die am hĂ€ufigsten angesehenen Themen: arduino, Webdesign, Webentwicklung, Digest, Links, css, html, html5, nginx, Algorithmen.
  • Die "likable" Themen: vk.com, Humor, jquery, opera, c, html, Webentwicklung, html5, css, Webdesign.
  • Die am meisten diskutierten Themen: opera, skype, Freelancing, vk.com, ubuntu, Arbeit, nokia, nginx, arduino, firefox.

Übrigens, da ich die Themen vergleiche, können sie auch nach HĂ€ufigkeit bewertet werden (und die Ergebnisse mit einem Ă€hnlichen Artikel aus dem Jahr 2013 vergleichen).

  • In all den Jahren seit der GrĂŒndung von Habr waren die beliebtesten Tags (in absteigender Reihenfolge) google, android, javascript, microsoft, linux, php, apple, java, python, Programmierung, Startups, Entwicklung, ios, Startup, soziale Netzwerke.
  • Im Jahr 2017 waren die beliebtesten Themen javascript, python, java, android, Entwicklung, linux, c++, Programmierung, php, c#, ios, maschinelles Lernen, Informationssicherheit, microsoft, react.

Beim Vergleich dieser Rankings kann man beispielsweise auf den Siegeszug von Python und das Verschwinden von php, oder auf den "Sonnenuntergang" des Startup-Themenbereichs und den Aufstieg des maschinellen Lernens hinweisen.

Nicht alle Tags auf Habr haben eine so offensichtliche thematische FĂ€rbung. Hier sind zum Beispiel ein Dutzend Tags, die nur einmal vorkamen, aber mir einfach amĂŒsant erschienen. Also: "Idee treibt den Fortschritt voran", "Laden von Diskettenabbild", "Bundesstaat Iowa", "Dramaturgie", "Superalesha", "Dampfmaschine", "Was man am Samstag tun kann", "Ich habe einen Fuchs im Fleischwolf", "Aber es kam wie immer", "Es ist nicht gelungen, witzige Tags zu erfinden". Um das Thema solcher Artikel zu bestimmen, sind Tags nicht ausreichend – es wird erforderlich sein, thematische Modellierung an den Texten der Artikel durchzufĂŒhren.

Eine detailliertere Analyse des Inhalts der Artikel wird im nĂ€chsten Beitrag stattfinden. Erstens beabsichtige ich, ein Modell zu erstellen, das die Anzahl der Aufrufe eines Artikels je nach Inhalt vorhersagt. Zweitens möchte ich ein neuronales Netzwerk trainieren, um Texte im Ă€hnlichen Stil wie die Autoren von Habr zu generieren. Abonnieren Sie also 🙂

P.S. Und hier ist die zensierte Datensatz.

Quelle: habr.com

60GB SSD 8Gb DDR4