Bagaimana saya menghuraikan Habr, bahagian 1: trend

Apabila Olivier Tahun Baru selesai, saya tidak mempunyai apa-apa untuk dilakukan, dan saya memutuskan untuk memuat turun semua artikel dari Habrahabr (dan platform yang berkaitan) ke komputer saya dan meneroka.

Terdapat beberapa cerita menarik. Yang pertama ialah pembangunan format dan topik artikel sepanjang 12 tahun kewujudan laman web ini. Sebagai contoh, dinamik beberapa topik agak menunjukkan. Sambungan - di bawah potongan.

Bagaimana saya menghuraikan Habr, bahagian 1: trend

Proses penghuraian

Untuk memahami bagaimana Habr berkembang, adalah perlu untuk meneliti semua artikelnya dan mengekstrak maklumat meta daripadanya (contohnya, tarikh). Pintasan itu mudah, kerana pautan ke semua artikel kelihatan seperti "habrahabr.ru/post/337722/", dan nombor-nombornya diberikan mengikut urutan. Mengetahui bahawa jawatan terakhir mempunyai nombor kurang daripada 350 ribu, saya baru sahaja meneliti semua id dokumen yang mungkin dalam gelung (kod Python):

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

Fungsi download_document cuba memuatkan halaman dengan id yang sepadan dan cuba mengekstrak maklumat yang bermakna daripada struktur 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)

Dalam proses menghurai, saya menemui beberapa perkara baharu.

Pertama, mereka mengatakan bahawa mencipta lebih banyak proses daripada terdapat teras dalam pemproses adalah sia-sia. Tetapi dalam kes saya, ternyata sumber yang mengehadkan bukanlah pemproses, tetapi rangkaian, dan 100 proses berjalan lebih cepat daripada 4 atau, katakan, 20.

Kedua, dalam beberapa siaran terdapat gabungan aksara khas - contohnya, eufemisme seperti "%&#@". Ternyata begitu html.parser, yang saya gunakan dahulu, bertindak balas terhadap gabungan itu &# menyakitkan, menganggap ia permulaan entiti html. Saya sudah akan melakukan ilmu hitam, tetapi forum mencadangkan anda boleh menukar parser sahaja.

Ketiga, saya berjaya memunggah semua penerbitan, kecuali tiga. Dokumen bernombor 65927, 162075, dan 275987 telah dipadamkan dengan serta-merta oleh antivirus saya. Ini adalah artikel masing-masing mengenai rantaian javascript yang memuat turun pdf berniat jahat, perisian tebusan SMS dalam bentuk set pemalam penyemak imbas dan tapak CrashSafari.com yang menghantar iPhone ke but semula. Antivirus menemui artikel lain kemudian, semasa imbasan sistem: siarkan 338586 tentang skrip di tapak web kedai haiwan peliharaan yang menggunakan pemproses pengguna untuk melombong mata wang kripto. Jadi kita boleh menganggap kerja antivirus itu cukup memadai.

Artikel "Langsung" ternyata hanya separuh daripada potensi maksimum - 166307 keping. Mengenai selebihnya, Habr memberikan pilihan "halaman itu sudah lapuk, telah dipadam atau tidak wujud sama sekali." Nah, apa sahaja boleh berlaku.

Muat naik artikel diikuti dengan kerja teknikal: sebagai contoh, tarikh penerbitan perlu ditukar daripada format "'21 Disember 2006 pada 10:47 pagi" kepada standard datetime, dan "12,8k" paparan - pada 12800. Pada peringkat ini, beberapa lagi insiden telah berlaku. Yang paling kelakar ada kaitan dengan pengiraan undi dan jenis data: beberapa siaran lama mempunyai limpahan int dan menerima 65535 undian setiap satu.

Bagaimana saya menghuraikan Habr, bahagian 1: trend

Akibatnya, teks artikel (tanpa gambar) membawa saya 1.5 gigabait, ulasan dengan meta-maklumat - 3 lagi, dan kira-kira seratus megabait - meta-maklumat tentang artikel. Ini boleh disimpan sepenuhnya dalam RAM, yang merupakan kejutan yang menyenangkan bagi saya.

