Mikimi/ru-wikipedia-100k-full-text-daily-stats-10-years
📚 Russian Wikipedia Top 100K: Full Text with Daily Pageviews **Крупнейший открытый датасет русскоязычной Википедии с полными текстами статей и ежедневной статистикой просмотров за 10 лет. МГУ, ОТиПЛ, 2025** 📖 Описание Этот датасет содержит 99,348 самых популярных статей русскоязычной Википедии, отобранных по совокупному количеству просмотров за последние 10 лет. Для каждой статьи собраны полный текст с сохранением структуры, метаданные и детальная… See the full description on the dataset page: https://huggingface.co/datasets/Mikimi/ru-wikipedia-100k-full-text-daily-stats-10-years.
📚 Russian Wikipedia Top 100K: Full Text with Daily Pageviews
<div align="center"> Крупнейший открытый датасет русскоязычной Википедии с полными текстами статей и ежедневной статистикой просмотров за 10 лет. МГУ, ОТиПЛ, 2025 </div>
📖 Описание
Этот датасет содержит 99,348 самых популярных статей русскоязычной Википедии, отобранных по совокупному количеству просмотров за последние 10 лет. Для каждой статьи собраны полный текст с сохранением структуры, метаданные и детальная ежедневная статистика просмотров.
Датасет уникален тем, что объединяет три ключевых компонента:
- Полный текст — не только краткое содержание, но и весь текст статьи со структурой секций
- Временны́е ряды просмотров — ежедневная статистика за ~10 лет (3,585 дней с июля 2015 года по 28 декабря 2025)
- Классификация по тематике — автоматическая маркировка статей, связанных с Россией
📊 Статистика датасета
🏆 Топ-5 статей по просмотрам
🗂️ Структура данных
Датасет содержит 21 поле, разделённых на логические группы.
Основные поля идентификации
Контент статьи
Структура секции (`sections`):
{
"level": 2, # Уровень заголовка (2 = ==, 3 = ===, и т.д.)
"title": "История", # Заголовок секции
"text": "Текст..." # Содержимое секции
}Статистика просмотров (агрегированная)
Ежедневная статистика просмотров
Формат daily_views:
{
"2015-07-01": 1234,
"2015-07-02": 5678,
"2015-07-03": 9012,
...
"2025-05-15": 4567
}Классификация связи с Россией
Как работает классификатор:
Классификатор использует многофакторный подход с морфологическим анализом (pymorphy3):
- Анализ заголовка (вес 3.0) — поиск ключевых слов: «Россия», «Москва», «СССР», названия городов и т.д.
- Анализ категорий (вес 2.0) — поиск паттернов в категориях Wikipedia
- Анализ текста (вес 0.5 за совпадение) — поиск ключевых слов во вводном абзаце
Итоговая уверенность нормализуется в диапазон [0, 1]. Статья считается связанной с Россией при confidence ≥ 0.3.
Статистика контента
Метаданные
🚀 Быстрый старт
Загрузка датасета
from datasets import load_dataset
# Загрузка полного датасета
dataset = load_dataset("Mikimi/ru-wikipedia-daily-pageviews-full-text")
# Просмотр структуры
print(dataset)
print(f"Количество статей: {len(dataset['train']):,}")Базовые примеры
# Доступ к первой статье
article = dataset['train'][0]
print(f"Заголовок: {article['title']}")
print(f"Просмотров: {article['total_views']:,}")
print(f"Слов: {article['word_count']:,}")
# Краткое содержание
print(f"\nВводный абзац:\n{article['lead'][:500]}...")
# Полный текст
print(f"\nПолный текст (первые 1000 символов):\n{article['full_text'][:1000]}...")Работа с ежедневной статистикой
import json
import matplotlib.pyplot as plt
# Парсинг ежедневных просмотров
daily = json.loads(article['daily_views'])
# Построение графика
dates = sorted(daily.keys())
views = [daily[d] for d in dates]
plt.figure(figsize=(14, 5))
plt.plot(range(len(dates)), views, linewidth=0.5)
plt.fill_between(range(len(dates)), views, alpha=0.3)
plt.title(f"Просмотры: {article['title']}")
plt.xlabel("Дни")
plt.ylabel("Просмотры")
plt.show()Фильтрация статей
# Только статьи о России
russia_dataset = dataset['train'].filter(lambda x: x['is_russia_related'])
print(f"Статей о России: {len(russia_dataset):,}")
# Топ-10000 самых популярных
top_10k = dataset['train'].filter(lambda x: x['pageview_rank'] <= 10000)
# Статьи с большим количеством текста
long_articles = dataset['train'].filter(lambda x: x['word_count'] > 5000)
print(f"Статей > 5000 слов: {len(long_articles):,}")Работа со структурой статьи
# Доступ к секциям
for section in article['sections'][:5]:
print(f"{' ' * (section['level'] - 2)}[{section['level']}] {section['title']}")
# Парсинг инфобокса
if article['infobox']:
infobox = json.loads(article['infobox'])
for key, value in list(infobox.items())[:5]:
print(f" {key}: {value[:50]}...")💡 Примеры использования
1. Анализ трендов популярности
import json
import pandas as pd
def get_yearly_views(article):
"""Агрегирует просмотры по годам."""
daily = json.loads(article['daily_views'])
yearly = {}
for date, views in daily.items():
year = date[:4]
yearly[year] = yearly.get(year, 0) + views
return yearly
# Анализ динамики для топ-10 статей
for i in range(10):
article = dataset['train'][i]
yearly = get_yearly_views(article)
print(f"\n{article['title']}:")
for year in sorted(yearly.keys())[-5:]:
print(f" {year}: {yearly[year]:,}")2. Поиск статей по ключевым словам
def search_articles(dataset, keywords, field='lead', limit=10):
"""Поиск статей по ключевым словам."""
keywords_lower = [k.lower() for k in keywords]
results = []
for article in dataset:
text = article[field].lower()
if all(kw in text for kw in keywords_lower):
results.append({
'title': article['title'],
'rank': article['pageview_rank'],
'views': article['total_views']
})
if len(results) >= limit:
break
return results
# Поиск статей о космосе
space_articles = search_articles(dataset['train'], ['космос', 'ракета'])
for a in space_articles:
print(f"{a['title']}: {a['views']:,} просмотров")3. Создание корпуса для NLP
from datasets import Dataset
# Создание упрощённого корпуса для обучения
def create_nlp_corpus(dataset, max_samples=50000):
corpus = []
for article in dataset:
corpus.append({
'text': article['full_text'],
'title': article['title'],
'category': 'russia' if article['is_russia_related'] else 'other'
})
if len(corpus) >= max_samples:
break
return Dataset.from_list(corpus)
nlp_corpus = create_nlp_corpus(dataset['train'])
print(f"Корпус создан: {len(nlp_corpus):,} документов")4. Анализ сезонности просмотров
import json
from collections import defaultdict
def analyze_seasonality(article):
"""Анализирует сезонность просмотров по месяцам."""
daily = json.loads(article['daily_views'])
monthly = defaultdict(list)
for date, views in daily.items():
month = int(date[5:7])
monthly[month].append(views)
return {m: sum(v) / len(v) for m, v in monthly.items()}
# Анализ сезонности для статьи "Новый год"
new_year = dataset['train'].filter(lambda x: x['title'] == 'Новый год')
if len(new_year) > 0:
seasonality = analyze_seasonality(new_year[0])
for month in sorted(seasonality.keys()):
bar = '█' * int(seasonality[month] / max(seasonality.values()) * 30)
print(f"{month:2d}: {bar} {seasonality[month]:,.0f}")🔧 Методология сбора данных
Источники данных
- MediaWiki API (
https://ru.wikipedia.org/w/api.php) — для получения полного wikitext статей, категорий и метаданных - Wikimedia Pageviews API (
https://wikimedia.org/api/rest_v1/metrics/pageviews) — для статистики просмотров
Процесс сбора
- Сбор статистики просмотров (~3,834 дня):
- Ежедневный запрос топ-1000 статей через Pageviews API
- Агрегация просмотров для определения топ-100K за весь период
- Сохранение ежедневных данных для каждой статьи
- Загрузка контента статей:
- Запрос wikitext через MediaWiki API
- Парсинг структуры с помощью библиотеки
mwparserfromhell - Извлечение: lead, секции, категории, инфобокс
- Очистка от wiki-разметки
- Классификация:
- Морфологический анализ с
pymorphy3 - Мультифакторная оценка связи с Россией
- Вычисление уровня уверенности
- Валидация и загрузка:
- Проверка целостности данных
- Сохранение в формате Parquet
- Загрузка на HuggingFace Hub
Фильтрация
Из датасета исключены:
- Служебные страницы (Special:, Служебная:, Википедия:, и т.д.)
- Страницы файлов и категорий
- Шаблоны и модули
- Страницы обсуждений
- Главная страница
📋 Возможные применения
Исследования и аналитика
- Анализ трендов — изучение динамики интереса к темам во времени
- Событийная аналитика — корреляция просмотров с реальными событиями
- Сезонность — выявление паттернов популярности тем
Natural Language Processing
- Языковое моделирование — обучение моделей на русскоязычном контенте
- Суммаризация текста — пары lead/full_text для обучения
- Классификация текста — метки isrussiarelated для бенчмарков
- Question Answering — создание QA-датасетов на основе структурированного контента
- Named Entity Recognition — богатый размеченный контент
Системы извлечения информации
- Knowledge Base — структурированные данные из инфобоксов
- RAG-системы — база знаний для Retrieval-Augmented Generation
- Поисковые системы — индексация и ранжирование
Образование и визуализация
- Интерактивные дашборды — визуализация популярности тем
- Образовательные проекты — изучение русскоязычного контента
- Исторический анализ — изменение интересов общества во времени
⚠️ Ограничения
- Актуальность контента: Тексты статей загружены на определённую дату (см.
fetch_timestamp). Содержимое Википедии постоянно обновляется.
- Статистика просмотров: Данные начинаются с июля 2015 года — момента запуска Pageviews API. Более ранняя статистика недоступна.
- Классификация "связи с Россией": Автоматический классификатор имеет неточности. Рекомендуется ручная проверка для критичных применений.
- Очистка текста: При удалении wiki-разметки возможна потеря некоторого форматирования (таблицы, формулы).
- Выборка: Датасет содержит только топ-100K статей по просмотрам на основании дневных топов статей, что не представляет всю Википедию.
📜 Лицензия и цитирование
Лицензия
Датасет распространяется под лицензией CC BY-SA 4.0 (Creative Commons Attribution-ShareAlike 4.0), соответствующей лицензии контента Wikipedia.
Цитирование
@dataset{ru_wikipedia_daily_pageviews_2025,
author = {Miki - OTIPL},
title = {Russian Wikipedia Top 100K: Full Text with Daily Pageviews},
year = {2025},
publisher = {Hugging Face},
url = {https://huggingface.co/datasets/Mikimi/ru-wikipedia-daily-pageviews-full-text},
note = {99,348 most popular Russian Wikipedia articles with full text and 10 years of daily pageview statistics}
}📞 Обратная связь
Если вы обнаружили ошибки или у вас есть предложения по улучшению датасета, пожалуйста, создайте Issue в репозитории или свяжитесь через Discussions.
