NLP_Homework_1 / README.md
Kolesnikov Dmitry
feat: Готовый проект
54ccdcb
metadata
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)
  • Интерактивный веб-интерфейс для анализа результатов
  • Визуализацию и экспорт результатов

🚀 Быстрый старт

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

pip install -r requirements.txt

Запуск веб-интерфейса

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 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)

Модуль для первичной очистки и нормализации текста:

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)

Конфигурируемый модуль для стандартизации текста:

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)

Комплексное сравнение различных методов токенизации:

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)

Обучение и сравнение подсловных моделей токенизации:

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)

Запуск интерфейса:

streamlit run src/streamlit_app.py

📈 Примеры использования

Сравнение методов токенизации

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")

Обучение подсловных моделей

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. Практические рекомендации по выбору методов для различных задач

🤝 Вклад в проект

Проект выполнен в рамках лабораторной работы по курсу "Обработка естественного языка" и демонстрирует полный цикл работы с текстовыми данными — от сбора до анализа и визуализации результатов.

📄 Лицензия

Проект создан в образовательных целях для изучения методов токенизации и нормализации текста на русском языке.