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