5 पॉइंट द्वारा GN⁺ 2025-05-02 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • hn.unlurker.com बनाते समय लिखे गए HN API client में सभी items को क्रम से प्राप्त करने वाला scan फीचर जोड़ा और Hacker News का पूरा डेटा लोकल में डाउनलोड किया
  • hn scan --no-cache --asc -c- -o full.json चलाते समय डाउनलोड कुछ बार रुका, लेकिन resume हो सकने वाले scan की वजह से कुछ घंटों बाद 20 GiB की JSON file मिल गई
  • DuckDB के read_json_auto से JSON को table में बदला, फिर text ILIKE और 12-week moving average SQL के जरिए Python, JavaScript, Java, Ruby, Rust के mention ratios निकाले
  • सिर्फ grep से भी पता चला कि “correct horse battery staple” वाक्यांश Hacker News पर 231 बार आया है, और DuckDB इस पैमाने की one-off analysis के लिए काफी उपयुक्त लगता है
  • पूरा डेटा लोकल में होने पर Hacker News के पुराने content का कई तरीकों से analysis किया जा सकता है, लेकिन यह project यहीं समाप्त होता है और अगला कदम किसी और के आगे बढ़ाने के लिए बचा है

Hacker News के सभी items डाउनलोड करना

  • hn.unlurker.com बनाने के लिए HN API client लिखा
    • पहले से कई clients मौजूद थे, लेकिन नए project में latest Go features और linters आज़माना चाहता था
    • HN API में comments और stories को item कहा जाता है
  • client active items और item lists आदि ला सकता है
    • असली project में सिर्फ recent items की जरूरत थी, लेकिन completeness के लिए scan फीचर जोड़ा
    • scan items को 0 से latest तक या उल्टी दिशा में क्रम से डाउनलोड करता है
  • पूरा डाउनलोड दसियों हजार GiB नहीं, बल्कि कुछ दर्जन GiB JSON के आसपास होने का अनुमान था, इसलिए कोशिश की
hn scan --no-cache --asc -c- -o full.json
  • डाउनलोड कुछ बार रुक गया और CTRL-C से रोकना पड़ा, लेकिन scan resume हो सकता था, इसलिए कुछ घंटों बाद पूरा हो गया
  • परिणाम Hacker News पर हुई सारी सामग्री वाला 20 GiB JSON file है
  • वही command फिर चलाने पर इसे latest data से फिर भर सकते हैं

DuckDB से local data का analysis करना

  • शुरुआत में सिर्फ grep से search किया
    • correct horse battery staple” वाक्यांश Hacker News पर 231 बार आया
    • आखिरी occurrence लिखने के समय के हिसाब से “आज” पोस्ट किया गया item था
  • इसके बाद DuckDB से analysis करने की कोशिश की
    • DuckDB एक embeddable, तेज analytical execution engine है और command-line tool के रूप में भी उपलब्ध है
    • नए UI की वजह से beginners के लिए भी इस्तेमाल करना आसान था, और LLM ने SQL queries लिखने में मदद की
  • JSON data को DuckDB में इस तरह import किया
CREATE TABLE items AS
SELECT *
FROM read_json_auto('/home/jason/full.json', format='nd', sample_size=-1);
  • example query items को weekly basis पर group करती है और सभी items में किसी खास word के शामिल होने का ratio calculate करती है
    • python, javascript, java, ruby, rust को text ILIKE से search किया
    • हर ratio के लिए 12-week moving average calculate किया
  • इसी तरीके से database-related words को भी visualize किया
    • example graph में mysql, postgres, mongo, redis, sqlite के 12-week moving average mention ratios शामिल हैं
  • DuckDB इस size के dataset का analysis करने के लिए बहुत अच्छा लगा
  • पूरे Hacker News content की local copy मिल गई, लेकिन project को यहीं खत्म करने का फैसला किया

