Bagaimana saya menguraikan Habr, bagian 1: tren

Ketika Olivier Tahun Baru selesai, saya tidak melakukan apa-apa, dan saya memutuskan untuk mengunduh semua artikel dari Habrahabr (dan platform terkait) ke komputer saya dan menjelajah.

Ada beberapa cerita menarik. Yang pertama adalah pengembangan format dan topik artikel selama 12 tahun keberadaan situs. Misalnya, dinamika beberapa topik cukup indikatif. Kelanjutan - di bawah potongan.

Bagaimana saya menguraikan Habr, bagian 1: tren

Proses penguraian

Untuk memahami bagaimana Habr berkembang, perlu membaca semua artikelnya dan mengekstrak informasi meta darinya (misalnya, tanggal). Jalan pintasnya mudah, karena tautan ke semua artikel terlihat seperti "habrahabr.ru/post/337722/", dan nomornya diberikan secara berurutan. Mengetahui bahwa posting terakhir memiliki angka sedikit kurang dari 350 ribu, saya baru saja menelusuri semua id dokumen yang mungkin dalam satu lingkaran (kode 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 mencoba memuat halaman dengan id yang sesuai dan mencoba mengekstrak informasi yang bermakna dari 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 parsing, saya menemukan beberapa hal baru.

Pertama, mereka mengatakan bahwa membuat lebih banyak proses daripada inti dalam prosesor tidak berguna. Tetapi dalam kasus saya, ternyata sumber daya yang membatasi bukanlah prosesor, tetapi jaringan, dan 100 proses berjalan lebih cepat dari 4 atau, katakanlah, 20.

Kedua, di beberapa postingan terdapat kombinasi karakter khusus - misalnya eufemisme seperti "%&#@". Ternyata html.parser, yang saya gunakan pertama kali, bereaksi terhadap kombinasi &# menyakitkan, mengingat ini adalah awal dari entitas html. Saya sudah akan melakukan ilmu hitam, tetapi forum menyarankan agar Anda dapat mengubah parser saja.

Ketiga, saya berhasil membongkar semua publikasi, kecuali tiga. Dokumen bernomor 65927, 162075, dan 275987 langsung dihapus oleh antivirus saya. Ini adalah artikel, masing-masing, tentang rantai javascript yang mengunduh pdf berbahaya, ransomware SMS dalam bentuk sekumpulan plugin browser, dan situs CrashSafari.com yang mengirimkan iPhone ke reboot. Antivirus menemukan artikel lain kemudian, selama pemindaian sistem: posting 338586 tentang skrip di situs web toko hewan peliharaan yang menggunakan prosesor pengguna untuk menambang cryptocurrency. Jadi bisa dibilang kerja dari antivirus ini cukup memadai.

Artikel "langsung" ternyata hanya setengah dari potensi maksimum - 166307 buah. Selebihnya, Habr memberikan opsi "halaman sudah usang, telah dihapus atau tidak ada sama sekali". Yah, apapun bisa terjadi.

Pengunggahan artikel diikuti oleh pekerjaan teknis: misalnya, tanggal publikasi harus diubah dari format "'21 Desember 2006 pukul 10:47" menjadi standar datetime, dan penayangan "12,8 ribu" - pada 12800. Pada tahap ini, beberapa insiden lagi muncul. Yang paling lucu berkaitan dengan jumlah suara dan tipe data: beberapa posting lama memiliki luapan int dan masing-masing menerima 65535 suara.

Bagaimana saya menguraikan Habr, bagian 1: tren

Hasilnya, teks artikel (tanpa gambar) membutuhkan waktu 1.5 gigabyte, komentar dengan informasi meta - 3 lainnya, dan sekitar seratus megabyte - informasi meta tentang artikel. Ini dapat sepenuhnya disimpan dalam RAM, yang merupakan kejutan yang menyenangkan bagi saya.

Saya memulai analisis artikel bukan dari teks itu sendiri, tetapi dari informasi meta: tanggal, tag, hub, tampilan, dan suka. Ternyata dia tahu banyak.

Tren Perkembangan Habrahabr

Artikel di situs tersebut telah diterbitkan sejak 2006; paling intensif - pada 2008-2016.

Bagaimana saya menguraikan Habr, bagian 1: tren

Seberapa aktif artikel-artikel ini dibaca pada waktu yang berbeda tidaklah mudah untuk dinilai. Teks dari tahun 2012 dan yang lebih muda menerima lebih banyak komentar dan peringkat, tetapi teks yang lebih baru memiliki lebih banyak tampilan dan bookmark. Metrik ini berperilaku dengan cara yang sama (dibelah dua) hanya sekali, pada tahun 2015. Mungkin, dalam situasi krisis ekonomi dan politik, perhatian pembaca beralih dari blog IT ke masalah yang lebih menyakitkan.

Bagaimana saya menguraikan Habr, bagian 1: tren

Selain artikel itu sendiri, saya mengunduh lebih banyak komentar untuk mereka. Ada 6 juta komentar, namun 240 ribu di antaranya dilarang ("UFO terbang masuk dan menerbitkan prasasti ini di sini"). Properti komentar yang berguna adalah mereka memiliki stempel waktu. Dengan mempelajari waktu komentar, Anda dapat memahami secara kasar kapan artikel dibaca.

Ternyata sebagian besar artikel ditulis dan dikomentari antara pukul 10 pagi hingga 20 malam, mis. pada hari kerja khas Moskow. Ini mungkin berarti bahwa Habr dibaca untuk tujuan profesional, dan ini adalah cara yang baik untuk menunda pekerjaan. Omong-omong, distribusi waktu hari ini stabil dari dasar Habr hingga saat ini.

Bagaimana saya menguraikan Habr, bagian 1: tren

Namun, manfaat utama dari stempel waktu komentar bukanlah waktu, tetapi durasi "kehidupan aktif" artikel tersebut. Saya menghitung berapa waktu yang didistribusikan dari publikasi artikel hingga komentarnya. Ternyata sekarang median comment (garis hijau) masuk sekitar 20 jam, yaitu. pada hari pertama setelah publikasi, rata-rata, lebih dari setengah dari semua komentar di artikel ditinggalkan. Dan dalam dua hari mereka meninggalkan 75% dari semua komentar. Pada saat yang sama, artikel sebelumnya dibaca lebih cepat - misalnya, pada tahun 2010, setengah dari komentar masuk dalam 6 jam pertama.

Bagaimana saya menguraikan Habr, bagian 1: tren

Saya terkejut bahwa komentar telah diperpanjang: jumlah rata-rata karakter dalam komentar hampir dua kali lipat selama masa pakai Habr!

Bagaimana saya menguraikan Habr, bagian 1: tren

Umpan balik yang lebih mudah daripada komentar adalah suara. Tidak seperti banyak sumber daya lainnya, di Habré Anda tidak hanya dapat menambahkan plus, tetapi juga minus. Namun, pembaca tidak terlalu sering menggunakan kesempatan terakhir: persentase ketidaksukaan saat ini adalah sekitar 15% dari semua suara yang diberikan. Dulu ada lebih banyak, tetapi seiring waktu, pembaca menjadi lebih baik.

Bagaimana saya menguraikan Habr, bagian 1: tren

Teks itu sendiri telah berubah seiring waktu. Misalnya, panjang tipikal teks tidak berhenti bertambah dengan mantap sejak peluncuran situs, meskipun ada krisis. Dalam satu dekade, teks menjadi hampir sepuluh kali lebih panjang!

Bagaimana saya menguraikan Habr, bagian 1: tren

Gaya teks (untuk perkiraan pertama) juga berubah. Selama tahun-tahun pertama keberadaan Habr, misalnya, bagian kode dan angka dalam teks meningkat:

Bagaimana saya menguraikan Habr, bagian 1: tren

Setelah memahami keseluruhan dinamika situs, saya memutuskan untuk mengukur bagaimana popularitas berbagai topik berubah. Topik dapat dipilih secara otomatis dari teks, tetapi sebagai permulaan, Anda tidak dapat menemukan kembali roda, tetapi menggunakan tag siap pakai yang ditempelkan oleh penulis setiap artikel. Saya telah menggambar empat tren tipikal pada grafik. Tema "Google" awalnya mendominasi (mungkin terutama karena SEO), tetapi telah mengalami penurunan berat badan selama bertahun-tahun. Javascript telah menjadi topik yang populer dan terus berkembang dengan lambat, tetapi pembelajaran mesin mulai mendapatkan popularitas dengan cepat hanya dalam beberapa tahun terakhir. Linux, di sisi lain, tetap relevan sepanjang dekade ini.

Bagaimana saya menguraikan Habr, bagian 1: tren

Tentu saja, saya menjadi tertarik dengan topik apa yang menarik lebih banyak aktivitas pembaca. Saya menghitung jumlah rata-rata penayangan, suara, dan komentar di setiap topik. Inilah yang terjadi:

  • Topik yang paling banyak dilihat: arduino, desain web, pengembangan web, intisari, tautan, css, html, html5, nginx, algoritme.
  • Topik yang paling "disukai": vkontakte, humor, jquery, opera, c, html, pengembangan web, html5, css, desain web.
  • Topik yang paling banyak dibahas: opera, skype, freelance, vkontakte, ubuntu, work, nokia, nginx, arduino, firefox.

Omong-omong, karena saya membandingkan topik, Anda dapat memeringkatnya berdasarkan frekuensi (dan membandingkan hasilnya dengan artikel serupa dari tahun 2013).

  • Selama bertahun-tahun keberadaan Habr, tag paling populer (dalam urutan menurun) adalah google, android, javascript, microsoft, linux, php, apple, java, python, pemrograman, startup, pengembangan, ios, startup, jejaring sosial
  • Pada tahun 2017, yang paling populer adalah javascript, python, java, android, development, linux, c++, programming, php, c#, ios, machine learning, information security, microsoft, react

Saat membandingkan peringkat ini, Anda dapat memperhatikan, misalnya, pawai kemenangan Python dan kepunahan php, atau "matahari terbenam" topik startup dan kebangkitan pembelajaran mesin.

Tidak semua tag di Habré memiliki pewarnaan tematik yang begitu jelas. Misalnya, berikut adalah selusin tag yang bertemu hanya sekali, tetapi menurut saya lucu. Jadi: "idenya adalah kekuatan pendorong kemajuan", "boot dari gambar floppy", "Iowa State", "drama", "superalesh", "mesin uap", "hal yang harus dilakukan pada hari Sabtu", "Saya punya seekor rubah dalam penggiling daging", "dan ternyata seperti biasa", "kami tidak dapat membuat tag lucu". Untuk menentukan subjek artikel semacam itu, tag tidak cukup - Anda harus melakukan pemodelan tematik pada teks artikel.

Analisis lebih rinci tentang isi artikel akan ada di posting berikutnya. Pertama, saya akan membuat model yang memprediksi jumlah tampilan halaman untuk sebuah artikel berdasarkan kontennya. Kedua, saya ingin mengajarkan jaringan saraf untuk menghasilkan teks dengan gaya yang sama dengan penulis Habr. Jadi berlangganan 🙂

PS Dan ini bunyi bipnya Himpunan data.

Sumber: www.habr.com

Tambah komentar