Обзор BERTopic: как находят темы в коллекции текстов — это разбор последовательности, в которой эмбеддинги документов проходят снижение размерности, кластеризацию и взвешивание терминов. Документация проекта описывает BERTopic как технику тематического моделирования на transformers и c-TF-IDF, создающую плотные кластеры с интерпретируемыми описаниями тем.
Пять этапов: embedding, UMAP, HDBSCAN, c-TF-IDF и представление темы
Документация BERTopic перечисляет основной порядок шагов: sentence-transformers, UMAP, HDBSCAN и c-TF-IDF выполняются последовательно. Каждый шаг решает свою задачу, и вместе они дают то, что читатель видит как «тему».
Embedding. Тексты превращаются в плотные векторы. Обзор Pinecone отмечает, что BERTopic поддерживает несколько библиотек для кодирования текста в векторные представления. Смысл документа живёт в геометрии: близкие по смыслу тексты получают близкие векторы.
UMAP. Снижение размерности. Документация по настройке параметров поясняет, что UMAP приводит эмбеддинги к виду, удобному для кластеризации. Параметр n_components задаёт размерность после сжатия и по умолчанию равен 5.
HDBSCAN. Кластеризация сжатых векторов. Документация называет min_cluster_size важнейшим параметром HDBSCAN: он управляет минимальным размером кластера и числом кластеров. Значение по умолчанию — 10.
c-TF-IDF. Взвешивание терминов внутри кластера. Pinecone описывает c-TF-IDF как модифицированную версию TF-IDF, которая ищет наиболее релевантные термины среди всех «документов» внутри кластера.
Представление темы. Финальный шаг — извлечение темы для каждого кластера. Pinecone формулирует это так: последний шаг BERTopic — извлечение тем для каждого кластера.
Практический вывод: сбой на любом этапе искажает итог. Плохие эмбеддинги дают бессмысленные кластеры, слишком агрессивный UMAP теряет информацию, а неудачный min_cluster_size дробит корпус на микрогруппы.
Шесть документов и ручная гипотеза вместо фальшивого результата
Проверять тематическую модель удобно на маленьком корпусе, где вы заранее знаете ожидаемый смысл. Ниже — учебный пример: шесть коротких документов и ручная гипотеза о двух группах. Это человеческая разметка для проверки смысла. BERTopic на этом наборе редакция не запускала.
| ID | Текст документа | Ручная гипотеза |
|---|---|---|
| d1 | счёт оплата карта | платежи |
| d2 | платёж карта чек | платежи |
| d3 | оплата счёт чек | платежи |
| d4 | доставка курьер адрес | доставка |
| d5 | курьер заказ доставка | доставка |
| d6 | адрес доставка заказ | доставка |
Гипотеза: d1–d3 — платёжные обращения, d4–d6 — доставка. Слово «заказ» может связать обе группы в реальных данных, а эмбеддинги и кластеризация способны выдать другой результат. Готовая таблица документов и гипотез позволяет оценить вывод модели, не подставляя заранее выдуманные идентификаторы тем.
На шести документах с настройкой min_cluster_size по умолчанию ждать ровно двух тем нельзя: корпус слишком мал, и часть текстов может уйти в шум. Учебный набор служит для ручной проверки смысла; качество модели по нему не измеряется.
Как читать topic words, representative documents, размер и noise
Документация проекта показывает, что после обучения доступны get_topic_info() и get_topic(): первый метод возвращает таблицу тем с числом документов и именем, второй — список терминов с весами. В примере из документации тема содержит слова windows, drive, dos, file, disk, каждому из которых сопоставлен вес.
Читать вывод стоит по четырём признакам.
Topic words. Набор терминов с весами. Документация по настройке советует держать top_n_words ниже 30, а лучше между 10 и 20: чем больше слов в теме, тем менее связной она становится.
Representative documents. Документация указывает, что get_representative_docs() возвращает представительные документы темы, а get_document_info(docs) — информацию на уровне документа: тему, вероятность, признак представительности. Название темы подтверждается полными текстами.
Размер. get_topic_info() показывает число документов в каждой теме. Крупная тема с размытыми словами часто означает, что кластеризация склеила разные сюжеты.
Noise. Документация quickstart прямо говорит: тема −1 обозначает все выбросы и обычно игнорируется. Документация по параметрам добавляет, что выбросы ожидаемы, а принудительное сведение шума к нулю может исказить представление данных.
Если группа смешанная, это фиксируют как есть. Присвоение ожидаемой темы вопреки содержимому документов даёт красивую таблицу и неверный вывод.
Почему можно заменить отдельные компоненты pipeline
Документация BERTopic называет шаги полностью модульными: эмбеддинги документов, снижение размерности, кластеризацию, токенизацию тем, взвешивание токенов и представление темы можно заменить или убрать. Документация допускает предположение о независимости шагов, и именно оно делает pipeline гибким.
Практически это выглядит так: вы инстанцируете модель UMAP и передаёте её в BERTopic через umap_model, модель HDBSCAN — через hdbscan_model. Документация приводит пример с UMAP(n_neighbors=15, n_components=10, metric='cosine') и HDBSCAN(min_cluster_size=10, metric='euclidean', prediction_data=True).
Замена компонента меняет свойства результата. n_neighbors в UMAP задаёт число соседних точек при построении приближения многообразия: большие значения дают более глобальный взгляд на структуру и часто более крупные кластеры. min_samples в HDBSCAN по умолчанию равен min_cluster_size и управляет числом выбросов.
Отдельно стоит представление темы. Документация предлагает несколько моделей представления и советует начинать с KeyBERTInspired, которая повышает связность и убирает стоп-слова. Для описания кластеров можно подключить модель OpenAI и генерировать метки, сводки и ключевые слова.
Роль языка корпуса и embedding-модели
Параметр language упрощает выбор модели для тех, кто не знаком с sentence-transformers. Документация перечисляет два варианта: language="english" и language="multilingual".
Английская модель — all-MiniLM-L6-v2, она используется по умолчанию и хорошо работает с английскими документами. Мультиязычная модель — paraphrase-multilingual-MiniLM-L12-v2, она поддерживает более 50 языков, обучалась на многих языках и имеет слегка другую архитектуру.
Практический выбор зависит от корпуса. Для русского корпуса выбирайте модель с поддержкой русского языка и проверяйте осмысленность полученных групп на полных документах. Документация quickstart показывает переключение: BERTopic(language="multilingual") выбирает модель с поддержкой более 50 языков.
Смена embedding-модели меняет геометрию пространства, а значит и все последующие шаги. Один и тот же корпус с разными моделями даст разные кластеры, и сравнивать результаты имеет смысл только с зафиксированной моделью.
Изменение параметров не является доказательством лучшего качества
Документация по настройке предупреждает: хотя BERTopic работает из коробки, есть параметры, которые настраивают под задачу. Настройка меняет поведение модели, и это ещё не означает улучшения.
Разберём на примерах из документации.
min_topic_size задаёт минимальный размер темы. Слишком высокое значение может привести к тому, что темы не создадутся вовсе; слишком низкое даёт множество микрокластеров. Документация советует для корпуса около миллиона документов ставить значение заметно выше 10, например 100 или 500.
nr_topics управляет сокращением числа тем после обучения. Если модель дала 100 тем, а параметр равен 20, модель попытается сократить их до 20. Каждое сокращение запускает пересчёт c-TF-IDF и занимает время.
calculate_probabilities включает расчёт вероятностей тем для документов. Документация называет это вычисление дорогим и по умолчанию выключенным.
low_memory переводит UMAP в экономный режим: памяти расходуется меньше, вычисление идёт медленнее.
Чтобы сравнение параметров было осмысленным, зафиксируйте корпус, embedding-модель и метрику проверки. Изменение одного параметра при неизменных остальных даёт наблюдаемый эффект, который можно обсудить. Рост числа тем или падение доли шума сами по себе качеством не являются.
Новые документы и сохранение модели
Для предсказания на новых документах документация перечисляет transform([new_doc]) и partial_fit(doc) для онлайн-режима. Документация по параметрам HDBSCAN подчёркивает: prediction_data нужно ставить в True, поскольку этот флаг нужен для предсказания новых точек. Если предсказывать на невиданных данных не планируется, значение можно оставить False.
Сохранение модели выполняется через .save("my_model", serialization="safetensors") и BERTopic.load("my_model"). Здесь важно ограничение backend: документация Hugging Face Hub указывает, что сохранённая модель не включает алгоритмы снижения размерности и кластеризации. В том же источнике сказано, что вывод выполняется через косинусную близость между эмбеддингами темы и документа.
Практический вывод: облегчённая модель подходит для инференса по близости к эмбеддингам тем. Для продолжения работы с обученными UMAP и HDBSCAN проверьте, сохраняет ли выбранный формат их состояние; конфигурация параметров сама по себе его не восстанавливает.
Порядок работы с новыми документами:
- Обучите модель на корпусе и проверьте темы по representative documents.
- Сохраните модель в формате, подходящем выбранному способу инференса, и проверьте, какие обученные компоненты он содержит.
- Для новых текстов вызовите
transformи посмотрите распределение по темам. - Документы с темой −1 считайте выбросами и разбирайте отдельно.
- Перед онлайн-обновлением через
partial_fitпроверьте совместимость выбранных компонентов с этим режимом по их документации.
Частые вопросы
Что такое BERTopic простыми словами?
Это техника тематического моделирования, которая использует transformers и c-TF-IDF для создания плотных кластеров с интерпретируемыми описаниями тем. Документы кодируются в векторы, сжимаются, группируются, а затем внутри каждой группы взвешиваются термины. Результат — список тем с ключевыми словами и документами.
Чем c-TF-IDF отличается от обычного TF-IDF?
Pinecone описывает c-TF-IDF как модифицированную версию TF-IDF, которая ищет наиболее релевантные термины среди всех документов внутри кластера. Классический TF-IDF оценивает термин в отдельном документе, а c-TF-IDF работает на уровне группы. Это позволяет получить слова, характерные именно для данной темы.
Почему документы попадают в тему −1?
Документация quickstart поясняет: тема −1 обозначает все выбросы и обычно игнорируется. HDBSCAN относит к шуму точки, которые не попали ни в один плотный кластер. Документация по параметрам добавляет, что выбросы ожидаемы, а их принудительное устранение может исказить картину данных.
Как выбрать язык и embedding-модель?
Параметр language упрощает выбор модели. Для английских текстов подходит all-MiniLM-L6-v2 по умолчанию, для корпусов на многих языках — paraphrase-multilingual-MiniLM-L12-v2 с поддержкой более 50 языков. Для русского корпуса выбирайте модель с поддержкой русского языка и проверяйте качество тем на своих документах.
Можно ли предсказывать темы для новых документов?
Да, transform([new_doc]) назначает темы новым документам. Для варианта с обученным HDBSCAN нужен флаг prediction_data=True; облегчённая Hub-модель использует близость эмбеддингов без этого кластеризатора. Для онлайн-обновления через partial_fit(doc) проверьте совместимость выбранных компонентов.
