Comment j'ai analysé Habr, partie 1 : les tendances

Lorsque la salade Olivier du Nouvel An a été terminée, je n'avais plus rien à faire et j'ai décidé de télécharger tous les articles de Habrahabr (et des plateformes associées) sur mon ordinateur et de les explorer.

Plusieurs anecdotes intéressantes ont été publiées. La première concerne l'évolution du format et des thèmes des articles au cours des 12 années d'existence du site. Par exemple, la dynamique de certains sujets est assez révélatrice. La suite est en cours de rédaction.

Comment j'ai analysé Habr, partie 1 : les tendances

Processus d'analyse

Pour comprendre le développement d'Habr, il a fallu parcourir tous ses articles et en extraire les méta-informations (par exemple, les dates). Le contournement a été facile, car les liens vers tous les articles se présentent sous la forme « habrahabr.ru/post/337722/ » et les numéros sont donnés dans l'ordre. Sachant que le dernier article porte un numéro légèrement inférieur à 350 XNUMX, j'ai simplement parcouru tous les identifiants de documents possibles dans une boucle (code en Python) :

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

Fonction download_document essaie de charger la page avec l'identifiant correspondant et essaie d'extraire des informations significatives de la structure 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)

Au cours du processus d’analyse, j’ai découvert plusieurs nouvelles choses.

Premièrement, on dit qu'il est inutile de créer plus de processus que de cœurs dans un processeur. Mais dans mon cas, il s'est avéré que la ressource limitante n'est pas le processeur, mais le réseau, et 100 processus fonctionnent plus vite que 4 ou, disons, 20.

Deuxièmement, certains messages contenaient des combinaisons de caractères spéciaux, comme des euphémismes comme « %&#@ ». Il s'est avéré que html.parser, que j'ai utilisé en premier, réagit à la combinaison &# C'est pénible, vu que c'est le début d'une entité HTML. J'allais faire un peu de magie noire, mais le forum suggérait de simplement changer l'analyseur.

Troisièmement, j'ai réussi à télécharger toutes les publications sauf trois. Les documents portant les numéros 65927, 162075 et 275987 ont été instantanément supprimés par mon antivirus. Ces articles concernent respectivement une chaîne de scripts JavaScript téléchargeant un PDF malveillant, un extorqueur de SMS sous la forme d'un ensemble de plugins de navigateur et le site web CrashSafari.com qui force les iPhones à redémarrer. L'antivirus a détecté un autre article plus tard, lors d'une analyse du système : le message 338586 concernant des scripts sur le site web d'une animalerie qui utilisent le processeur de l'utilisateur pour miner des cryptomonnaies. On peut donc considérer que l'antivirus fonctionne plutôt bien.

Les articles « en direct » ne représentaient que la moitié du maximum potentiel : 166307 XNUMX articles. Pour le reste, Habr propose les options « la page est obsolète, a été supprimée ou n'existait pas du tout ». Eh bien, tout peut arriver.

Le téléchargement des articles a été suivi d'un travail technique : par exemple, les dates de publication ont dû être converties du format « 21 décembre 2006 à 10h47 » au format standard datetime, et « 12,8 12800 » vues — 65535 XNUMX. À ce stade, plusieurs autres incidents sont apparus. Le plus drôle concerne le décompte des votes et les types de données : dans certains anciens messages, l'int a débordé, et ils ont reçu XNUMX XNUMX votes.

Comment j'ai analysé Habr, partie 1 : les tendances

En conséquence, le texte des articles (sans les images) occupait 1.5 gigaoctet, les commentaires avec méta-informations 3 mégaoctets et une centaine de mégaoctets de méta-informations sur les articles. Tout cela peut être stocké entièrement en RAM, ce qui a été une agréable surprise pour moi.

J'ai commencé à analyser les articles non pas à partir des textes eux-mêmes, mais à partir des méta-informations : dates, tags, hubs, vues et mentions « J'aime ». Il s'est avéré que ces informations peuvent également être très révélatrices.

Tendances de développement de Habrahabr

Des articles sont publiés sur le site depuis 2006, avec une intensité accrue entre 2008 et 2016.

Comment j'ai analysé Habr, partie 1 : les tendances

Il n'est pas si facile d'estimer le degré de lecture de ces articles à différentes périodes. Les textes de 2012 et des années antérieures ont été davantage commentés et notés, tandis que les textes plus récents ont été davantage consultés et mis en favoris. Ces indicateurs n'ont connu la même évolution (diminution de moitié) qu'une seule fois, en 2015. Peut-être que, dans le contexte de crise économique et politique, l'attention des lecteurs s'est détournée des blogs informatiques vers des sujets plus sensibles.

Comment j'ai analysé Habr, partie 1 : les tendances

Outre les articles eux-mêmes, j'ai également téléchargé leurs commentaires. Il y avait 6 millions de commentaires, dont 240 XNUMX étaient interdits (« Un OVNI est arrivé et a posté cette inscription ici »). L'indication de l'heure des commentaires est un atout. En étudiant l'heure des commentaires, on peut comprendre approximativement quand les articles sont lus en général.

Il s'avère que la plupart des articles sont rédigés et commentés entre 10 et 20 heures, soit lors d'une journée de travail moscovite typique. Cela pourrait signifier que Habr est lu à des fins professionnelles et qu'il constitue un bon moyen de procrastiner au travail. D'ailleurs, cette répartition horaire est restée stable depuis la création d'Habr jusqu'à aujourd'hui.