1 टिप्पणियां

 
GN⁺ 2025-05-02
Hacker News की टिप्पणियाँ
  • मुझे ऐसे दो डेटाबेस पता हैं जिनमें अपडेटेड Hacker News टेबल हैं, जिन पर पहले डाउनलोड किए बिना ही analysis चलाया जा सकता है
    BigQuery के लिए Google Cloud account चाहिए, और queries शायद free tier में चल जाएँगी; bigquery-public-data.hacker_news.full इस्तेमाल करें
    ClickHouse में sign up की ज़रूरत नहीं है और browser से सीधे query चला सकते हैं: https://play.clickhouse.com/play?user=play#U0VMRUNUICogRlJPT...

    • इस comment के clickhouse को भी ढूँढ निकालता है: https://play.clickhouse.com/play?user=play#U0VMRUNUICogRlJPT...
    • ClickHouse resource वाकई शानदार है। इसमें history भी है
      ClickHouse HN database के बारे में जानने से पहले ही मैंने पूरा JSON डाउनलोड करने का काम खुद करके देखा था
  • पहले @fesshole Twitter/Bluesky account के साथ कुछ ऐसा ही किया था। पूरा archive डाउनलोड किया और model को fine-tune करके उससे और भी ज्यादा पागलपन भरे confessions बनवाए
    उस पर काफी गर्व था, लेकिन आखिरकार समझ आया कि मैंने बस एक भोली-भाली machine को masturbation और divorce सिखाया था
    यह SF फिल्मों के उस scene जैसा था जहाँ aliens या superintelligent AI मानव इतिहास को बहुत तेज़ी से देखकर तय कर लेते हैं कि हम बचाए जाने लायक नहीं हैं

    • “भोली-भाली machine को masturbation और divorce” वाले हिस्से पर—मान लीजिए आपको किसी बहुत पहले खत्म हो चुकी सभ्यता की pendrive मिलती है और आप उसके text data से model train करते हैं
      अगर उस data का बाहरी दुनिया से कोई connection बिल्कुल नहीं है, तो कोई इंसान या model कैसे जान पाएगा कि उस pendrive में masturbation और divorce से जुड़ा data है?
    • मुझे समझ नहीं आता कि masturbation और divorce में समस्या क्या है। ये दोनों ही ऐसे तरीके हैं जिनसे लोग ज़्यादा खुश और स्वतंत्र जीवन जी सकते हैं, और ऐसी situations से बाहर निकल सकते हैं जो उनके लिए ठीक नहीं हैं
      मेरे हिसाब से दोनों कुल मिलाकर positive हैं, और मैं आभारी हूँ कि मैं ऐसे समाज में रह सकता हूँ जहाँ ऐसी चीज़ें normalised हैं
  • Java query में JavaScript के सारे मामले भी शामिल हो जाते हैं, इसलिए Java over-sampled है

    • उसी तरह Rust query में भी trust, antitrust, frustration जैसे ढेर सारे शब्द शामिल हो जाएँगे
    • सही है… तो शायद गिरावट दिखना उलटे और भी ज्यादा अप्रत्याशित हो सकता है
  • Hacker News पर हुई हर चीज़ वाली 20GiB JSON फ़ाइल मौजूद थी—यह सोचकर कि यह सिर्फ़ टेक्स्ट वाली साइट है, यह आकार हैरान करने वाला बड़ा लगता है
    क्या इसका मतलब है कि HN के 18 साल के अस्तित्व में लोगों ने 20 अरब bytes से ज़्यादा टेक्स्ट पोस्ट किया? औसतन रोज़ 2MB से ज़्यादा, यानी लगभग 7.5KB प्रति सेकंड

    • रोज़ 2MB बहुत ज़्यादा नहीं लगता। खासकर Reddit प्रकरण के बाद हाल के और सबसे बड़े “कभी न खत्म होने वाले September” के आने से, पोस्ट की संख्या कई सालों में exponential रूप से बढ़ी होने की संभावना है
      ऊपर से, उसमें से काफ़ी हिस्सा शायद इंसानों का नहीं होगा। /newest bot spam से भरा रहता है
    • 7.5KB/s, यानी प्रति सेकंड 7500 अक्षर, व्यावहारिक नहीं लगा, इसलिए हिसाब लगाया[0]; असल में यह लगभग 34 bytes प्रति सेकंड, यानी 0.03KB/s के करीब है
      इसमें JSON की metadata और syntax भी शामिल है, इसलिए वास्तविक टेक्स्ट की मात्रा उससे भी कम होगी। “रोज़ 2MB से ज़्यादा” वाला हिसाब सही था
      [0] दरअसल हिसाब ChatGPT ने किया था, लेकिन सही लगता है: https://chatgpt.com/share/68124afc-c914-800b-8647-74e7dc4f21...
    • Reddit का पूरा archive, API हटाए जाने से ठीक पहले के आसपास, compressed रूप में लगभग 4TB था। पहले यह the-eye पर host था, और चाहें तो आज भी कुछ जगहों से files torrent की जा सकती हैं
      उसका बड़ा हिस्सा कचरा है, लेकिन खासकर 2018–2019 में ज़्यादा चतुर bots आने से पहले का शुरुआती data देखने लायक हो सकता है
    • 20GB JSON सुनकर हैरानी होती है। मेरे पास सारे HN data वाली SQLite file है और वह 20GB की है, इसलिए JSON तो उससे कहीं बड़ा होना चाहिए लगता है
    • कुल size उल्टा छोटा लगता है। यह लगभग 20 सालों में लाखों active members और कुल मिलाकर कई millions लोगों के योगदान का नतीजा है
      Facebook से पहले के मानकों से HN एक काफ़ी बड़ा social network रहा होगा, और इसका size ठीक-ठाक व सक्रिय moderation होने की वजह से इसकी value भी अच्छी है
      2019 में Google+ बंद होने पर मैंने model किया था कि उस site पर contribute किया गया text data कितना होगा
      यहाँ text data से मतलब images, audio, video जैसे media और HTML skeleton, CSS, JS जैसे अतिरिक्त page elements को छोड़कर है
      engagement बहुत कम था और औसत post करीब 120 characters की थी, इसे देखते हुए करोड़ों active accounts का 7 साल का record भी बस कुछ GiB ही था। registered profiles 4 अरब से ज़्यादा थीं, लेकिन वास्तविक activity कहीं कम थी
      Archive Team ने Internet Archive के साथ सहयोग करते हुए, लेकिन अलग से, Google+ preservation project किया था, और नतीजे मिले-जुले थे। बहुत content बचा, लेकिन उससे कहीं ज़्यादा छूट गया; comments लगभग नहीं बचे; threads हाल की लगभग 10 entries तक काट दिए गए; और search न होने से वह कुल मिलाकर कम उपयोगी रह गया। random hash के बजाय चुने हुए account name इस्तेमाल करने वाले “vanity accounts” की accessibility और भी खराब थी
      इसके अलावा, पूरी pages scrape करके online दिखने वाला रूप दोबारा बनाने की कोशिश में storage requirement बहुत बढ़ गई, जबकि site को सच में दिलचस्प बनाने वाली कई चीज़ें छूट गईं
      बड़ी आबादी के text contributions को store करना हो, तब भी storage requirement काफ़ी modest होती है। जैसे, अगर औसत online time रोज़ 45 मिनट, typing speed 45wpm, और online time का आधा हिस्सा पढ़ने के बजाय लिखने में मान लें, तो भी प्रति व्यक्ति रोज़ लगभग 1,000 words, यानी करीब 6KiB होता है। 1,000 लोगों पर 6MiB, 10 लाख लोगों पर 6GiB, और 1 अरब लोगों पर करीब 6PiB
      वास्तविक आंकड़े लगभग निश्चित रूप से इससे कम होंगे। लिखने का समय ज़्यादा आंका गया है और असल में वह शायद 10% के करीब होगा; mobile input speed भी संभवतः 20–30wpm के आसपास होगी। मसलन Facebook पर रोज़ लगभग 2.45 अरब “content pieces” आते हैं और उनमें से आधे video होते हैं। अगर प्रति post 120 characters मानें, तो text data रोज़ 300GiB से काफ़ी कम—हैरानीजनक रूप से छोटी मात्रा—होगा
      मौजूदा data collection और surveillance capitalism systems का ज़्यादातर हिस्सा location, video, online interactions, commerce जैसे data से आता है, जिसे इंसान सीधे type नहीं करते
  • HN download करते समय netiquette क्या होगी? server पर load डालने से पहले dang से पूछना चाहिए?
    या मान लें कि अब अरबों डॉलर वाली tech companies यह पहले ही कई बार कर चुकी होंगी, इसलिए यह ध्यान में भी नहीं आएगा?

    • article में भी है कि HN के पास API है, और उस पर rate limit भी नहीं है। सारा data YC company Firebase पर host है, इसलिए ठीक है
    • सचमुच एक public database मौजूद है
      https://console.cloud.google.com/marketplace/product/y-combi...
    • तीन-अक्षर वाली agencies HN aliases के साथ असली नाम जोड़ रही हों, यह संभावना भी नज़रअंदाज़ नहीं की जा सकती
    • नाम Hacker News है, तो कम से कम अच्छे अर्थों वाली hacking तो fair game है
    • अगर वह public web पर है, तो उसे पहले से ही हजारों bots scrape कर रहे होंगे
  • मैंने कुछ ऐसा ही किया था। BigQuery dataset इस्तेमाल करने की एक तरकीब अपनाई; किसी वजह से वह लगातार update हो रहा था, और data को Parquet में export करने के बाद download करके DuckDB से query किया

    • वह तरकीब नहीं, बस एक practical choice है
  • “अब जब Hacker News का सारा कंटेंट लोकल पर डाउनलोड कर लिया है, तो सैकड़ों LLM-आधारित bots को ट्रेन करके contributor के रूप में चला सकते हैं, और अतीत को हमेशा गूंजाते और recycle करते रहने वाले Chinese room vibrator के output से धीरे-धीरे, अनिवार्य रूप से, हर human text को replace कर सकते हैं”—यह मज़ाक है, लेकिन डर है कि किसी दिन कोई सच में ऐसा करने की कोशिश करेगा
    उम्मीद है ऐसा न हो, लेकिन अगर हुआ तो क्या हम उसे रोक पाएंगे?

    • समय के साथ मैं एक पुराने idea पर और अधिक भरोसा करने लगा हूं, जो लगातार ज़्यादा महत्वपूर्ण होता जा रहा है। इंसानों के बीच trust web बनाना, जिसमें कोई account इस तरह verify हो कि उसे कोई ऐसा व्यक्ति trust करता है जिसे मैं नहीं जानता, उस व्यक्ति को कोई ऐसा व्यक्ति trust करता है जिसे मैं जानता हूं, और उस व्यक्ति को मैं trust करता हूं
      हल करने के लिए कई समस्याएं हैं, और privacy भी उनमें से एक है। connections को user के सामने उजागर करने की ज़रूरत नहीं है, लेकिन naïve implementation में वे server पर रह जाएंगे
      distrust paths को negative weights के रूप में भी जोड़ा जा सकता है। अगर आप सीधे या indirectly किसी पर distrust करते हैं, तो मेरे और उस व्यक्ति को जोड़ने वाली trust chain की value कम हो जाए
      चूंकि यह एक network है, system को manipulate करने की कोशिशों के खिलाफ यह खुद adjust हो सकता है, लेकिन यह कितना robust होगा, यह अब भी सवाल है
    • आपको कैसे पता कि यह पहले से नहीं हो रहा है?
      लंबे और content वाले comments आम तौर पर पहचाने जा सकते हैं, लेकिन 1–2 साल पहले की तुलना में यह बहुत कठिन हो गया है। छोटे एक-दो sentence वाले comments के लिए, मुझे लगता है LLM अब इतना अच्छा हो गया है कि इंसान जैसा pass हो सके
    • हमारे LLM सिर्फ कई sources से confirmed results ही दे सकते हैं, इसलिए वे इंसान के average response ही output करते हैं
      इसके उलट HN के कई comments average popular thinking से हटकर काफी unique insights होते हैं। अगर LLM इसकी नकल करने की कोशिश करे, तो वह बस nonsense देगा
      अगर उस nonsense पर ऐसा filter लगा दें जो केवल rational और समझ में आने वाले answers pass करे, तो जवाब boring हो जाएंगे और फिर भी nonsense के करीब ही रहेंगे
      answers को accurate, precise और unique बनाना है तो LLM के अलावा किसी चीज़ का इस्तेमाल करना होगा
    • HN के पास इस तरह की चीज़ों के लिए पहले से काफी अच्छा immune system है। low-effort और repetitive comments जल्दी downvote, flag और rate-limit हो जाते हैं
      site के karma और rate heuristics flashy machine learning की तुलना में crude हैं, लेकिन community Reddit या Twitter की तुलना में छोटी है और moderators सीधे intervene करते हैं, इसलिए वे काम करते हैं
      LLM fake accounts के झुंड को human text “replace” करना है तो उन्हें लगातार ऐसी posts करनी होंगी जो लोगों को सच में interesting लगें। वरना वे बहुत पहले ही limit हो जाएंगे या चुपचाप हटा दिए जाएंगे
      कुछ AI accounts को जिंदा भी रखें तो marginal cost बड़ी है। 24 घंटे दर्जनों नए threads पर inference चलाना free नहीं है, और output को आम SEO garbage में फिसलने से बचाए रखना भी हैरानी की हद तक कठिन है
      revenue भी असल में नहीं है। HN traffic को monetize नहीं कर सकते, और karma bot operators के लिए बहुत खराब currency है
      क्या resource वाला persistent bad actor रोका जा सकता है? शायद हां, लेकिन countermeasures वही होंगे जो अभी हैं: strong rate limits, नए accounts की caps को कड़ा करना, human operators की review, और शायद कुछ stylometry
      legitimate नए users के लिए यह annoying होगा, लेकिन fatal नहीं। आखिर HN इसलिए बचा है क्योंकि यहां मौजूद इंसान दूसरे इंसानों की लिखी चीज़ें पढ़ना चाहते हैं। अगर comments stochastic parrots जैसे लगने लगें, तो readers उन्हें ignore या flag करेंगे, और bots आपस में बात करते रह जाएंगे
      GPT-3o ने लिखा
    • Metal Gear franchise[0], dead internet theory[1] वगैरह ने पहले ही इस तरह के trend का अंदाज़ा लगाया था
      “Metal Gear Solid 2 में Hideo Kojima की ambitious script को कभी-कभी postmodern video game का पहला उदाहरण माना गया, और यह भी कहा गया कि उसने post-truth politics, fake news, echo chambers और alternative facts जैसी concepts की पहले से कल्पना कर ली थी”
      [0] https://en.wikipedia.org/wiki/Metal_Gear
      [1] https://en.wikipedia.org/wiki/Dead_Internet_theory
  • मुझे लगता है कि अगले कुछ सालों में कई APIs सिर्फ DuckDB file लौटाने का option देना शुरू कर देंगी
    अगर वैसे भी JSON को database में load करना है, तो response के रूप में database ही क्यों न लिया जाए

    • DuckDB 1.2 file से export किया गया zstd Parquet 2–3 गुना बेहतर compress होता है
  • कृपया stacked charts का इस्तेमाल न करें। मुझे लगता है कि reader की impression को distort न करना लगभग असंभव है
    noise में किसी खास data point की height का अंदाज़ लगाना बहुत मुश्किल होता है, और यह शायद मौजूद न होने वाली dependency का संकेत देता है

    • मेरा भी पहला विचार यही था। uPlot के author के पास trap अच्छी तरह दिखाने वाला demo है: https://leeoniya.github.io/uPlot/demos/stacked-series.html
    • सही है :( लेकिन वही data line graph में plot करने पर इतना overlap हो रहा था कि कुछ भी देखना मुश्किल था
      अगली बार मैं region के हिसाब से केवल एक series वाले कई line graphs को align करके stack करने का तरीका सोच रहा हूं
    • 3D approach इस समस्या को solve करती है। stack करें लेकिन थोड़ा offset दें, तो game engine technology को असली business intelligence में इस्तेमाल करके बड़े data को एक बार में समझने के लिए इससे बेहतर कुछ नहीं
      https://flowimmersive.com/ का काम देखें
    • log y-axis वाले stacked plot के बारे में क्या सोचते हैं? कुछ physics experiments हमेशा ऐसा ही करते हैं[1], लेकिन मुझे यह काफी unintuitive लगता है
      [1]: https://atlas.web.cern.ch/Atlas/GROUPS/PHYSICS/PUBNOTES/ATL-...
  • मैंने पहले एक बनाया था, और https://github.com/ashish01/hn-data-dumps काफी मज़ेदार था
    इसे implement करने के लिए एक बढ़िया feature यह होगा कि यह बात reflect हो कि हाल के items समय के साथ ज़्यादा बार update होते हैं, इसलिए हाल में download किए गए items, पुराने items की तुलना में जल्दी stale cache बन जाते हैं

    • यह वाकई अच्छा है कि HN कई दूसरी sites की तरह इसे lock down नहीं करता और ऐसी API देता है
      मैंने staleness तय करने के लिए age-based function इस्तेमाल किया। शुरुआत में creation के 1–2 मिनट बाद से इसे stale मानता है, फिर कुछ दिनों तक अक्सर refresh करता है, और पहले हफ़्ते के बाद तेज़ी से कम करता है ताकि करीब 2 हफ़्ते बाद इसे immutable treat किया जाए
      // DefaultStaleIf marks stale at 60 seconds after creation, then frequently for the first few days after an item is
      // created, then quickly tapers after the first week to never again mark stale items more than a few weeks old.
      const DefaultStaleIf = "(:now-refreshed)>" +
      "(60.0*(log2(max(0.0,((:now-Time)/60.0))+1.0)+pow(((:now-Time)/(24.0*60.0*60.0)),3)))"
      https://github.com/jasonthorsness/unlurker/blob/main/hn/core...