Современные большие языковые модели (LLMs) — такие как GPT, DeepSeek, LLaMA и другие обучаются на огромных объёмах текстов из интернета, чтобы охватить всю широту естественного языка. Один из ключевых источников таких данных — Common Crawl, открытый репозиторий из миллиардов веб-страниц, которые регулярно обновляются.
Цель Common Crawl — сделать данные из сети интернет доступными всем, публикуя ежемесячные выгрузки миллиардов страниц, хранящихся на Amazon S3. Однако, при всей своей масштабности необработанные данные Common Crawl часто содержат шум: HTML-верстку, рекламу, спам, дублирующийся контент и тексты на разных языках, которые могут негативно влиять на работу LLM. Поэтому для получения качественных данных для обучения всё более важными становятся фильтрация и предобработка текста — включая определение языка и дедупликацию.
Параллельно с этим, для обработки Common Crawl на терабайтных объёмах широко используются архитектуры обработки данных, построенные на фреймворках вроде Apache Spark. Благодаря распределённой обработке данных и структурированному стримингу Spark позволяет разработчикам создавать масштабируемые пайплайны, применять логику фильтрации и формировать итоговые очищенные корпусы для обучения. Эта статья перевод моей статьи на medium.com, я хотел рассматреть, как на практике формируются обучающие наборы из Common Crawl (например, в проектах C4, CCNet, OSCAR, GPT-3, BLOOM, Falcon и др.) [2,3,4,5,6,7], а затем показать пример Spark Streaming-приложения, который я написал и опубликовал в GitHub. Мы также приводим пример подхода, реализованного в DeepSeek, для фильтрации математического контента — узкоспециализированная задача, которая способна дать существенный прирост в качестве моделей [8].
Форматы данных Common Crawl: WARC, WET и WAT
При загрузке данных Common Crawl чаще всего встречаются три типа файлов:
WARC-файлы
Web ARChive (WARC) — это стандартный контейнер для хранения HTTP-запросов и ответов. Каждый WARC-файл включает в себя несколько «записей» (records), каждая из которых соответствует одной веб-странице (или отдельному запросу) и содержит HTTP-заголовки, HTML-код и метаданные о дате/URL.
WET-файлы
WET (WARC Encapsulated Text) — это текстовая вариация WARC. Из них удаляются сырые HTML-заголовки и контент, и остаётся только «голый» текст. WET-формат удобнее для текстового анализа, так как он меньше по размеру и не требует дополнительного парсинга HTML.
WAT-файлы
WAT (Web Archive Transformation) — файлы со структурированными метаданными о каждой странице: ссылки, HTTP-заголовки, временные метки и прочая информация о сканировании (crawling). WAT часто используются для построения графов ссылок или фильтрации по доменам.
На практике в большинстве крупных пайплайнов LLM предпочитают WET, так как HTML уже очищен от boilerplate-кода. Однако иногда выбирают WARC, если нужно применить собственную логику парсинга HTML или сохранить метаданные. WAT полезен, когда требуется фильтрация по домену или анализ ссылочной структуры.
Ключевые техники очистки данных
Независимо от того, какой формат вы используете (WARC или WET), все сходятся на схожих этапах, для превращения необработанных данных в готовый корпус для обучения LLM:
Извлечение текста / Удаление HTML
Если используется WARC, необходимо убрать меню, скрипты и повторяющиеся элементы страниц. На практике применяются такие инструменты, как Trafilatura, jusText или Newspaper.Определение языка
Точное определение языка (через fastText, CLD2/CLD3, Apache Tika и т.п.) позволяет либо создать однородный корпус на одном языке, либо аккуратно разбивать данные по языкам.Фильтрация по качеству
Используют как эвристики (удаление слишком коротких строк, ругательств, неалфавитного текста), так и модели, вычисляющие перплексию или классификаторы, чтобы исключать спам/бессмыслицу. Также добавляют фильтры безопасности для удаления токсичного контента, а при необходимости — доменные фильтры (например, проверка на фрагменты кода или математические формулы).Дедупликация
Стандартно применяются как точная дедупликация (хеширование целых документов), так и поиск похожих дублей (MinHash/SimHash). Методы MinHash для обнаружения почти дублирующихся документов восходят к работе Бродера [1].Таргетинг по домену / жанру
Для создания специализированных корпусов (код, математика, образовательные материалы) пайплайны могут фильтровать документы по доменным именам или обучать небольшие классификаторы, чтобы находить страницы по тематике.
Фильтрация математических текстов для DeepSeek
Интересный пример — процесс фильтрации математических задач в проекте DeepSeek, описанный в публикации [8]. Задача заключалась в том, чтобы выделить из Common Crawl материалы с качественным математическим содержанием: задачи, доказательства, обсуждения на форумах. Подход включал:
Первичный датасет и начальная обучающая выборка
Сформировали «сид» (seed) — небольшой набор страниц с математическими задачами (например, от Q&A-форумов, сайтов соревнований).Итеративная классификация
Обучили классификатор (fastText или упрощённый трансформер) на «математических» страницах из сид-сета и на произвольных веб-страницах.
Применили классификатор к более широкому объёму Common Crawl, чтобы отфильтровать страницы, вероятно, связанные с математикой.
Убрали спам или нерелевантные страницы (например, проверяли наличие LaTeX-фрагментов или численных выражений).
Провели дедупликацию по хешам (на уровне URL и поиск похожих текстов).
Повторили процесс, дообучая классификатор на вновь найденных математических данных.
Благодаря множеству итераций DeepSeek сумел собрать большой и качественный корпус математических задач (порядка десятков миллиардов токенов), превосходящий тот, что можно было бы получить наивной фильтрацией. По отчётy [8], добавление этого домен-специфичного корпуса заметно улучшает математические способности моделей. Тот же итеративный шаблон подходит и для других доменов (например, извлечение кода или выделение академических текстов).
Важность качественных данных для обучения
Очистка и отбор текстов помогают снизить риск:
«Зазубривания» моделью дублированного или спамного контента.
Нестабильных либо смещённых ответов, возникающих из-за некачественных или токсичных сегментов.
Пустой траты вычислительных ресурсов на неактуальные или дублирующиеся примеры.
Более чистые данные обычно дают улучшение перплексии, лучшую обобщающую способность и точность модели, что экономит время и средства. Как показывают проекты FineWeb (2024) и WanJuan-CC (2024) [9], продвинутая фильтрация даёт ощутимый прирост в качестве — хотя и приходится выкидывать значительную часть исходных данных. Тем не менее, выгода в надёжности модели, тематическом охвате и безопасном контенте того стоит.
Обработка с Apache Spark
Объём Common Crawl (миллиарды документов) обычно слишком велик для одиночных серверов. Здесь выручает распределённая платформа Apache Spark, которая масштабирует любой из шагов:
Параллельное чтение
Spark может одновременно считывать сотни файлов WET/WARC из AWS S3 или другой системы хранения.Распределённые преобразования
Обработка HTML, детектирование языка и классификация могут выполняться одновременно на многих узлах.Structured Streaming
Вместо «одного большого батча» конвейер можно запустить в «непрерывном» режиме стриминга, ежемесячно (или чаще) получая свежие выгрузки и поддерживая актуальный набор очищенного текста.Масштабируемая дедупликация
При правильной настройке распределённой выгрузки Spark способен обрабатывать миллиарды документов (через groupBy и shuffle или MinHash-подход) [1].Отказоустойчивость
Checkpointing и механизмы lineage в Spark сохраняют результаты, позволяя возобновлять работу после сбоев.
Пример Spark-задачи для обработки Common Crawl
Ниже описан пример реального приложения на Spark Structured Streaming, которое фильтрует данные Common Crawl. Ключевые компоненты конвейера:
Загрузка метаданных и файлов
WetMetadataFetcher получает список всех путей к WET-файлам для выбранного релиза Common Crawl.
FileDownloadManager скачивает их параллельно.
Это типовой паттерн «управления» источником Common Crawl внутри Spark.Определение языка
В примере используется Apache Tika LanguageDetector в качестве простого решения. На практике часто применяют fastText или pycld3 для более точной и быстрой обработки больших объёмов.Обработка потоков
Каждый «микробатч» новых данных обогащается колонками raw_text и language, после чего результаты расходятся в несколько «стримов»:langAggDf для агрегации по языкам.
Запись отфильтрованных данных в Parquet.
Очистка локальных загруженных файлов.
Фильтрация
Пример ориентируется в первую очередь на языки («ru», «it», «de»). Добавить фильтры по длине текста, доменам или признаки «математики» (как у DeepSeek) несложно.Near-Deduplication через MinHash
Помимо точного сравнения по хешам, можно встраивать MinHash- или SimHash-подход [1] для поиска документов, похожих «почти дословно». К примеру, в Scala:
Расширение конвейера
В промышленной среде обычно добавляют:
Python- или Scala-UDF для собственной оценки качества (например, вычисление перплексии).
MinHash или SimHash в отдельной Spark-задаче, когда объёмы уже сильно уменьшены.
Разделение (partitioning) датасета по времени выгрузки (crawl date) и языкам.
Поддержку GPU для тяжёлых модельных вычислений (например, при классификации вроде фильтрации математического контента).
Заключение
Common Crawl даёт фундаментально важные данные веб-масштаба для обучения и дообучения современных LLM, но «сырые» дампы всегда требуют аккуратной очистки. Лучшие практики — удаление HTML-boilerplate, фильтрация по языкам, продвинутая проверка качества, дедупликация и таргетинг по доменам — уже давно отработаны в крупных исследованиях и открытых проектах [2,3,4,5,6,7,8,9]. Эти методы неизменно улучшают результаты моделей и снижают избыточность данных.
Среди специализированных подходов особенно интересен пример DeepSeek с математической фильтрацией [8]: итеративная классификация плюс дополнительная проверка на «реальность» контента дали возможность собрать уникальный математический корпус из неструктурированного веб-потока. Аналогичный шаблон (сид + классификатор, широкое сканирование, фильтрация, дедупликация и итерации) можно применять для любой узкой тематики, «рассеянной» по всему интернету.
Использование стриминговой архитектуры на Apache Spark (особенно Spark Structured Streaming) обеспечивает масштабируемый и надёжный способ обработать Common Crawl на уровне петабайтов. Как показывает пример CCApp, можно непрерывно загружать новые данные из Common Crawl, выполнять преобразования и ML-фильтрацию в параллельном режиме и формировать чистый корпус для дальнейшего обучения LLM.
Что бы выполнить фильтрацию по версии Common Crawl от декабря 2024 года в WET только текстовом формате на интернете 100 Mbit/s у меня заняло 10 дней. И результат распределения языков:
Если вам интересна эта тема или что-то делаете похожее - пишите в личку. ;)
Язык | Количество документов (миллионов) |
en | 675.82 M |
ru | 80.67 M |
de | 80.09 M |
es | 63.37 M |
fr | 62.83 M |
it | 34.98 M |
pt | 31.85 M |
nl | 26.47 M |
pl | 26.42 M |
tr | 17.99 M |
vi | 13.78 M |
cs | 13.72 M |
id | 12.91 M |
fa | 9.25 M |
sv | 9.24 M |
zh-CN | 8.94 M |
Ссылки
A.Z. Broder. (1997). On the resemblance and containment of documents. — Ссылка
G. Wenzek, et al. (2019). CCNet: Extracting High Quality Monolingual Datasets from Web Crawl Data. — arXiv:1911.00359
C. Raffel, et al. (2019). Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer. — arXiv:1910.10683
T.B. Brown, et al. (2020). Language Models are Few-Shot Learners. — arXiv:2005.14165
X. Li, et al. (2020). OSCAR: Object-Semantics Aligned Pre-training for Vision-Language Tasks. — arXiv:2004.06165
BigScience Workshop. (2022). BLOOM: A 176B-Parameter Open-Access Multilingual Language Model. — arXiv:2211.05100
G. Penedo, et al. (2023). The RefinedWeb Dataset for Falcon LLM: Outperforming Curated Corpora with Web Data, and Web Data Only. — arXiv:2306.01116
Z. Shao, et al. (2024). DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models.— arXiv:2402.03300
J. Qiu. (2024). WanJuan-CC: A Safe and High-Quality Open-sourced English Webtext Datase — arXiv:2402.19282