Comment j'ai analysé Habr, partie 1 : les tendances

Cependant, le principal avantage de l'horodatage des commentaires n'est pas l'heure de la journée, mais la durée de vie active de l'article. J'ai calculé la répartition du temps entre la publication d'un article et son commentaire. Il s'avère qu'aujourd'hui, le délai médian d'un commentaire (ligne verte) est d'environ 20 heures, ce qui signifie qu'en moyenne, un peu plus de la moitié des commentaires sur un article sont laissés dans les 75 heures suivant sa publication. Et 2010 % des commentaires sont laissés en deux jours. Par ailleurs, les articles étaient lus encore plus vite auparavant ; par exemple, en 6, la moitié des commentaires étaient publiés dans les XNUMX heures suivant leur publication.

Comment j'ai analysé Habr, partie 1 : les tendances

J'ai été surpris de constater que les commentaires sont devenus plus longs : le nombre moyen de caractères dans un commentaire a presque doublé au cours de l'existence de Habr !

Comment j'ai analysé Habr, partie 1 : les tendances

Les votes sont un moyen plus simple de réagir que les commentaires. Contrairement à de nombreuses autres ressources, sur Habr, vous pouvez ajouter non seulement des « + », mais aussi des « - ». Cependant, les lecteurs n'utilisent pas très souvent cette dernière option : la part des « Je n'aime pas » représente actuellement environ 15 % de tous les votes exprimés. C'était plus élevé auparavant, mais avec le temps, les lecteurs sont devenus plus compréhensifs.

Comment j'ai analysé Habr, partie 1 : les tendances

Les textes eux-mêmes ont évolué au fil du temps. Par exemple, la longueur moyenne des textes n'a cessé d'augmenter régulièrement depuis le lancement du site, malgré les crises. En une décennie, les textes ont presque décuplé !

Comment j'ai analysé Habr, partie 1 : les tendances

Le style des textes (en première approximation) a également évolué. Durant les premières années d'existence de Habr, par exemple, la part des codes et des chiffres dans les textes a augmenté :

Comment j'ai analysé Habr, partie 1 : les tendances

Après avoir analysé la dynamique globale du site, j'ai décidé de mesurer l'évolution de la popularité de différents sujets. Les sujets peuvent être extraits automatiquement des textes, mais pour commencer, vous pouvez utiliser des balises prédéfinies ajoutées par les auteurs de chaque article au lieu de réinventer la roue. J'ai tracé quatre tendances typiques sur le graphique. Le sujet « Google » a initialement dominé (peut-être principalement grâce à l'optimisation SEO), mais a perdu du terrain chaque année. Javascript était un sujet populaire et continue de le faire progressivement, mais l'apprentissage automatique n'a commencé à gagner rapidement en popularité que ces dernières années. Linux est resté tout aussi pertinent tout au long de la décennie.

Comment j'ai analysé Habr, partie 1 : les tendances

Bien sûr, j'étais curieux de savoir quels sujets suscitaient le plus d'intérêt de la part des lecteurs. J'ai calculé le nombre médian de vues, de votes et de commentaires pour chaque sujet. Voici ce que j'ai obtenu :

  • Sujets les plus consultés : arduino, conception Web, développement Web, digest, liens, css, html, html5, nginx, algorithmes.
  • Les sujets les plus « aimés » : vkontakte, humour, jquery, opera, c, html, développement web, html5, css, web design.
  • Les sujets les plus discutés : Opera, Skype, Freelancing, Vkontakte, Ubuntu, Work, Nokia, Nginx, Arduino, Firefox.

Au fait, puisque je compare des sujets, vous pouvez les classer par fréquence (et comparer les résultats avec article similaire de 2013).

  • Au fil des années d'existence de Habr, les tags les plus populaires (par ordre décroissant) sont devenus google, android, javascript, microsoft, linux, php, apple, java, python, programmation, startups, développement, ios, startup, réseaux sociaux
  • En 2017, les plus populaires étaient javascript, python, java, android, développement, linux, c++, programmation, php, c#, ios, machine learning, sécurité de l'information, microsoft, react

En comparant ces notes, on peut prêter attention, par exemple, à la marche victorieuse de Python et à l'extinction de PHP, ou au « coucher de soleil » du thème des startups et à l'essor de l'apprentissage automatique.

Tous les tags sur Habr n'ont pas une coloration thématique aussi évidente. Par exemple, voici dix tags rencontrés une seule fois, mais qui m'ont semblé tout simplement amusants. Par exemple : « L'idée est le moteur du progrès », « Démarrer depuis une image de disquette », « État de l'Iowa », « Drame », « Super-lesha », « Machine à vapeur », « Que faire samedi », « J'ai un renard dans un hachoir à viande », « Et ça s'est passé comme toujours », « Je n'ai pas trouvé de tags amusants ». Pour déterminer le sujet de tels articles, les tags ne suffisent pas : il faut modéliser thématiquement les textes.

Une analyse plus détaillée du contenu des articles sera publiée dans le prochain article. Je vais d'abord créer un modèle qui prédit le nombre de vues d'un article en fonction de son contenu. Ensuite, je souhaite apprendre au réseau neuronal à générer des textes dans le même style que les auteurs de Habr. Alors, abonnez-vous !

P.S. Et voici celui qui a été choisi ensemble de données.

Source: habr.com