Habr'ı nasıl ayrıştırdım, 1. bölüm: trendler

Yılbaşı Olivier bittiğinde yapacak hiçbir şeyim kalmamıştı ve Habrahabr'daki (ve ilgili platformlardaki) tüm yazıları bilgisayarıma indirip biraz araştırma yapmaya karar verdim.

Birkaç ilginç hikaye olduğu ortaya çıktı. Bunlardan ilki, sitenin 12 yıllık varlığı boyunca makalelerin formatının ve konularının geliştirilmesidir. Örneğin bazı konuların dinamikleri oldukça yol göstericidir. Kesim altında devam edildi.

Habr'ı nasıl ayrıştırdım, 1. bölüm: trendler

Ayrıştırma işlemi

Habr'ın nasıl geliştiğini anlamak için tüm makalelerini gözden geçirmek ve onlardan meta bilgileri (örneğin tarihler) çıkarmak gerekiyordu. Baypas kolaydı çünkü tüm makalelere olan bağlantılar "habrahabr.ru/post/337722/" gibi görünüyor ve sayılar kesinlikle sırayla belirtiliyor. Son gönderinin sayısının 350 binden biraz daha az olduğunu bildiğimden, olası tüm belge kimliklerini bir döngüde (Python kodu) inceledim:

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

Fonksiyon download_document sayfayı ilgili id ​​ile yüklemeye çalışır ve html yapısından anlamlı bilgiler çıkarmaya çalışır.

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)

Ayrıştırma işlemi sırasında birkaç yeni şey keşfettim.

Öncelikle işlemcide çekirdekten daha fazla süreç oluşturmanın faydasız olduğunu söylüyorlar. Ancak benim durumumda sınırlayıcı kaynağın işlemci değil ağ olduğu ve 100 işlemin 4'ten veya örneğin 20'den daha hızlı çalıştığı ortaya çıktı.

İkinci olarak, bazı gönderilerde özel karakterlerin kombinasyonları vardı; örneğin "%'@" gibi örtmeceler. Görünüşe göre html.parserilk kullandığım kombinasyona tepki veriyor &# HTML varlığının başlangıcı göz önüne alındığında acı verici. Kara büyü yapmak üzereydim ama forum ayrıştırıcıyı değiştirebileceğimi önerdi.

Üçüncüsü, üç yayın dışında hepsini indirebildim. 65927, 162075 ve 275987 numaralı belgeler antivirüs programım tarafından anında silindi. Bunlar sırasıyla kötü amaçlı bir pdf indiren bir javascript zinciri, tarayıcılar için bir dizi eklenti biçimindeki bir SMS fidye yazılımı ve iPhone'ları yeniden başlatmaya gönderen CrashSafari.com sitesi hakkındaki makalelerdir. Antivirüs, daha sonra sistem taraması sırasında başka bir makale keşfetti: Bir evcil hayvan mağazasının web sitesinde, kullanıcının işlemcisini kripto para birimi madenciliği yapmak için kullanan komut dosyaları hakkında 338586 numaralı gönderi. Dolayısıyla antivirüsün çalışmasının oldukça yeterli olduğunu düşünebiliriz.

Potansiyel maksimum "canlı" makalelerin yalnızca yarısı vardı - 166307 parça. Geri kalanı için Habr, “sayfa güncel değil, silinmiş veya hiç mevcut değil” seçeneklerini sunuyor. Her şey olabilir.

Makalelerin yüklenmesini teknik çalışmalar takip etti: örneğin yayın tarihlerinin "21 Aralık 2006, 10:47" formatından standart formata dönüştürülmesi gerekiyordu. datetimeve "12,8k" görüntüleme - 12800'de. Bu aşamada birkaç olay daha ortaya çıktı. En komik olanı oy sayımı ve veri türleriyle ilgili: bazı eski gönderilerde int taşması vardı ve 65535 oy aldılar.

Habr'ı nasıl ayrıştırdım, 1. bölüm: trendler

