Како сам анализирао Һабр, први део: трендови

Када је новогодишњи Оливије био завршен, нисам имао шта да радим и одлучио сам да преузмем све чланке са Хабрахабра (и сродних платформи) на свој рачунар и истражим.

Било је неколико занимљивих прича. Први од њих је развој формата и тематика чланака током 12 година постојања сајта. На пример, динамика неких тема је прилично индикативна. Наставак - испод реза.

Како сам анализирао Һабр, први део: трендови

Процес парсирања

Да бисмо разумели како се Хабр развијао, било је потребно проћи кроз све његове чланке и извући мета-информације из њих (на пример, датуме). Заобићи је било лако, јер везе ка свим чланцима изгледају као „хабрахабр.ру/пост/337722/“, а бројеви су дати стриктно по реду. Знајући да последњи пост има број нешто мањи од 350 хиљада, управо сам прошао кроз све могуће ИД документа у петљи (Питхон код):

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

Функција download_document покушава да учита страницу са одговарајућим ИД-ом и покушава да издвоји значајне информације из хтмл структуре.

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)

У процесу рашчлањивања открио сам неколико нових ствари.

Прво, кажу да је стварање више процеса него што има језгара у процесору бескорисно. Али у мом случају се показало да ограничавајући ресурс није процесор, већ мрежа, а 100 процеса ради брже од 4 или, рецимо, 20.

Друго, у неким објавама су постојале комбинације специјалних знакова - на пример, еуфемизми попут "%&#@". Испоставило се да html.parser, који сам први користио, реагује на комбинацију &# болно, сматрајући то почетком хтмл ентитета. Већ сам хтео да урадим црну магију, али форум је предложио да једноставно промениш парсер.

Треће, успео сам да истоварим све публикације, осим три. Документе под бројевима 65927, 162075 и 275987 је одмах избрисао мој антивирус. Ово су чланци о јавасцрипт ланцу који преузима злонамерни пдф, СМС рансомваре у облику скупа додатака за претраживач и сајт ЦрасхСафари.цом који шаље иПхоне уређаје у поновно покретање. Антивирус је открио још један чланак касније, током скенирања система: објавите 338586 о скриптама на веб локацији продавнице кућних љубимаца које користе процесор корисника за рударење криптовалуте. Дакле, можемо сматрати да је рад антивируса сасвим адекватан.

Испоставило се да су "живи" чланци само половина потенцијалног максимума - 166307 комада. Што се осталог тиче, Хабр даје опције „страница је застарела, обрисана или уопште није постојала“. Па, свашта се може догодити.

Учитавање чланака је праћено техничким радом: на пример, датуми објављивања су морали да се конвертују из формата "'21. децембар 2006. у 10:47 ујутру" у стандардни datetime, и "12,8к" прегледа - у 12800. У овој фази, изашло је још неколико инцидената. Најсмешнија је везана за пребројавање гласова и типове података: неки стари постови су имали инт оверфлов и добили су по 65535 гласова.

Како сам анализирао Һабр, први део: трендови

Као резултат тога, текстови чланака (без слика) су ми узели 1.5 гигабајта, коментари са метаинформацијама – још 3, и стотинак мегабајта – метаинформације о чланцима. Ово се може у потпуности чувати у РАМ-у, што је за мене било пријатно изненађење.

Анализу чланака нисам започео од самих текстова, већ од мета-информација: датума, ознака, чворишта, прегледа и лајкова. Испоставило се да може много тога да исприча.

Хабрахабр развојни трендови

Чланци на сајту се објављују од 2006. године; најинтензивније - 2008-2016.

Како сам анализирао Һабр, први део: трендови

Колико су ти чланци активно читани у различито време, није тако лако проценити. Текстови из 2012. године и млађи добили су више коментара и оцена, али новији текстови имају више прегледа и обележивача. Ови показатељи су се понашали на исти начин (преполовљени) само једном, у 2015. Можда се у ситуацији економске и политичке кризе пажња читалаца померила са ИТ блогова на болније теме.

Како сам анализирао Һабр, први део: трендови

Поред самих чланака, преузео сам још коментара на њих. Било је 6 милиона коментара, међутим, 240 хиљада њих је забрањено („улетео је НЛО и објавио овај натпис овде“). Корисно својство коментара је да имају временску ознаку. Проучавањем времена коментара можете отприлике схватити када се чланци уопште читају.

Испоставило се да је већина чланака и написана и коментарисана негде од 10 до 20 часова, тј. на типичан московски радни дан. То може значити да се Хабр чита у професионалне сврхе и да је ово добар начин да се одуговлачи на послу. Иначе, овакав распоред доба дана је стабилан од самог оснивања Хабра до данас.

