NLP_Homework_1 / README.md
Kolesnikov Dmitry
feat: Готовый проект
54ccdcb
---
title: NLP Homework 1
emoji: 🚀
colorFrom: red
colorTo: red
sdk: docker
app_port: 8501
tags:
- streamlit
pinned: false
short_description: Streamlit template space
---
# 🔤 Анализ токенизации и нормализации текста
**Лабораторная работа №1**
*Сравнительный анализ методов токенизации и нормализации текста на материале русскоязычных новостных корпусов*
## 📋 Описание проекта
Данный проект представляет собой комплексное исследование различных методов токенизации и нормализации текста на русском языке. Проект включает в себя:
- **Сбор данных** с новостных сайтов (РИА Новости, ТАСС, Лента.ру и др.)
- **Предобработку и очистку** текстовых данных
- **Сравнение методов токенизации** (наивная, regex, razdel, spaCy, NLTK)
- **Обучение подсловных моделей** (BPE, WordPiece, Unigram)
- **Интерактивный веб-интерфейс** для анализа результатов
- **Визуализацию** и экспорт результатов
## 🚀 Быстрый старт
### Установка зависимостей
```bash
pip install -r requirements.txt
```
### Запуск веб-интерфейса
```bash
streamlit run src/streamlit_app.py
```
Приложение будет доступно по адресу: http://localhost:8501
## 📁 Структура проекта
```
NLP_Homework_1/
├── data/ # Данные корпуса
│ ├── raw_corpus.jsonl # Исходный корпус
│ └── sample_small.jsonl # Примеры данных
├── src/ # Исходный код
│ ├── scrapers.py # Сбор данных с сайтов
│ ├── text_cleaner.py # Очистка текста
│ ├── universal_preprocessor.py # Универсальная предобработка
│ ├── tokenizers_cmp.py # Сравнение методов токенизации
│ ├── train_subword.py # Обучение подсловных моделей
│ ├── streamlit_app.py # Веб-интерфейс
│ └── utils.py # Вспомогательные функции
├── models/ # Обученные модели
├── results/ # Результаты анализа
├── notebooks/ # Jupyter notebooks
├── requirements.txt # Зависимости
└── README.md # Документация
```
## 🛠️ Основные модули
### 1. Сбор данных (`scrapers.py`)
Автоматический сбор новостных статей с популярных русскоязычных сайтов:
```python
python src/scrapers.py --auto --out data/raw_corpus.jsonl --min_words 50000
```
**Поддерживаемые сайты:**
- lenta.ru
- ria.ru
- tass.ru
- kommersant.ru
- meduza.io
### 2. Очистка текста (`text_cleaner.py`)
Модуль для первичной очистки и нормализации текста:
```python
from src.text_cleaner import clean_text, clean_corpus_jsonl
# Очистка отдельного текста
cleaned = clean_text(text, lower=True, remove_stopwords=False)
# Очистка всего корпуса
clean_corpus_jsonl("data/raw_corpus.jsonl", "data/cleaned_corpus.jsonl")
```
### 3. Универсальная предобработка (`universal_preprocessor.py`)
Конфигурируемый модуль для стандартизации текста:
```python
from src.universal_preprocessor import UniversalPreprocessor, PreprocessingConfig
config = PreprocessingConfig(
replace_urls=True,
replace_emails=True,
expand_abbreviations=True
)
preprocessor = UniversalPreprocessor(config)
processed_text = preprocessor.preprocess(text)
```
### 4. Сравнение методов токенизации (`tokenizers_cmp.py`)
Комплексное сравнение различных методов токенизации:
```python
from src.tokenizers_cmp import TokenizationComparator
comparator = TokenizationComparator()
results = comparator.compare_methods(texts, methods=['naive', 'razdel', 'spacy'])
```
**Поддерживаемые методы:**
- Наивная токенизация (по пробелам)
- Регулярные выражения
- Razdel (специально для русского языка)
- NLTK
- SpaCy
- PyMorphy2 (лемматизация)
- Стемминг (Porter, Snowball)
### 5. Обучение подсловных моделей (`train_subword.py`)
Обучение и сравнение подсловных моделей токенизации:
```python
from src.train_subword import SubwordModelTrainer, SubwordModelConfig
trainer = SubwordModelTrainer()
config = SubwordModelConfig(model_type='bpe', vocab_size=16000)
model_path = trainer.train_model(config, "data/corpus.txt")
```
**Поддерживаемые алгоритмы:**
- Byte Pair Encoding (BPE)
- WordPiece
- Unigram Language Model
- SentencePiece
## 📊 Метрики оценки
### Для методов токенизации:
- **Объем словаря** — количество уникальных токенов
- **Доля OOV** — процент слов, не вошедших в словарь
- **Скорость обработки** — время на 1000 статей
- **Коэффициент сжатия** — отношение исходных слов к токенам
### Для подсловных моделей:
- **Процент фрагментации** — доля слов, разбитых на 2+ подслова
- **Точность реконструкции** — насколько точно модель восстанавливает исходный текст
- **Эффективность сжатия** — отношение числа исходных слов к числу токенов
## 🎯 Веб-интерфейс
Интерактивное приложение на Streamlit предоставляет:
- **Загрузку данных** (файлы, примеры, корпус)
- **Настройку предобработки** (замена URL, email, чисел, сокращений)
- **Выбор методов токенизации** для сравнения
- **Визуализацию результатов** (графики, таблицы, статистика)
- **Экспорт данных** (CSV, JSON)
### Запуск интерфейса:
```bash
streamlit run src/streamlit_app.py
```
## 📈 Примеры использования
### Сравнение методов токенизации
```python
from src.tokenizers_cmp import TokenizationComparator, load_corpus_from_jsonl
# Загружаем данные
texts = load_corpus_from_jsonl("data/raw_corpus.jsonl", max_articles=100)
# Создаем компаратор
comparator = TokenizationComparator()
# Сравниваем методы
results = comparator.compare_methods(texts, methods=['naive', 'razdel', 'spacy'])
# Сохраняем результаты
comparator.save_results(results, "results/tokenization_comparison.csv")
```
### Обучение подсловных моделей
```python
from src.train_subword import SubwordModelTrainer
trainer = SubwordModelTrainer()
# Подготавливаем корпус
trainer.prepare_corpus("data/raw_corpus.jsonl", "data/corpus.txt")
# Обучаем несколько моделей
trained_models = trainer.train_multiple_models("data/corpus.txt", vocab_sizes=[8000, 16000, 32000])
# Сравниваем модели
comparison_results = trainer.compare_models(trained_models, test_texts)
```
## 🔧 Требования
- Python 3.8+
- Зависимости из `requirements.txt`
### Основные библиотеки:
- `streamlit` — веб-интерфейс
- `pandas`, `numpy` — обработка данных
- `plotly`, `matplotlib` — визуализация
- `nltk`, `spacy` — NLP библиотеки
- `razdel` — токенизация для русского языка
- `tokenizers`, `sentencepiece` — подсловные модели
- `requests`, `beautifulsoup4` — сбор данных
## 📝 Результаты
Проект демонстрирует:
1. **Эффективность различных методов токенизации** на русском языке
2. **Сравнительный анализ подсловных моделей** с различными параметрами
3. **Влияние предобработки** на качество токенизации
4. **Практические рекомендации** по выбору методов для различных задач
## 🤝 Вклад в проект
Проект выполнен в рамках лабораторной работы по курсу "Обработка естественного языка" и демонстрирует полный цикл работы с текстовыми данными — от сбора до анализа и визуализации результатов.
## 📄 Лицензия
Проект создан в образовательных целях для изучения методов токенизации и нормализации текста на русском языке.