Sonuç olarak, makalelerin metinleri (resimsiz) bana 1.5 gigabayt, meta bilgi içeren yorumlar - başka bir 3 ve makaleler hakkında yaklaşık yüz megabayt - meta bilgi aldı. Bunun tamamen RAM'de saklanabilmesi benim için hoş bir sürpriz oldu.

Makaleleri metinlerle değil meta bilgilerle analiz etmeye başladım: tarihler, etiketler, merkezler, görüşler ve "beğeniler". Onun da çok şey söyleyebildiği ortaya çıktı.

Habrahabr geliştirme eğilimleri

Sitede yer alan yazılar 2006 yılından bu yana yayınlanmaktadır; 2008-2016'da en yoğun şekilde.

Habr'ı nasıl ayrıştırdım, 1. bölüm: trendler

Bu makalelerin farklı zamanlarda ne kadar aktif bir şekilde okunduğunu değerlendirmek o kadar kolay değil. 2012 ve daha eski tarihli metinler daha aktif yorum ve derecelendirme aldı, ancak daha yeni metinler daha fazla görüntüleme ve yer işaretine sahip. Bu metrikler 2015 yılında yalnızca bir kez aynı şekilde davrandı (yarı yarıya düştü). Belki de ekonomik ve politik kriz ortamında okuyucuların dikkati BT bloglarından daha acı verici konulara kaymıştır.

Habr'ı nasıl ayrıştırdım, 1. bölüm: trendler

Makalelerin yanı sıra onlara yapılan yorumları da indirdim. 6 milyon yorum vardı ancak 240 bini yasaklandı (“Bir UFO uçtu ve bu yazıyı burada yayınladı”). Yorumların yararlı bir özelliği, zaman damgasına sahip olmalarıdır. Yorumların zamanlamasını inceleyerek makalelerin ne zaman okunduğunu kabaca anlayabilirsiniz.

Makalelerin çoğunun saat 10'dan 20'ye kadar bir yerde yazıldığı ve yorumlandığı ortaya çıktı. Tipik bir Moskova iş gününde. Bu, Habr'ın mesleki amaçlarla okunduğu ve iş yerinde ertelemenin iyi bir yolu olduğu anlamına gelebilir. Bu arada, günün saatlerinin bu dağılımı Habr'ın kuruluşundan bugüne kadar istikrarlıydı.

Habr'ı nasıl ayrıştırdım, 1. bölüm: trendler

Ancak yorum zaman damgasının asıl faydası günün saati değil, makalenin "aktif ömrü"dür. Bir makalenin yayınlanmasından yorumuna kadar zamanın nasıl dağıldığını hesapladım. Artık medyan yorumun (yeşil çizgi) yaklaşık 20 saat içinde geldiği ortaya çıktı, yani. Yayınlandıktan sonraki ilk günde, ortalama olarak bir makaleye yapılan yorumların yarısından biraz fazlası kalıyor. Ve iki gün içinde tüm yorumların %75'i kalıyor. Üstelik daha önceki makaleler daha da hızlı okunuyordu; örneğin 2010'da yorumların yarısı ilk 6 saat içinde gelmişti.

Habr'ı nasıl ayrıştırdım, 1. bölüm: trendler

Yorumların uzaması benim için sürpriz oldu: Habr'ın var olduğu dönemde bir yorumdaki ortalama karakter sayısı neredeyse iki katına çıktı!

Habr'ı nasıl ayrıştırdım, 1. bölüm: trendler

Yorumlardan daha basit olan geri bildirim oylardır. Diğer birçok kaynağın aksine, Habré'de sadece artıları değil, eksileri de yazabilirsiniz. Ancak okuyucular ikinci fırsatı çok sık kullanmıyor: Beğenmeyenlerin mevcut payı, verilen tüm oyların yaklaşık %15'ini oluşturuyor. Eskiden daha fazlası vardı ama zamanla okuyucular daha nazik hale geldi.

Habr'ı nasıl ayrıştırdım, 1. bölüm: trendler

Metinlerin kendileri zamanla değişti. Örneğin, tipik metin uzunluğu, krizlere rağmen sitenin açılışından bu yana istikrarlı bir şekilde artmaya devam etti. On yıl içinde metinler neredeyse on kat daha uzun hale geldi!