Како сам анализирао Һабр, први део: трендови

Међутим, главна предност временске ознаке коментара није доба дана, већ трајање „активног живота“ чланка. Израчунао сам како је распоређено време од објављивања чланка до његовог коментара. Испоставило се да сада средњи коментар (зелена линија) долази за око 20 сати, тј. првог дана након објављивања, у просеку, остане нешто више од половине свих коментара на чланак. И за два дана оставе 75% свих коментара. Истовремено, ранији чланци су читани још брже – на пример, 2010. године половина коментара долазила је у првих 6 сати.

Како сам анализирао Һабр, први део: трендови

Изненадило ме је да су се коментари продужили: просечан број знакова у коментару се скоро удвостручио током трајања Хабра!

Како сам анализирао Һабр, први део: трендови

Гласови су лакше повратне информације од коментара. За разлику од многих других ресурса, на Хабре можете ставити не само плусеве, већ и минусе. Међутим, читаоци не користе тако често последњу прилику: тренутни удео дислајкова је око 15% свих датих гласова. Некада их је било више, али су временом читаоци постали љубазнији.

Како сам анализирао Һабр, први део: трендови

Сами текстови су се временом мењали. На пример, типична дужина текста не престаје да расте од самог покретања сајта, упркос кризама. За деценију текстови су постали скоро десет пута дужи!

Како сам анализирао Һабр, први део: трендови

Променио се и стил текстова (у првим оквирима). Током првих година постојања Хабра, на пример, повећао се удео кода и бројева у текстовима:

Како сам анализирао Һабр, први део: трендови

Након што сам разумео укупну динамику сајта, одлучио сам да измерим како се променила популарност различитих тема. Теме се могу аутоматски бирати из текстова, али за почетак, не можете поново измислити точак, већ користити готове ознаке које постављају аутори сваког чланка. Нацртао сам четири типична тренда на графикону. Тема „Гугл“ је у почетку доминирала (можда углавном због СЕО-а), али је током година губила на тежини. Јавасцрипт је био популарна тема и наставља полако да расте, али машинско учење је почело брзо да добија на популарности тек последњих година. Линукс је, с друге стране, остао подједнако релевантан током читаве деценије.

Како сам анализирао Һабр, први део: трендови

Наравно, заинтересовало ме је које теме привлаче више читалачке активности. Израчунао сам средњи број прегледа, гласова и коментара у свакој теми. Ево шта се догодило:

  • Најгледаније теме: ардуино, веб дизајн, веб развој, дигест, линкови, цсс, хтмл, хтмл5, нгинк, алгоритми.
  • Највише „лајковане“ теме: вконтакте, хумор, јкуери, опера, ц, хтмл, веб развој, хтмл5, цсс, веб дизајн.
  • Највише дискутоване теме: опера, скајп, фрееланце, вконтакте, убунту, посао, нокиа, нгинк, ардуино, фирефок.

Иначе, пошто упоређујем теме, можете их рангирати по учесталости (и упоредити резултате са сличан чланак из 2013).

  • За све године постојања Хабра, најпопуларнији тагови (у опадајућем редоследу) су гоогле, андроид, јавасцрипт, мицрософт, линук, пхп, аппле, јава, питхон, програмирање, стартупс, девелопмент, иос, стартуп, друштвене мреже
  • У 2017. години најпопуларнији су били јавасцрипт, питхон, јава, андроид, девелопмент, линук, ц++, програмирање, пхп, ц#, иос, машинско учење, информациона безбедност, мицрософт, реацт

Када се пореде ове оцене, може се обратити пажња, на пример, на победнички поход Пајтона и изумирање пхп-а, или на „залазак сунца” стартап тема и успон машинског учења.

Немају све ознаке на Хабреу тако очигледну тематску боју. На пример, ево десетак ознака које су се среле само једном, али су ми се учиниле смешним. Дакле: „идеја је покретачка снага напретка“, „покретање са слике дискете“, „држава Ајова“, „драма“, „супералеш“, „парна машина“, „ствари које треба урадити у суботу“, „имам лисица у машини за млевење меса", "испало је као и увек", "нисмо могли да смислимо смешне ознаке". Да бисте одредили тему таквих чланака, ознаке нису довољне - мораћете да извршите тематско моделирање на текстовима чланака.

Детаљнија анализа садржаја чланака биће у следећем посту. Прво, направићу модел који предвиђа број прегледа странице за чланак на основу његовог садржаја. Друго, желим да научим неуронску мрежу да генерише текстове у истом стилу као и аутори Хабра. Зато се претплатите 🙂

ПС А ево и звучног сигнала скуп података.

Извор: ввв.хабр.цом

Додај коментар