- BrainTools - https://www.braintools.ru -
Hacker News — это пульс мирового технологического сообщества. Тысячи разработчиков, основателей стартапов, инженеров из крупных компаний ежедневно делятся здесь инсайтами, проектами, новостями и мемами. Но есть проблема: качественный контент тонет в шуме, или интересные тебе темы тонут в неинтересных тебе темах.
Но из-за большого потока постов качественные статьи по нужной теме теряются среди других, и если нужно найти какие-то системные тренды, увидеть, как меняется отношение к Rust, AI или Open Source, а не просто «почитать что-то интересное» — это сделать сложно. Можно, да, скопировать кучу ссылок и отправить в LLM, попросив отсортировать, но это занимает время и не так удобно, если нужно проанализировать большое количество тем.
И тут мне пришла идея — создать программу на Python, которая будет парсить через официальный API Hacker News, строить эмбеддинги постов с комментариями, кластеризовать посты и при помощи LLM суммаризировать этот кластер по ссылкам.
Сказано — сделано. Я смог спарсить 100 000 постов с Hacker News за последние 693 дня, получив более тысячи кластеров, 10 миллиона апвоутов, около 27 тысяч авторов и всего 0.1% выбросов. В этой статье мы разберем, какие тренды были активны в мировом IT-сообществе последние два года.
Итак, однажды, в процессе скроллинга Hacker News в поиске вдохновения и интересных статей, я задумался: у Hacker News есть целых два API (Firebase и Algolia), так почему бы не придумать какой-нибудь проект с использованием API? Но обычный постинг в условный телеграм-канал или просто приложение показался мне скучным. Немного подумав, я пришел к идее: а почему бы не автоматизировать и не проанализировать посты на Hacker News? Это и идеи для статей, и возможность почитать и проанализировать мнения по разным темам, найти интересующие вещи.
Я начал думать, какие технологии пригодятся. Просто кидать LLM ссылки и просить выделить темы — скучно. Я решил пойти путем другим, через создание ETL (Extract-Transform-Load) пайплайна. Сначала мы парсим сами статьи, и если позволяет rate-limit — то и 3–5 комментариев к ним. После мы формируем из них объекты данных, которые в последующем через трансформер all-MiniLM-L6-v2 преобразуем в эмбеддинги. Эти самые эмбеддинги кластеризируются через HDBSCAN, а затем LLM анализирует и создает заголовок и саммари для каждого из кластеров. И в конце — создаем JSON и HTML-файл, графики различные. Для работы с LLM я использовал BotHub API [1].
Конечно, в процессе разработки я сталкивался с проблемами, например: оптимизация запросов к API, настройка кластеризации с маленьким выбросом (то есть некластеризированными статьями), работа с LLM через API, конфигурация и сам пайплайн. Но итоговый результат того стоил — за несколько минут мы получаем двухлетний срез всех мнений в IT-сообществе.
Сам исходный код программы, которую я разработал для сбора данных, вы можете прочитать в моем репозитории [2]. Перед тем как начать разбор, хочу сказать, что я также сделал онлайн-карту историй, доступную по этой ссылке [3]. Для анализа требуется файл кластеризации: вы можете сгенерировать его сами через мой репозиторий или скачать готовый файл кластеризации hn_clusters.json [4].
В этой статье я разберу, какую работу я проделал, а также проанализирую графики, кластеры и статистику, и узнаем, что было на уме в IT-сфере последние годы.
Я решил создать ETL-пайплайн для того, чтобы грамотно собрать все данные и кластеризировать всё. Пайплайн состоит из четырёх логических этапов: извлечение, трансформация, кластеризация и суммаризация.