Habr'ı nasıl ayrıştırdım, 1. bölüm: trendler

Metinlerin tarzı da (ilk tahmine göre) değişti. Örneğin Habr'ın varlığının ilk yıllarında metinlerdeki kod ve sayıların payı arttı:

Habr'ı nasıl ayrıştırdım, 1. bölüm: trendler

Sitenin genel dinamiklerini anladıktan sonra çeşitli konuların popülerliğinin nasıl değiştiğini ölçmeye karar verdim. Konular metinlerden otomatik olarak belirlenebilir, ancak başlangıçta tekerleği yeniden icat edemezsiniz, ancak her makalenin yazarları tarafından eklenen hazır etiketleri kullanabilirsiniz. Grafikte dört tipik trend gösterdim. Başlangıçta "Google" teması hakim oldu (belki de esas olarak SEO optimizasyonu nedeniyle), ancak her yıl ağırlık kaybetti. Javascript popüler bir konu olmuştur ve olmaya da devam etmektedir, ancak makine öğrenimi son yıllarda hızla popülerlik kazanmaya başlamıştır. Linux, on yıl boyunca eşit derecede alakalı olmaya devam ediyor.

Habr'ı nasıl ayrıştırdım, 1. bölüm: trendler

Elbette hangi konuların okuyucu etkinliğini daha fazla çektiğiyle ilgilenmeye başladım. Her konu için ortalama görüntüleme, oy ve yorum sayısını hesapladım. İşte olanlar:

  • En çok görüntülenen konular: arduino, web tasarımı, web geliştirme, özet, bağlantılar, css, html, html5, nginx, algoritmalar.
  • En çok "beğenilen" konular: VKontakte, mizah, jquery, opera, c, html, web geliştirme, html5, css, web tasarımı.
  • En çok tartışılan konular: opera, skype, serbest çalışma, VKontakte, ubuntu, iş, nokia, nginx, arduino, firefox.

Bu arada, konuları karşılaştırdığım için bunları sıklığa göre sıralayabilirim (ve sonuçları 2013'ten benzer makale).

  • Habr'ın var olduğu yıllar boyunca en popüler etiketler (azalan sırayla) google, android, javascript, microsoft, linux, php, apple, java, python, programlama, startups, development, ios, startup, sosyal ağlar olmuştur.
  • 2017 yılında en popüler olanları javascript, python, java, android, geliştirme, linux, c++, programlama, php, c#, ios, makine öğrenimi, bilgi güvenliği, microsoft, react oldu.

Bu derecelendirmeleri karşılaştırırken, örneğin Python'un muzaffer yürüyüşüne ve php'nin yok oluşuna veya startup temasının "düşüşüne" ve makine öğreniminin yükselişine dikkat edebilirsiniz.

Habré'deki tüm etiketlerin bu kadar belirgin bir tematik rengi yoktur. Örneğin burada yalnızca bir kez görünen ama bana komik gelen bir düzine etiket var. Yani: “fikir ilerlemenin motorudur”, “disket görüntüsünden önyükleme”, “Iowa eyaleti”, “drama”, “superalesha”, “buhar motoru”, “Cumartesi günü ne yapmalı”, “Ben öğütücüde bir tilki var”, “ve her zamanki gibi ortaya çıktı,” “komik etiketler bulamadık.” Bu tür makalelerin konusunu belirlemek için etiketler yeterli değildir; makalelerin metinleri üzerinde konu modellemesi yapmanız gerekecektir.

Yazıların içeriğinin daha detaylı analizi bir sonraki yazıda olacak. Öncelikle bir makalenin içeriğine göre alacağı görüntüleme sayısını tahmin eden bir model oluşturacağım. İkinci olarak, sinir ağına Habr yazarlarıyla aynı tarzda metinler üretmeyi öğretmek istiyorum. O halde abone olun :)

PS Ve işte burada, kaydedildi veri kümesi.

Kaynak: habr.com

Yorum ekle