# News Sentiment Analyzer 📰
p.s English version from below
[](https://www.python.org/downloads/)
[](https://pytorch.org/)
[](https://huggingface.co/)
[](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... # Локально сохраненная модель
async def fetch_url(session, url):
# Асинхронный запрос с таймаутом 10 секунд
async with session.get(url, timeout=timeout) as response:
return await response.text()
Для каждого сайта используется свой CSS-селектор:
| Сайт | CSS-селектор |
|---|---|
| lenta.ru | a.card-mini |
| rbc.ru | a.main__feed__link |
| kommersant.ru | .top_news__link |
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
| Категория | Описание | Пример заголовка |
|---|---|---|
| НЕГАТИВ | Отрицательные события, критика, проблемы | "Экономика России упала на 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 для обсуждения.
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)Проект распространяется под лицензией MIT. Подробности в файле LICENSE.
Поставьте звезду на GitHub! Это поможет другим пользователям найти проект и мотивирует меня на дальнейшее развитие.
Сделано с ❤️ для анализа российских новостей
```markdown
# News Sentiment Analyzer 📰
[](https://www.python.org/downloads/)
[](https://pytorch.org/)
[](https://huggingface.co/)
[](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
# 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)
python main.py
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
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
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()
Each site uses its own CSS selector:
| Site | CSS Selector |
|---|---|
| lenta.ru | a.card-mini |
| rbc.ru | a.main__feed__link |
| kommersant.ru | .top_news__link |
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
| Category | Description | Example Headline |
|---|---|---|
| NEGATIVE | Negative events, criticism, problems | "Russian economy drops by 3%" |
| POSITIVE | Positive events, achievements | "New plant opens in Moscow" |
| NEUTRAL | Facts without emotional coloring | "Duma meeting tomorrow" |
# 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
# Solution: Update selectors in code
selectors = {
"https://lenta.ru": 'new_selector',
"https://rbc.ru": 'new_selector',
"https://kommersant.ru": "new_selector"
}
# Solution: Use CPU instead of GPU
# Add to code:
device = torch.device('cpu')
model.to(device)
Pull requests are welcome! For major changes, please open an issue first to discuss.
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)This project is licensed under the MIT License. See the LICENSE file for details.
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/
# News Sentiment Analyzer 📰
p.s English version from below
[](https://www.python.org/downloads/)
[](https://pytorch.org/)
[](https://huggingface.co/)
[](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... # Локально сохраненная модель
async def fetch_url(session, url):
# Асинхронный запрос с таймаутом 10 секунд
async with session.get(url, timeout=timeout) as response:
return await response.text()
Для каждого сайта используется свой CSS-селектор:
| Сайт | CSS-селектор |
|---|---|
| lenta.ru | a.card-mini |
| rbc.ru | a.main__feed__link |
| kommersant.ru | .top_news__link |
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
| Категория | Описание | Пример заголовка |
|---|---|---|
| НЕГАТИВ | Отрицательные события, критика, проблемы | "Экономика России упала на 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 для обсуждения.
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)Проект распространяется под лицензией MIT. Подробности в файле LICENSE.
Поставьте звезду на GitHub! Это поможет другим пользователям найти проект и мотивирует меня на дальнейшее развитие.
Сделано с ❤️ для анализа российских новостей
```markdown
# News Sentiment Analyzer 📰
[](https://www.python.org/downloads/)
[](https://pytorch.org/)
[](https://huggingface.co/)
[](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
# 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)
python main.py
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
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
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()
Each site uses its own CSS selector:
| Site | CSS Selector |
|---|---|
| lenta.ru | a.card-mini |
| rbc.ru | a.main__feed__link |
| kommersant.ru | .top_news__link |
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
| Category | Description | Example Headline |
|---|---|---|
| NEGATIVE | Negative events, criticism, problems | "Russian economy drops by 3%" |
| POSITIVE | Positive events, achievements | "New plant opens in Moscow" |
| NEUTRAL | Facts without emotional coloring | "Duma meeting tomorrow" |
# 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
# Solution: Update selectors in code
selectors = {
"https://lenta.ru": 'new_selector',
"https://rbc.ru": 'new_selector',
"https://kommersant.ru": "new_selector"
}
# Solution: Use CPU instead of GPU
# Add to code:
device = torch.device('cpu')
model.to(device)
Pull requests are welcome! For major changes, please open an issue first to discuss.
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)This project is licensed under the MIT License. See the LICENSE file for details.
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/