Saya memulakan analisis artikel bukan daripada teks itu sendiri, tetapi daripada meta-maklumat: tarikh, tag, hab, pandangan dan suka. Ternyata banyak yang dia boleh ceritakan.

Trend Pembangunan Habrahabr

Artikel di laman web ini telah diterbitkan sejak 2006; paling intensif - pada 2008-2016.

Bagaimana saya menghuraikan Habr, bahagian 1: trend

Seberapa aktif artikel ini dibaca pada masa yang berbeza tidak begitu mudah untuk dinilai. Teks dari 2012 dan lebih muda menerima lebih banyak ulasan dan penilaian, tetapi teks yang lebih baharu mempunyai lebih banyak paparan dan penanda halaman. Metrik ini berkelakuan dengan cara yang sama (dibelah dua) sekali sahaja, pada tahun 2015. Mungkin, dalam situasi krisis ekonomi dan politik, perhatian pembaca telah beralih daripada blog IT kepada isu yang lebih menyakitkan.

Bagaimana saya menghuraikan Habr, bahagian 1: trend

Sebagai tambahan kepada artikel itu sendiri, saya memuat turun lebih banyak ulasan kepada mereka. Terdapat 6 juta komen, bagaimanapun, 240 ribu daripadanya telah diharamkan ("UFO terbang masuk dan menerbitkan inskripsi ini di sini"). Ciri komen yang berguna ialah mereka mempunyai cap masa. Dengan mengkaji masa ulasan, anda boleh memahami secara kasar apabila artikel dibaca sama sekali.

Ternyata kebanyakan artikel ditulis dan diulas di suatu tempat dari 10 pagi hingga 20 malam, i.e. pada hari bekerja Moscow biasa. Ini mungkin bermakna bahawa Habr dibaca untuk tujuan profesional, dan ini adalah cara yang baik untuk menangguhkan kerja. Ngomong-ngomong, pembahagian masa hari ini adalah stabil dari asas Habr hingga ke hari ini.

Bagaimana saya menghuraikan Habr, bahagian 1: trend

Walau bagaimanapun, faedah utama cap waktu ulasan bukanlah masa dalam sehari, tetapi tempoh "kehidupan aktif" artikel itu. Saya mengira bagaimana masa diagihkan daripada penerbitan artikel kepada ulasannya. Ternyata kini ulasan median (garisan hijau) datang kira-kira 20 jam, i.e. pada hari pertama selepas penerbitan, secara purata, lebih sedikit daripada separuh daripada semua komen pada artikel itu ditinggalkan. Dan dalam dua hari mereka meninggalkan 75% daripada semua komen. Pada masa yang sama, artikel terdahulu dibaca dengan lebih pantas - contohnya, pada tahun 2010, separuh daripada komen datang dalam 6 jam pertama.

Bagaimana saya menghuraikan Habr, bahagian 1: trend

Sungguh mengejutkan saya bahawa ulasan telah dipanjangkan: purata bilangan aksara dalam ulasan telah meningkat hampir dua kali ganda sepanjang hayat Habr!

Bagaimana saya menghuraikan Habr, bahagian 1: trend

Maklum balas yang lebih mudah daripada ulasan adalah undian. Tidak seperti banyak sumber lain, pada HabrΓ© anda boleh meletakkan bukan sahaja tambah, tetapi juga tolak. Walau bagaimanapun, pembaca tidak begitu kerap menggunakan peluang terakhir: bahagian tidak suka semasa ialah kira-kira 15% daripada semua undian yang diberikan. Dulu ada lagi, tapi lama kelamaan, pembaca semakin mesra.

Bagaimana saya menghuraikan Habr, bahagian 1: trend

Teks-teks itu sendiri telah berubah dari semasa ke semasa. Sebagai contoh, panjang biasa teks tidak berhenti berkembang dengan mantap dari pelancaran tapak, walaupun menghadapi krisis. Dalam satu dekad, teks telah menjadi hampir sepuluh kali lebih lama!

Bagaimana saya menghuraikan Habr, bahagian 1: trend

Gaya teks (untuk anggaran pertama) juga berubah. Semasa tahun-tahun pertama kewujudan Habr, sebagai contoh, bahagian kod dan nombor dalam teks meningkat:

Bagaimana saya menghuraikan Habr, bahagian 1: trend

Selepas memahami keseluruhan dinamik tapak, saya memutuskan untuk mengukur bagaimana populariti pelbagai topik berubah. Topik boleh dipilih secara automatik daripada teks, tetapi sebagai permulaan, anda tidak boleh mencipta semula roda, tetapi menggunakan tag siap pakai yang dilekatkan oleh pengarang setiap artikel. Saya telah melukis empat aliran biasa pada carta. Tema "Google" pada mulanya mendominasi (mungkin terutamanya disebabkan oleh SEO), tetapi telah menurunkan berat badan selama bertahun-tahun. Javascript telah menjadi topik popular dan terus berkembang dengan perlahan, tetapi pembelajaran mesin telah mula mendapat populariti dengan cepat hanya dalam beberapa tahun kebelakangan ini. Linux, sebaliknya, kekal relevan sepanjang dekad ini.

Bagaimana saya menghuraikan Habr, bahagian 1: trend

Sudah tentu, saya mula berminat dengan topik yang menarik lebih banyak aktiviti pembaca. Saya mengira bilangan median tontonan, undian dan ulasan dalam setiap topik. Inilah yang berlaku:

  • Topik yang paling banyak dilihat: arduino, reka bentuk web, pembangunan web, ringkasan, pautan, css, html, html5, nginx, algoritma.
  • Topik yang paling "disukai": vkontakte, humor, jquery, opera, c, html, pembangunan web, html5, css, reka bentuk web.
  • Topik yang paling dibincangkan: opera, skype, freelance, vkontakte, ubuntu, kerja, nokia, nginx, arduino, firefox.

Ngomong-ngomong, memandangkan saya sedang membandingkan topik, anda boleh menyusunnya mengikut kekerapan (dan membandingkan hasilnya dengan artikel serupa dari 2013).

  • Untuk semua tahun kewujudan Habr, tag yang paling popular (dalam susunan menurun) ialah google, android, javascript, microsoft, linux, php, apple, java, python, pengaturcaraan, permulaan, pembangunan, ios, permulaan, rangkaian sosial
  • Pada 2017, yang paling popular ialah javascript, python, java, android, pembangunan, linux, c++, pengaturcaraan, php, c#, ios, pembelajaran mesin, keselamatan maklumat, microsoft, react

Apabila membandingkan penilaian ini, seseorang boleh memberi perhatian, contohnya, kepada perarakan kemenangan Python dan kepupusan php, atau kepada "matahari terbenam" topik permulaan dan kebangkitan pembelajaran mesin.

Tidak semua tag pada HabrΓ© mempunyai pewarna tematik yang begitu jelas. Sebagai contoh, berikut adalah sedozen tag yang bertemu sekali sahaja, tetapi kelihatan lucu kepada saya. Jadi: "idea itu adalah penggerak kemajuan", "but daripada imej liut", "Negeri Iowa", "drama", "superalesh", "enjin wap", "perkara yang perlu dilakukan pada hari Sabtu", "Saya ada musang dalam pengisar daging", "ternyata seperti biasa", "kami tidak dapat menghasilkan tag lucu". Untuk menentukan subjek artikel sedemikian, tag tidak mencukupi - anda perlu menjalankan pemodelan tematik pada teks artikel.

Analisis yang lebih terperinci tentang kandungan artikel akan ada dalam catatan seterusnya. Pertama, saya akan membina model yang meramalkan bilangan paparan halaman untuk artikel berdasarkan kandungannya. Kedua, saya ingin mengajar rangkaian saraf untuk menghasilkan teks dalam gaya yang sama seperti pengarang Habr. Jadi langgan πŸ™‚

PS Dan inilah bunyi bip set data.

Sumber: www.habr.com

Tambah komen