Начнем с этапа извлечения данных. Тут довольно интересно: Hacker News имеет два официальных API — Firebase Hacker News API [5] и Algolia API [6]. Firebase дает прямой доступ к сырым данным в реальном времени. Отлично подходит для мониторинга новых постов, но для анализа вглубь, увы, неудобен: нужно проходиться по всем ID, делать сотни запросов к /item/, фильтрация и сортировка — на стороне клиента. А вот Algolia удобен и своим поисковым движком, и готовыми индексами. Он позволяет фильтровать, сортировать, ограничивать по дате и скору, и поэтому я выбрал его.
Но у Algolia есть лимиты и ограничения, например не более 1000 постов за раз.
У меня в коде, в части связанной с фильтрацией, есть параметр search_by_date. Если он False, то мы используем API-эндпоинт https://hn.algolia.com/api/v1/search, и он отдает по релевантности. А по умолчанию он равен True, и используется уже API-эндпоинт https://hn.algolia.com/api/v1/search_by_date. Вместо того чтобы запрашивать страницы подряд, я использую параметр created_at_i<{timestamp} и двигаюсь назад во времени. Механика простая: запросили 100 постов с датой меньше текущей, взяли минимальную дату из ответа, подставили ее в следующий запрос. Так можно собрать хоть 100 000 постов — пока не упремся в max_pages или не кончатся данные.
Также есть и фильтрация через QueryParams, который строит словарь для передачи в API.
class QueryParams(BaseModel):
query: str | None = None
tags: list[str] | None = None
numeric_filters: str | None = None
filters: str | None = None
hitsPerPage: int = 100
page: int = 0
def build_dict(self) -> dict[str, Any]:
params: dict[str, Any] = {}
for field in self.model_fields:
value = getattr(self, field)
if value is None:
continue
if isinstance(value, list):
value = ",".join(value)
params[_PARAM_ALIASES.get(field, field)] = value
return params
Кроме того, есть AlgoliaStoryFilter — это абстрактный класс для удобного создания различных фильтров:
class AlgoliaStoryFilter(ABC):
@abstractmethod
def apply(self, stories: list[Story]) -> list[Story]: ...
def numeric_filters(self) -> list[str]:
return []
def query_tags(self) -> list[str]:
return []
class DateRangeFilter(AlgoliaStoryFilter):
...
class MinScoreFilter(AlgoliaStoryFilter):
...
class AuthorFilter(AlgoliaStoryFilter):
...
class KeywordFilter(AlgoliaStoryFilter):
...
А также есть сортировка:
class StorySorter:
@staticmethod
def by_score(stories: list[Story], reverse: bool = True) -> list[Story]:
return sorted(stories, key=lambda s: s.score or 0, reverse=reverse)
@staticmethod
def by_date(stories: list[Story], reverse: bool = True) -> list[Story]:
return sorted(
stories,
key=lambda s: s.created_at or datetime.min.replace(tzinfo=timezone.utc),
reverse=reverse,
)
@staticmethod
def by_alphabetical(stories: list[Story], reverse: bool = False) -> list[Story]:
return sorted(stories, key=lambda s: s.title or "", reverse=reverse)
После загрузки постов я параллельно подгружаю комментарии — отдельным запросом с tags=comment и filters=story_id={id}. Максимальное число комментариев на пост регулируется через max_comments_per_story, чтобы не перегружать LLM на этапе суммаризации.
Всё это работает уже через наши DTO: Story и Comment:
class Comment(BaseModel):
id: int
text: str
created_at: str
author: str | None = None
story_id: int | None = None
@property
def clean_text(self) -> str:
return strip_html(self.text)
@property
def length(self) -> int:
return len(self.clean_text)
class Story(BaseModel):
id: int
title: str
url: str | None
created_at: datetime | None
author: str
score: int
tags: list[str] = Field(default_factory=list)
comments: list[Comment] = Field(default_factory=list)
embedding: list[float] | None = None
cluster_label: int | None = None
pos_x: float | None = None
pos_y: float | None = None
@property
def hn_url(self) -> str:
return f"https://news.ycombinator.com/item?id={self.id}"
@property
def embedding_text(self) -> str:
parts = [self.title] * settings.embedding_title_repeats
for comment in self.comments[: settings.embedding_max_comments]:
snippet = comment.clean_text[: settings.embedding_comment_chars]
if snippet:
parts.append(snippet)
return "n".join(parts)[:_MAX_EMBEDDING_TEXT_CHARS]
Комменты предварительно также очищаются от HTML-символов, чтобы не было мусора во время превращения в вектор.
Следующий этап — трансформация, то есть превращение данных в векторы, эмбеддинги.
Текст эмбеддинга формируется просто: заголовок повторяется три раза (самый сильный сигнал, чтобы комментарии не могли увести куда-то в сторону). Далее добавляем комментарии с обрезкой до 350 символов.
Как трансформер я использую all-MiniLM-L6-v2. Модель быстрая и качественная, выдает нормализованные эмбеддинги (normalize_embeddings=True), что критично для кластеризации через косинусное расстояние. Да, можно воспользоваться более качественными решениями или API, но они медленные, а в случае огромной массы историй скорость важна.
Настройки эмбеддингов у меня такие:
EMBEDDING_BATCH_SIZE=32
EMBEDDING_TITLE_REPEATS=2
EMBEDDING_MAX_COMMENTS=5
EMBEDDING_COMMENT_CHARS=256
Следующий этап — кластеризация. Тут выбор был между HDBSCAN и K-means. Я выбрал HDBSCAN, так как у KMeans нужно было знать итоговое количество кластеров, а у нас неизвестно. А также он умеет маркировать шум (noise) — посты, которые не вписались ни в один кластер.
Настройки кластеризации:
CLUSTER_MIN_SIZE=15
CLUSTER_AUTO_MIN_SIZE=false
CLUSTER_MIN_SAMPLES=3
CLUSTER_ASSIGN_OUTLIERS=true
CLUSTER_OUTLIER_THRESHOLD=0.25
UMAP_N_NEIGHBORS=30
UMAP_N_COMPONENTS=15
UMAP_MIN_DIST=0.0
CLUSTER_SELECTION_METHOD=leaf
Перед HDBSCAN я применяю UMAP с параметрами:
UMAP (Uniform Manifold Approximation and Projection) — это алгоритм снижения размерности и визуализации многомерных данных.
umap.UMAP(
n_components=12, # редуцируем 384 → 12
n_neighbors=10, # локальный контекст
min_dist=0.1, # плотность точек
metric="cosine", # расстояние для эмбеддингов
)
Редукция до 12 измерений является компромиссом: сохраняет структуру данных, но ускоряет кластеризацию. В коде также сохраняются первые две компоненты (points[:, :2]) для визуализации на карте.
А теперь к обработке выбросов. HDBSCAN обычно оставляет 10–30% точек как шум. Моя задача — минимизировать потери и стараться прийти к тому, чтобы все посты были распределены по кластерам (и чтобы кластеров было достаточно много). В коде реализован алгоритм присвоения выбросов:
# Нормализуем эмбеддинги (L2-норма)
data = embeddings / np.linalg.norm(data, axis=1, keepdims=True)
# Считаем центроиды кластеров (средний вектор)
centroids = [data[labels == cluster_id].mean(axis=0) for cluster_id in cluster_ids]
# Косинусное сходство каждой шумовой точки с центроидами
similarities = data[noise_positions] @ centroids.T
# Присваиваем, если сходство >= 0.45 (cluster_outlier_threshold)
accepted = similarities.max(axis=1) >= 0.45
labels[noise_positions[accepted]] = cluster_ids[best[accepted]]
Порог 0.45 отсекает точки, которые слишком далеки от любого кластера. В результате из 100 000 постов только 0.11% остались некластеризованными. Это говорит о том, что UMAP + HDBSCAN с правильными параметрами (плюс релевантная выборка) отлично разделяет темы.
Кластеры, безусловно, это очень хорошо. Но мне показалось, просто смотреть сырые данные может быть трудозатратным, а то и вовсе скучным. Поэтому я решил реализовать суммаризацию через API к LLM, через openai-совместимый шлюз.
У нашего сервиса [BotHub](реферальной ссылке](https://bothub.ru/?invitedBy=zx7xIePYIOcWHhTfgg6-O [7]) есть несколько преимуществ: можно оплачивать тарифы с российских банковских карт и иметь доступ практически ко всем нейросетям, включая новейшие, по низким ценам (иногда даже ниже, чем OpenRouter). Пайплайн и чат-бот в онлайн-карте работают через BotHub, и вы можете получить 300 тысяч бесплатных CAPS, перейдя по реферальной ссылке [7], если захотите сами запустить пайплайн.
Используя модель gpt-5.6 luna, я потратил всего ~0.09$ (1 069 550 токенов) за один полный прогон пайплайна.

После регистрации для получения API-ключа достаточно приобрести CAPS (внутренняя валюта для токенов) и зайти в раздел для разработчиков [1]. Документацию по ней можно найти здесь [8]. Также API поддерживает Batches API [9].

Получив токен, вы можете обращаться через библиотеку openai, поставив как url https://openai.bothub.chat/v1 и вставив свой токен:
self._client = AsyncOpenAI(
api_key=key,
base_url=base_url or settings.ai_base_url,
timeout=settings.ai_request_timeout,
)
Я взял за основу модель gpt-5.6 luna [10]. Она дешевая и быстрая, а для наших требований больше и не надо.
На вход модели подается сжатое представление кластера:
for story in top_stories[:ai_max_stories_in_prompt]: # 30 постов по умолчанию
lines.append(f"- ({story.score} points) {story.title}")
for comment in story.comments[:ai_max_comments_in_prompt]: # 3 комментария
snippet = truncate(comment.clean_text, ai_prompt_comment_chars) # 338 символов
Чтобы парсить ответы машинно, в system-промпте жестко задан формат:
system = (
"You are an expert analyst of Hacker News discussions. You receive "
f"{len(batch)} cluster(s) of related posts with comment snippets. "
"Answer ONLY with a valid minified JSON array containing exactly one "
f"object per cluster, in input order, in the format {_JSON_SPEC}. "
f"Write all fields in {settings.ai_summary_language}. For each "
"cluster: 'index' repeats its cluster number; 'title' must name the "
"concrete shared topic (a product, technology, company or event) — "
"never a vague heading like 'Tech Discussions'; 'description' must "
"state what unites the posts, the community's dominant opinion, and "
"any notable disagreement or concern; 'sentiment' is the overall "
"tone of the discussion: 'positive', 'negative', 'mixed' when "
"opinions clearly split, or 'neutral' for factual discussions. "
"No markdown, no extra keys, no text outside the JSON array."
)
return [
{"role": "system", "content": system},
{"role": "user", "content": "nn".join(sections)},
]
Тональность (sentiment) вычисляется на основе дискуссии внутри кластера, она может быть positive (хвалят и восторгаются), negative (критикуют), mixed (мнения разделены), neutral (нейтрально).
Через пайплайн в итоге формируется HTML-отчёт и JSON-файл с данными кластеризации (его вы как раз и можете загрузить на моём сайте [3]).
{
"metadata": {
"total_stories": 100000,
"elapsed_seconds": 3249.432794319,
"clusters_count": 1272,
"outliers_count": 103,
"generated_at": "2026-09-05T23:02:31.692155"
},
"clusters": [
{
"label": 878,
"size": 575,
"total_score": 87277,
"total_comments": 10,
"avg_score": 151.78608695652173,
"display_title": "Large Language Model Debate",
"summary": {
"title": "Large Language Model Debate",
"description": "The posts examine how LLMs work, their coding capabilities, practical workflows, risks, and effects on software careers. The community is deeply engaged but divided, with enthusiasm about learning and productivity balanced by concerns about hallucinations, poisoning, limited reasoning, and displacement.",
"sentiment": "mixed",
"model": "gpt-5.6-luna"
},
"stories": [...]
}
...
]
}
Пора перейти к самому интересному — какие были получены результаты? Я проанализировал ровно 100 000 последних постов на Hacker News и получил:
1272 кластера
103 неклассифицированных
3400 комментариев
10 412 апвоутов
в среднем 104 апвоута на пост
27 223 автора
за 694 дня
1 069 550 токенов потрачено
1 069 550 в моем случае стоило всего около 0.09 $ (если быть точными, то 0.09209)! В пересчете на кластер, это всего лишь 0.000072398 $ на кластер!
Давайте разберем графики. Первый — это количество постов в день. Если внимательно приглядеться, можно заметить постепенный рост популярности Hacker News через большее количество постов.
Чтобы отсортировать малопопулярные статьи, я выставил фильтрацию по score > 10, так что можно увидеть распределение. Естественно, с 10 до 24 апвоутов — самый большой столбец, с 25 до 499 — примерно от 20 до 10 тысяч постов, а 500+ набрали всего лишь около 3 тысяч постов.
Также видно на графике распределения кластеров по настроению, что «позитивных» постов чуть больше, чем «негативных», но смешанных намного больше, а нейтральных — меньшинство.
А ниже вы можете увидеть саму карту кластеров:
И как видно по таблице ниже, почти все топ-посты так или иначе связаны с ИИ и LLM.
Крупнейшие кластеры видны на графике ниже. Опять же, половина связана с ИИ (6 из крупнейших кластеров). А также виден большой интерес [11] к опенсорсу!
А если посмотреть по скору, то видно, что на первом месте опять LLM и опять 6 кластеров связаны с ИИ. Но остальные уже более технические, связанные с проектами, чаще всего опенсорса.
Ниже график распределения размеров кластеров. Ось Y — количество кластеров, ось X — количество постов.
Ниже — топ авторов по количеству постов.
А ниже — топ источников, опубликованных на Hacker News. Здесь расположился на первом месте с большим отрывом GitHub.

Если рассмотреть дни недели, видно, что в основном статьи на Hacker News выходят в будние дни.
А если посмотреть распределение по часам, видно, что большинство постов публикуются с 12 до 24 часов, и основной поток — днём.
А вот ниже можно рассмотреть тональность по месяцам (красная — негативная, зелёная — позитивная, жёлтая — смешанная, серая — нейтральная). Интересно, что позитивная линия и негативная линия идут рука об руку, кроме периода с 02.25 до 04.25. А нейтральная и смешанная всегда примерно на одном уровне.
А теперь давайте разберем конкретные тренды и кластеры!
В этом блоке я разберу самые интересные крупнейшие кластеры. Вы можете сами изучить все остальные кластеры на моём сайте [3].
AI — безусловный лидер обсуждений. Но тут мнения совершенно полярные. Одни критикуют, и нарастающий кластер «AI Fatigue» показывает, что люди устали от хайпа, начинают критиковать качество, стоимость и этику ИИ.
Как мы видим на графиках, это очень яркий кластер, который посвящён ругани на ИИ. Основные тезисы этого кластера заключаются в том, что качество AI-сгенерированной работы снижается, появляется необходимость проверять результат. Появляются когнитивные издержки в виде синдрома самозванца, ослабления понимания и компетенций. А также интересно, что акцентируется внимание [12] на ИИ-агентах и желании популяризировать локальные модели. Кроме технических, упоминается и просто усталость и перегрузка от AI-тематики. Встречаются и контраргументы: аккуратное применение AI действительно может повышать продуктивность.
Кластер, похожий на предыдущий, но более сфокусирован на влиянии на социум и развитие. Обсуждаются темпы и пределы развития искусственного интеллекта [13], а также слежка, нарушения на рабочем месте, атрофия навыков, риски для безопасности, зависимость и негативная реакция [14] общественности. Преобладающий тон — скептический и тревожный, хотя некоторые авторы утверждают, что прогресс реален, формальная проверка и другие области принесут пользу, а оппозиция не должна превращаться в огульную шумиху против искусственного интеллекта. Это показывает самая горячая статья — Don’t fall into the anti-AI hype [15].

Кстати, если сравнить с предыдущим кластером, можно увидеть следующее:


Крупнейший кластер. Если верить ИИ, делающему суммаризацию этого кластера:
The posts examine how LLMs work, their coding capabilities, practical workflows, risks, and effects on software careers. The community is deeply engaged but divided, with enthusiasm about learning and productivity balanced by concerns about hallucinations, poisoning, limited reasoning, and displacement.
Тональность здесь смешанная, с высокой вовлечённостью и заметным расколом мнений. Главные темы — это принципы работы LLM, программирование с их помощью и их ограничения в виде галлюцинаций (кстати, вы можете почитать в нашем блоге две статьи на тему галлюцинаций нейросети: часть 1 [16] и часть 2 [17]). Также в этом кластере есть обсуждения на тему обучения [18], открытой инфраструктуры и применения LLM в проектах.

Также тут топ-источник — не GitHub, а arXiv.
Есть и позитивный кластер в виде постов под тематикой Show HN.

Сообщество в целом поддерживает и обсуждает независимые проекты. Главные темы тут — инди-игры, творческие эксперименты, утилиты, образовательные инструменты и персональные проекты. Дискуссия «Is Show HN dead? No, but it’s drowning» [19], несмотря на критический заголовок, показывает, что есть и критическое видение.
Так как Open Source — неотъемлемая часть IT-сообщества, эта тема есть и в кластерах. Тут рассказывается о проектах с открытым исходным кодом, лицензиях, бесплатных инструментах для разработчиков, поддержке мейнтейнеров. Настроения в целом позитивны, но опасения по поводу прав на повторную выдачу лицензий, моделей, основанных на источниках, корпоративного поведения [20], финансирования и устойчивости создают некоторую напряжённость.

Ну и стоит помнить, что Hacker News организован YC — успешным стартап-акселератором. И поэтому лидер выборки — история о релицензировании проекта компанией из YC [21].
Но есть разрыв между средним и топовыми историями: средний скор — 126, тогда как максимум — 947.
Этот кластер даёт понять, что Python активно живёт и развивается и не планирует сдавать позиции.

Посты здесь сфокусированы на Python 3.14 и 3.15. Поднимаются темы субинтерпретаторов, тайп-чекеров, пакетников, lazy-импортов, freethreading. Энтузиазм за модернизацию идёт рука об руку со спорами о типизации в Python и переусложнении. Также есть дискуссии об экосистеме Python и проектах на нём.
Самая горячая история здесь — это Ty: A fast Python type checker and language server [22], новый проект от astral-sh, создателей uv.
Среди источников можно достаточно много найти ссылок на дискуссии, форумы, документацию Python и связанными с ним проектами.

Неожиданно, но разработка языков программирования интересна многим разработчикам. Да и в последнее время много внимания нетрадиционным языкам, индустрия постепенно меняется.

В статьях рассматриваются новые и необычные языки программирования, принципы проектирования языков, системы типов, компиляторы, визуальное программирование и исторические влияния. Верхушка выборки сильно сосредоточена вокруг языкового дизайна и историко-концептуальных материалов, а не только вокруг анонсов новых языков.
Также показывает популярность и язык программирования Rust. В этом кластере рассказывается о Rust, инструментах, компиляторах, базах данных, улучшениях безопасности и внедрении в системное программное обеспечение. Преобладает энтузиазм по поводу безопасности и производительности Rust, но остаются разногласия по поводу сложности асинхронности, рисков для экосистемы, совместимости и того, можно ли широко заменить C или C++.

Самый горячий пост тут — Postgres rewritten in Rust, now passing 100% of the Postgres regression tests [23].
Сам кластер довольно растущий по трендам, хоть и фанатизм пропадать стал. Высокий интерес вызывают критические материалы: «Async Rust never left the MVP state» [24], а также возврат с Rust на C++ [25].

Практически сразу за Rust идёт кластер про Go, где рассказывается о его релизах, ошибках компилятора, инструментах, обобщениях, производительности, безопасности, разработке с использованием искусственного интеллекта и практическом использовании экосистемы. Сообщество ценит простоту и продуктивность Go, но периодически критикует языковые ограничения и компромиссы в дизайне.

Совершенно неожиданно, но относительно большой кластер связан с Lisp, да ещё и кластер позитивный (а Rust, Go и Python были смешанными). В публикациях отмечаются выразительный дизайн Lisp, гомоиконность, образовательная ценность, интерактивная разработка и постоянная активность в Common Lisp, Scheme, Emacs Lisp и более новых диалектах. Преобладающее мнение однозначно положительное, хотя в некоторых дискуссиях признаётся нишевый статус Lisp, ограничения в инструментарии и неуверенность в более широком внедрении.

А также заметно, что большое количество постов — рассказы о том, почему именно Lisp.

Тема взломов и исследований в сфере безопасности всегда актуальна, так что и обнаружился кластер, где рассказывается об уязвимостях, социальной инженерии, вредоносных программах. Сообщество восхищено творческим подходом и образовательной ценностью исследований в области безопасности, но по-прежнему обеспокоено слабой защитой, возможностью использования, плохим отношением к исследователям и ущербом, причиняемым реальными атаками.

Анализируя два года постов на Hacker News, можно понять основные устойчивые тренды в мире ИТ. AI — главная тема, но дискуссия вокруг него расколота. Сообщество не может прийти к единому мнению: одни видят в AI новый инструмент, другие — угрозу или шум, а третьи против и первых, и вторых. А Open Source переходит в фазу «взросления». Вопросы лицензирования, финансирования и борьбы с нейрослопом заставляют сообщество адаптироваться.
Настроение, кстати, колеблется. Оптимизм сменяется тревогой, особенно в контексте AI и экономической нестабильности. Hacker News для многих публикуется в рабочие дни, что можно было увидеть на графиках.
Этот датасет можно использовать как для анализа, так и для собственных нужд: чтения интересных статей, поиска вдохновения по теме, ресерча HN в поиске интересных постов, идей или проектов.
Исходный код доступен в моём репозитории [2]. А онлайн-карта доступна по этой ссылке [3].
Автор: DrArgentum
Источник [26]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/35198
URLs in this post:
[1] BotHub API: https://bothub.chat/ru/profile/for-developers
[2] прочитать в моем репозитории: https://github.com/alexeev-prog/hn-sentiment-analysis
[3] по этой ссылке: https://alexeev-prog.github.io/hn-sentiment-analysis/
[4] готовый файл кластеризации hn_clusters.json: https://github.com/alexeev-prog/hn-sentiment-analysis/releases/tag/1.0
[5] Firebase Hacker News API: https://github.com/HackerNews/API
[6] Algolia API: https://hn.algolia.com/api
[7] https://bothub.ru/?invitedBy=zx7xIePYIOcWHhTfgg6-O: https://bothub.ru/?invitedBy=zx7xIePYIOcWHhTfgg6-O
[8] здесь: https://bothub.chat/api/documentation/ru
[9] Batches API: https://bothub.chat/api/documentation/ru/generation/batches
[10] gpt-5.6 luna: https://bothub.chat/gpt-5.6-luna
[11] интерес: http://www.braintools.ru/article/4220
[12] внимание: http://www.braintools.ru/article/7595
[13] интеллекта: http://www.braintools.ru/article/7605
[14] реакция: http://www.braintools.ru/article/1549
[15] Don’t fall into the anti-AI hype: https://antirez.com/news/158
[16] часть 1: https://habr.com/ru/companies/bothub/articles/1076364/
[17] часть 2: https://habr.com/ru/companies/bothub/articles/1076472/
[18] обучения: http://www.braintools.ru/article/5125
[19] «Is Show HN dead? No, but it’s drowning»: https://www.arthurcnops.blog/death-of-show-hn/
[20] поведения: http://www.braintools.ru/article/9372
[21] история о релицензировании проекта компанией из YC: https://twitter.com/soham_btw/status/1940952786491027886
[22] Ty: A fast Python type checker and language server: https://github.com/astral-sh/ty
[23] Postgres rewritten in Rust, now passing 100% of the Postgres regression tests: https://github.com/malisper/pgrust
[24] «Async Rust never left the MVP state»: https://tweedegolf.nl/en/blog/237/async-rust-never-left-the-mvp-state
[25] возврат с Rust на C++: https://old.reddit.com/r/rust/comments/1h15md8/goodbye_rust_i_wish_you_success_but_im_back_to_c/
[26] Источник: https://habr.com/ru/companies/bothub/articles/1078986/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1078986
Нажмите здесь для печати.