MrJ-Dm/news-sentiment-analyzer

Асинхронный анализатор тональности новостей

Python

1

1 commits

updated Apr 6, 2026

See the code

README

# News Sentiment Analyzer 📰

p.s English version from below

[![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)
[![PyTorch](https://img.shields.io/badge/PyTorch-2.9+-red.svg)](https://pytorch.org/)
[![Hugging Face](https://img.shields.io/badge/🤗-Transformers-yellow.svg)](https://huggingface.co/)
[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)

Асинхронный анализатор тональности новостей с крупнейших российских новостных порталов. Сервис автоматически парсит заголовки новостей с **Lenta.ru**, **RBC.ru** и **Kommersant.ru**, определяет их эмоциональную окраску (негатив/позитив/нейтральность) с помощью нейросетевой модели и предоставляет статистику.

## 🎯 Возможности

- 🚀 **Асинхронный парсинг** - одновременная загрузка данных с нескольких источников
- 🧠 **Анализ тональности** - определение эмоциональной окраски заголовков на русском языке
- 📊 **Статистика** - подсчет негативных, позитивных и нейтральных новостей по каждому источнику
- 🔄 **Обработка ошибок** - таймауты, сетевые ошибки, некорректные селекторы
- 📈 **Общая сводка** - агрегированные результаты по всем сайтам

## 🛠️ Технологический стек

| Технология | Назначение |
|------------|------------|
| **Python 3.8+** | Язык программирования |
| **aiohttp** | Асинхронные HTTP-запросы |
| **BeautifulSoup4** | Парсинг HTML и извлечение данных |
| **Transformers (Hugging Face)** | Загрузка и использование NLP-модели |
| **PyTorch** | Бэкенд для выполнения модели |
| **asyncio** | Асинхронное выполнение задач |

### Модель анализа тональности

Используется модель **[seara/rubert-tiny2-russian-sentiment](https://huggingface.co/seara/rubert-tiny2-russian-sentiment)** - легковесная версия BERT, оптимизированная для русского языка:
- Размер модели: ~50MB (tiny версия)
- Высокая скорость инференса
- Три класса: негатив, позитив, нейтраль

## 📦 Установка

### Клонирование репозитория

```bash
git clone https://github.com/MrJ_Dm/news-sentiment-analyzer.git
cd news-sentiment-analyzer

Установка зависимостей

# Установка всех зависимостей из requirements.txt
pip install -r requirements.txt

# Или установка только основных пакетов
pip install aiohttp beautifulsoup4 transformers torch

Примечание: При первом запуске модель автоматически загрузится из Hugging Face Hub (~50MB)

🚀 Запуск

python main.py

Пример вывода

2024-01-15 10:30:15,123 - INFO - Всё хорошо! url: https://lenta.ru - имеет статус: 200, размер - 156234 байт
2024-01-15 10:30:15,456 - INFO - Колл-во новостей: 47
2024-01-15 10:30:15,789 - INFO - 1. Путин подписал закон о цифровых рублях
2024-01-15 10:30:15,890 - INFO - тональность: НЕЙТРАЛ, уверенность - 87.34%
2024-01-15 10:30:15,891 - INFO - 2. Цены на нефть резко упали на фоне санкций
2024-01-15 10:30:15,950 - INFO - тональность: НЕГАТИВ, уверенность - 92.15%
2024-01-15 10:30:15,951 - INFO - 3. Российские ученые разработали новый препарат от рака
2024-01-15 10:30:16,010 - INFO - тональность: ПОЗИТИВ, уверенность - 88.67%
...
2024-01-15 10:30:17,500 - INFO - Негативных: 12. Позитивных: 8. Нейтральных: 27
2024-01-15 10:30:17,501 - INFO - --------------------------------------------------
2024-01-15 10:30:17,600 - INFO - Всё хорошо! url: https://rbc.ru - имеет статус: 200, размер - 234567 байт
...
2024-01-15 10:30:18,900 - INFO - 
=== Общая статистика по всем сайтам ===
2024-01-15 10:30:18,901 - INFO - Всего негативных: 35, позитивных: 22, нейтральных: 68

📁 Структура проекта

news-sentiment-analyzer/
│
├── main.py                 # Основной скрипт приложения
├── requirements.txt        # Зависимости проекта
├── README.md              # Документация (русская)
├── README_EN.md           # Документация (английская)
├── .gitignore             # Игнорируемые файлы
│
└── models/                # Директория для кэша моделей (создается автоматически)
    └── rubert-tiny2...    # Локально сохраненная модель

🔍 Как это работает

1. Асинхронная загрузка страниц

async def fetch_url(session, url):
    # Асинхронный запрос с таймаутом 10 секунд
    async with session.get(url, timeout=timeout) as response:
        return await response.text()

2. Парсинг заголовков

Для каждого сайта используется свой CSS-селектор:

СайтCSS-селектор
lenta.rua.card-mini
rbc.rua.main__feed__link
kommersant.ru.top_news__link

3. Анализ тональности

def analyze_sentiment(text):
    # Токенизация текста
    inputs = tokenizer(text, return_tensors='pt', truncation=True)
    
    # Инференс модели
    with torch.no_grad():
        outputs = model(**inputs)
    
    # Softmax для получения вероятностей
    probabilities = torch.nn.functional.softmax(outputs.logits, dim=-1)
    
    # Определение класса с максимальной вероятностью
    predicted_class_id = probabilities.argmax().item()
    
    return sentiment, confidence

4. Агрегация результатов

  • Подсчет негативных/позитивных/нейтральных новостей по каждому сайту
  • Формирование общей статистики
  • Логирование всех этапов работы

📊 Интерпретация результатов

КатегорияОписаниеПример заголовка
НЕГАТИВОтрицательные события, критика, проблемы"Экономика России упала на 3%"
ПОЗИТИВПоложительные события, достижения"Открыт новый завод в Москве"
НЕЙТРАЛФакты без эмоциональной окраски"Завтра состоится заседание Думы"

🐛 Возможные проблемы и решения

Проблема: Модель не загружается

# Решение: Проверьте интернет-соединение
# Модель загружается из Hugging Face Hub
# Можно загрузить вручную:
git lfs install
git clone https://huggingface.co/seara/rubert-tiny2-russian-sentiment

Проблема: Селекторы устарели

# Решение: Обновите селекторы в коде
selectors = {
    "https://lenta.ru": 'новый_селектор',
    "https://rbc.ru": 'новый_селектор',
    "https://kommersant.ru": "новый_селектор"
}

Проблема: Не хватает памяти

# Решение: Используйте CPU вместо GPU
# Добавьте в код:
device = torch.device('cpu')
model.to(device)

🤝 Участие в разработке

Pull requests приветствуются! Для крупных изменений, пожалуйста, сначала откройте issue для обсуждения.

Как внести вклад:

  1. Форкните репозиторий
  2. Создайте ветку для фичи (git checkout -b feature/AmazingFeature)
  3. Закоммитьте изменения (git commit -m 'Add some AmazingFeature')
  4. Запушьте ветку (git push origin feature/AmazingFeature)
  5. Откройте Pull Request

📄 Лицензия

Проект распространяется под лицензией MIT. Подробности в файле LICENSE.

🙏 Благодарности

  • Команде Hugging Face за библиотеку transformers
  • Seara за отличную модель rubert-tiny2 для русского языка
  • Разработчикам aiohttp и BeautifulSoup4 за качественные инструменты

📞 Контакты

⭐ Если вам понравился проект...

Поставьте звезду на GitHub! Это поможет другим пользователям найти проект и мотивирует меня на дальнейшее развитие.


Сделано с ❤️ для анализа российских новостей


```markdown
# News Sentiment Analyzer 📰

[![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)
[![PyTorch](https://img.shields.io/badge/PyTorch-2.9+-red.svg)](https://pytorch.org/)
[![Hugging Face](https://img.shields.io/badge/🤗-Transformers-yellow.svg)](https://huggingface.co/)
[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)

Asynchronous news sentiment analyzer from major Russian news portals. The service automatically parses news headlines from **Lenta.ru**, **RBC.ru**, and **Kommersant.ru**, determines their emotional tone (negative/positive/neutral) using a neural network model, and provides statistics.

## 🎯 Features

- 🚀 **Asynchronous parsing** - simultaneous data loading from multiple sources
- 🧠 **Sentiment analysis** - determining emotional tone of Russian headlines
- 📊 **Statistics** - counting negative, positive, and neutral news per source
- 🔄 **Error handling** - timeouts, network errors, invalid selectors
- 📈 **Summary report** - aggregated results across all websites

## 🛠️ Tech Stack

| Technology | Purpose |
|------------|---------|
| **Python 3.8+** | Programming language |
| **aiohttp** | Asynchronous HTTP requests |
| **BeautifulSoup4** | HTML parsing and data extraction |
| **Transformers (Hugging Face)** | Loading and using NLP models |
| **PyTorch** | Backend for model execution |
| **asyncio** | Asynchronous task execution |

### Sentiment Analysis Model

Uses the **[seara/rubert-tiny2-russian-sentiment](https://huggingface.co/seara/rubert-tiny2-russian-sentiment)** model - a lightweight version of BERT optimized for Russian language:
- Model size: ~50MB (tiny version)
- High inference speed
- Three classes: negative, positive, neutral

## 📦 Installation

### Cloning the repository

```bash
git clone https://github.com/MrJ_Dm/news-sentiment-analyzer.git
cd news-sentiment-analyzer

Installing dependencies

# Install all dependencies from requirements.txt
pip install -r requirements.txt

# Or install only core packages
pip install aiohttp beautifulsoup4 transformers torch

Note: The model will automatically download from Hugging Face Hub on first run (~50MB)

🚀 Usage

python main.py

Example Output

2024-01-15 10:30:15,123 - INFO - Success! url: https://lenta.ru - status: 200, size - 156234 bytes
2024-01-15 10:30:15,456 - INFO - News count: 47
2024-01-15 10:30:15,789 - INFO - 1. Putin signs digital ruble law
2024-01-15 10:30:15,890 - INFO - sentiment: NEUTRAL, confidence - 87.34%
2024-01-15 10:30:15,891 - INFO - 2. Oil prices drop sharply due to sanctions
2024-01-15 10:30:15,950 - INFO - sentiment: NEGATIVE, confidence - 92.15%
2024-01-15 10:30:15,951 - INFO - 3. Russian scientists develop new cancer drug
2024-01-15 10:30:16,010 - INFO - sentiment: POSITIVE, confidence - 88.67%
...
2024-01-15 10:30:17,500 - INFO - Negative: 12. Positive: 8. Neutral: 27
2024-01-15 10:30:17,501 - INFO - --------------------------------------------------
2024-01-15 10:30:17,600 - INFO - Success! url: https://rbc.ru - status: 200, size - 234567 bytes
...
2024-01-15 10:30:18,900 - INFO - 
=== Overall statistics across all sites ===
2024-01-15 10:30:18,901 - INFO - Total negative: 35, positive: 22, neutral: 68

📁 Project Structure

news-sentiment-analyzer/
│
├── main.py                 # Main application script
├── requirements.txt        # Project dependencies
├── README.md              # Documentation (Russian)
├── README_EN.md           # Documentation (English)
├── .gitignore             # Ignored files
│
└── models/                # Model cache directory (auto-created)
    └── rubert-tiny2...    # Locally stored model

🔍 How It Works

1. Asynchronous Page Loading

async def fetch_url(session, url):
    # Async request with 10 second timeout
    async with session.get(url, timeout=timeout) as response:
        return await response.text()

2. Parsing Headlines

Each site uses its own CSS selector:

SiteCSS Selector
lenta.rua.card-mini
rbc.rua.main__feed__link
kommersant.ru.top_news__link

3. Sentiment Analysis

def analyze_sentiment(text):
    # Tokenize text
    inputs = tokenizer(text, return_tensors='pt', truncation=True)
    
    # Model inference
    with torch.no_grad():
        outputs = model(**inputs)
    
    # Softmax for probabilities
    probabilities = torch.nn.functional.softmax(outputs.logits, dim=-1)
    
    # Get class with highest probability
    predicted_class_id = probabilities.argmax().item()
    
    return sentiment, confidence

4. Result Aggregation

  • Count negative/positive/neutral news per site
  • Generate overall statistics
  • Log all processing steps

📊 Result Interpretation

CategoryDescriptionExample Headline
NEGATIVENegative events, criticism, problems"Russian economy drops by 3%"
POSITIVEPositive events, achievements"New plant opens in Moscow"
NEUTRALFacts without emotional coloring"Duma meeting tomorrow"

🐛 Troubleshooting

Issue: Model won't download

# Solution: Check internet connection
# Model downloads from Hugging Face Hub
# Manual download:
git lfs install
git clone https://huggingface.co/seara/rubert-tiny2-russian-sentiment

Issue: Selectors are outdated

# Solution: Update selectors in code
selectors = {
    "https://lenta.ru": 'new_selector',
    "https://rbc.ru": 'new_selector',
    "https://kommersant.ru": "new_selector"
}

Issue: Out of memory

# Solution: Use CPU instead of GPU
# Add to code:
device = torch.device('cpu')
model.to(device)

🚧 Roadmap

  • Save results - export to JSON/CSV/Excel
  • Web interface - dashboard with FastAPI + Plotly
  • Telegram bot - daily reports to messenger
  • More sources - TASS, RIA Novosti, Izvestia
  • Caching - reduce load on websites
  • Docker container - simplify deployment
  • CI/CD - automated testing on GitHub Actions
  • Database - PostgreSQL for history storage

🤝 Contributing

Pull requests are welcome! For major changes, please open an issue first to discuss.

How to contribute:

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/AmazingFeature)
  3. Commit your changes (git commit -m 'Add some AmazingFeature')
  4. Push to the branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

📄 License

This project is licensed under the MIT License. See the LICENSE file for details.

🙏 Acknowledgments

  • Hugging Face team for the transformers library
  • Seara for the excellent rubert-tiny2 Russian model
  • aiohttp and BeautifulSoup4 developers for quality tools

📞 Contact

⭐ If you like this project...

Star it on GitHub! It helps others find the project and motivates me to continue development.


Made with ❤️ for Russian news analysis


## Также создайте файл `.gitignore`:

```gitignore
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
env/
venv/
ENV/
.venv
.env

# IDE
.vscode/
.idea/
*.swp
*.swo
*~

# Model cache
.cache/
models/
.huggingface/

# Logs
*.log
logs/

# OS
.DS_Store
Thumbs.db
desktop.ini

# Jupyter
.ipynb_checkpoints/
*.ipynb

# PyTorch
*.pth
*.pt
*.bin

# Testing
.pytest_cache/
.coverage
htmlcov/

# Distribution
dist/
build/
*.egg-info/

Структура файлов в репозитории:

MrJ-Dm/news-sentiment-analyzer

Асинхронный анализатор тональности новостей

Python

1

1 commits

updated Apr 6, 2026

See the code

README

# News Sentiment Analyzer 📰

p.s English version from below

[![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)
[![PyTorch](https://img.shields.io/badge/PyTorch-2.9+-red.svg)](https://pytorch.org/)
[![Hugging Face](https://img.shields.io/badge/🤗-Transformers-yellow.svg)](https://huggingface.co/)
[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)

Асинхронный анализатор тональности новостей с крупнейших российских новостных порталов. Сервис автоматически парсит заголовки новостей с **Lenta.ru**, **RBC.ru** и **Kommersant.ru**, определяет их эмоциональную окраску (негатив/позитив/нейтральность) с помощью нейросетевой модели и предоставляет статистику.

## 🎯 Возможности

- 🚀 **Асинхронный парсинг** - одновременная загрузка данных с нескольких источников
- 🧠 **Анализ тональности** - определение эмоциональной окраски заголовков на русском языке
- 📊 **Статистика** - подсчет негативных, позитивных и нейтральных новостей по каждому источнику
- 🔄 **Обработка ошибок** - таймауты, сетевые ошибки, некорректные селекторы
- 📈 **Общая сводка** - агрегированные результаты по всем сайтам

## 🛠️ Технологический стек

| Технология | Назначение |
|------------|------------|
| **Python 3.8+** | Язык программирования |
| **aiohttp** | Асинхронные HTTP-запросы |
| **BeautifulSoup4** | Парсинг HTML и извлечение данных |
| **Transformers (Hugging Face)** | Загрузка и использование NLP-модели |
| **PyTorch** | Бэкенд для выполнения модели |
| **asyncio** | Асинхронное выполнение задач |

### Модель анализа тональности

Используется модель **[seara/rubert-tiny2-russian-sentiment](https://huggingface.co/seara/rubert-tiny2-russian-sentiment)** - легковесная версия BERT, оптимизированная для русского языка:
- Размер модели: ~50MB (tiny версия)
- Высокая скорость инференса
- Три класса: негатив, позитив, нейтраль

## 📦 Установка

### Клонирование репозитория

```bash
git clone https://github.com/MrJ_Dm/news-sentiment-analyzer.git
cd news-sentiment-analyzer

Установка зависимостей

# Установка всех зависимостей из requirements.txt
pip install -r requirements.txt

# Или установка только основных пакетов
pip install aiohttp beautifulsoup4 transformers torch

Примечание: При первом запуске модель автоматически загрузится из Hugging Face Hub (~50MB)

🚀 Запуск

python main.py

Пример вывода

2024-01-15 10:30:15,123 - INFO - Всё хорошо! url: https://lenta.ru - имеет статус: 200, размер - 156234 байт
2024-01-15 10:30:15,456 - INFO - Колл-во новостей: 47
2024-01-15 10:30:15,789 - INFO - 1. Путин подписал закон о цифровых рублях
2024-01-15 10:30:15,890 - INFO - тональность: НЕЙТРАЛ, уверенность - 87.34%
2024-01-15 10:30:15,891 - INFO - 2. Цены на нефть резко упали на фоне санкций
2024-01-15 10:30:15,950 - INFO - тональность: НЕГАТИВ, уверенность - 92.15%
2024-01-15 10:30:15,951 - INFO - 3. Российские ученые разработали новый препарат от рака
2024-01-15 10:30:16,010 - INFO - тональность: ПОЗИТИВ, уверенность - 88.67%
...
2024-01-15 10:30:17,500 - INFO - Негативных: 12. Позитивных: 8. Нейтральных: 27
2024-01-15 10:30:17,501 - INFO - --------------------------------------------------
2024-01-15 10:30:17,600 - INFO - Всё хорошо! url: https://rbc.ru - имеет статус: 200, размер - 234567 байт
...
2024-01-15 10:30:18,900 - INFO - 
=== Общая статистика по всем сайтам ===
2024-01-15 10:30:18,901 - INFO - Всего негативных: 35, позитивных: 22, нейтральных: 68

📁 Структура проекта

news-sentiment-analyzer/
│
├── main.py                 # Основной скрипт приложения
├── requirements.txt        # Зависимости проекта
├── README.md              # Документация (русская)
├── README_EN.md           # Документация (английская)
├── .gitignore             # Игнорируемые файлы
│
└── models/                # Директория для кэша моделей (создается автоматически)
    └── rubert-tiny2...    # Локально сохраненная модель

🔍 Как это работает

1. Асинхронная загрузка страниц

async def fetch_url(session, url):
    # Асинхронный запрос с таймаутом 10 секунд
    async with session.get(url, timeout=timeout) as response:
        return await response.text()

2. Парсинг заголовков

Для каждого сайта используется свой CSS-селектор:

СайтCSS-селектор
lenta.rua.card-mini
rbc.rua.main__feed__link
kommersant.ru.top_news__link

3. Анализ тональности

def analyze_sentiment(text):
    # Токенизация текста
    inputs = tokenizer(text, return_tensors='pt', truncation=True)
    
    # Инференс модели
    with torch.no_grad():
        outputs = model(**inputs)
    
    # Softmax для получения вероятностей
    probabilities = torch.nn.functional.softmax(outputs.logits, dim=-1)
    
    # Определение класса с максимальной вероятностью
    predicted_class_id = probabilities.argmax().item()
    
    return sentiment, confidence

4. Агрегация результатов

  • Подсчет негативных/позитивных/нейтральных новостей по каждому сайту
  • Формирование общей статистики
  • Логирование всех этапов работы

📊 Интерпретация результатов

КатегорияОписаниеПример заголовка
НЕГАТИВОтрицательные события, критика, проблемы"Экономика России упала на 3%"
ПОЗИТИВПоложительные события, достижения"Открыт новый завод в Москве"
НЕЙТРАЛФакты без эмоциональной окраски"Завтра состоится заседание Думы"

🐛 Возможные проблемы и решения

Проблема: Модель не загружается

# Решение: Проверьте интернет-соединение
# Модель загружается из Hugging Face Hub
# Можно загрузить вручную:
git lfs install
git clone https://huggingface.co/seara/rubert-tiny2-russian-sentiment

Проблема: Селекторы устарели

# Решение: Обновите селекторы в коде
selectors = {
    "https://lenta.ru": 'новый_селектор',
    "https://rbc.ru": 'новый_селектор',
    "https://kommersant.ru": "новый_селектор"
}

Проблема: Не хватает памяти

# Решение: Используйте CPU вместо GPU
# Добавьте в код:
device = torch.device('cpu')
model.to(device)

🤝 Участие в разработке

Pull requests приветствуются! Для крупных изменений, пожалуйста, сначала откройте issue для обсуждения.

Как внести вклад:

  1. Форкните репозиторий
  2. Создайте ветку для фичи (git checkout -b feature/AmazingFeature)
  3. Закоммитьте изменения (git commit -m 'Add some AmazingFeature')
  4. Запушьте ветку (git push origin feature/AmazingFeature)
  5. Откройте Pull Request

📄 Лицензия

Проект распространяется под лицензией MIT. Подробности в файле LICENSE.

🙏 Благодарности

  • Команде Hugging Face за библиотеку transformers
  • Seara за отличную модель rubert-tiny2 для русского языка
  • Разработчикам aiohttp и BeautifulSoup4 за качественные инструменты

📞 Контакты

⭐ Если вам понравился проект...

Поставьте звезду на GitHub! Это поможет другим пользователям найти проект и мотивирует меня на дальнейшее развитие.


Сделано с ❤️ для анализа российских новостей


```markdown
# News Sentiment Analyzer 📰

[![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)
[![PyTorch](https://img.shields.io/badge/PyTorch-2.9+-red.svg)](https://pytorch.org/)
[![Hugging Face](https://img.shields.io/badge/🤗-Transformers-yellow.svg)](https://huggingface.co/)
[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)

Asynchronous news sentiment analyzer from major Russian news portals. The service automatically parses news headlines from **Lenta.ru**, **RBC.ru**, and **Kommersant.ru**, determines their emotional tone (negative/positive/neutral) using a neural network model, and provides statistics.

## 🎯 Features

- 🚀 **Asynchronous parsing** - simultaneous data loading from multiple sources
- 🧠 **Sentiment analysis** - determining emotional tone of Russian headlines
- 📊 **Statistics** - counting negative, positive, and neutral news per source
- 🔄 **Error handling** - timeouts, network errors, invalid selectors
- 📈 **Summary report** - aggregated results across all websites

## 🛠️ Tech Stack

| Technology | Purpose |
|------------|---------|
| **Python 3.8+** | Programming language |
| **aiohttp** | Asynchronous HTTP requests |
| **BeautifulSoup4** | HTML parsing and data extraction |
| **Transformers (Hugging Face)** | Loading and using NLP models |
| **PyTorch** | Backend for model execution |
| **asyncio** | Asynchronous task execution |

### Sentiment Analysis Model

Uses the **[seara/rubert-tiny2-russian-sentiment](https://huggingface.co/seara/rubert-tiny2-russian-sentiment)** model - a lightweight version of BERT optimized for Russian language:
- Model size: ~50MB (tiny version)
- High inference speed
- Three classes: negative, positive, neutral

## 📦 Installation

### Cloning the repository

```bash
git clone https://github.com/MrJ_Dm/news-sentiment-analyzer.git
cd news-sentiment-analyzer

Installing dependencies

# Install all dependencies from requirements.txt
pip install -r requirements.txt

# Or install only core packages
pip install aiohttp beautifulsoup4 transformers torch

Note: The model will automatically download from Hugging Face Hub on first run (~50MB)

🚀 Usage

python main.py

Example Output

2024-01-15 10:30:15,123 - INFO - Success! url: https://lenta.ru - status: 200, size - 156234 bytes
2024-01-15 10:30:15,456 - INFO - News count: 47
2024-01-15 10:30:15,789 - INFO - 1. Putin signs digital ruble law
2024-01-15 10:30:15,890 - INFO - sentiment: NEUTRAL, confidence - 87.34%
2024-01-15 10:30:15,891 - INFO - 2. Oil prices drop sharply due to sanctions
2024-01-15 10:30:15,950 - INFO - sentiment: NEGATIVE, confidence - 92.15%
2024-01-15 10:30:15,951 - INFO - 3. Russian scientists develop new cancer drug
2024-01-15 10:30:16,010 - INFO - sentiment: POSITIVE, confidence - 88.67%
...
2024-01-15 10:30:17,500 - INFO - Negative: 12. Positive: 8. Neutral: 27
2024-01-15 10:30:17,501 - INFO - --------------------------------------------------
2024-01-15 10:30:17,600 - INFO - Success! url: https://rbc.ru - status: 200, size - 234567 bytes
...
2024-01-15 10:30:18,900 - INFO - 
=== Overall statistics across all sites ===
2024-01-15 10:30:18,901 - INFO - Total negative: 35, positive: 22, neutral: 68

📁 Project Structure

news-sentiment-analyzer/
│
├── main.py                 # Main application script
├── requirements.txt        # Project dependencies
├── README.md              # Documentation (Russian)
├── README_EN.md           # Documentation (English)
├── .gitignore             # Ignored files
│
└── models/                # Model cache directory (auto-created)
    └── rubert-tiny2...    # Locally stored model

🔍 How It Works

1. Asynchronous Page Loading

async def fetch_url(session, url):
    # Async request with 10 second timeout
    async with session.get(url, timeout=timeout) as response:
        return await response.text()

2. Parsing Headlines

Each site uses its own CSS selector:

SiteCSS Selector
lenta.rua.card-mini
rbc.rua.main__feed__link
kommersant.ru.top_news__link

3. Sentiment Analysis

def analyze_sentiment(text):
    # Tokenize text
    inputs = tokenizer(text, return_tensors='pt', truncation=True)
    
    # Model inference
    with torch.no_grad():
        outputs = model(**inputs)
    
    # Softmax for probabilities
    probabilities = torch.nn.functional.softmax(outputs.logits, dim=-1)
    
    # Get class with highest probability
    predicted_class_id = probabilities.argmax().item()
    
    return sentiment, confidence

4. Result Aggregation

  • Count negative/positive/neutral news per site
  • Generate overall statistics
  • Log all processing steps

📊 Result Interpretation

CategoryDescriptionExample Headline
NEGATIVENegative events, criticism, problems"Russian economy drops by 3%"
POSITIVEPositive events, achievements"New plant opens in Moscow"
NEUTRALFacts without emotional coloring"Duma meeting tomorrow"

🐛 Troubleshooting

Issue: Model won't download

# Solution: Check internet connection
# Model downloads from Hugging Face Hub
# Manual download:
git lfs install
git clone https://huggingface.co/seara/rubert-tiny2-russian-sentiment

Issue: Selectors are outdated

# Solution: Update selectors in code
selectors = {
    "https://lenta.ru": 'new_selector',
    "https://rbc.ru": 'new_selector',
    "https://kommersant.ru": "new_selector"
}

Issue: Out of memory

# Solution: Use CPU instead of GPU
# Add to code:
device = torch.device('cpu')
model.to(device)

🚧 Roadmap

  • Save results - export to JSON/CSV/Excel
  • Web interface - dashboard with FastAPI + Plotly
  • Telegram bot - daily reports to messenger
  • More sources - TASS, RIA Novosti, Izvestia
  • Caching - reduce load on websites
  • Docker container - simplify deployment
  • CI/CD - automated testing on GitHub Actions
  • Database - PostgreSQL for history storage

🤝 Contributing

Pull requests are welcome! For major changes, please open an issue first to discuss.

How to contribute:

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/AmazingFeature)
  3. Commit your changes (git commit -m 'Add some AmazingFeature')
  4. Push to the branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

📄 License

This project is licensed under the MIT License. See the LICENSE file for details.

🙏 Acknowledgments

  • Hugging Face team for the transformers library
  • Seara for the excellent rubert-tiny2 Russian model
  • aiohttp and BeautifulSoup4 developers for quality tools

📞 Contact

⭐ If you like this project...

Star it on GitHub! It helps others find the project and motivates me to continue development.


Made with ❤️ for Russian news analysis


## Также создайте файл `.gitignore`:

```gitignore
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
env/
venv/
ENV/
.venv
.env

# IDE
.vscode/
.idea/
*.swp
*.swo
*~

# Model cache
.cache/
models/
.huggingface/

# Logs
*.log
logs/

# OS
.DS_Store
Thumbs.db
desktop.ini

# Jupyter
.ipynb_checkpoints/
*.ipynb

# PyTorch
*.pth
*.pt
*.bin

# Testing
.pytest_cache/
.coverage
htmlcov/

# Distribution
dist/
build/
*.egg-info/

Структура файлов в репозитории: