Spaces:
Sleeping
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— сбор данных
📝 Результаты
Проект демонстрирует:
- Эффективность различных методов токенизации на русском языке
- Сравнительный анализ подсловных моделей с различными параметрами
- Влияние предобработки на качество токенизации
- Практические рекомендации по выбору методов для различных задач
🤝 Вклад в проект
Проект выполнен в рамках лабораторной работы по курсу "Обработка естественного языка" и демонстрирует полный цикл работы с текстовыми данными — от сбора до анализа и визуализации результатов.
📄 Лицензия
Проект создан в образовательных целях для изучения методов токенизации и нормализации текста на русском языке.