Spaces:
Sleeping
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) | |
| - **Интерактивный веб-интерфейс** для анализа результатов | |
| - **Визуализацию** и экспорт результатов | |
| ## 🚀 Быстрый старт | |
| ### Установка зависимостей | |
| ```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. **Практические рекомендации** по выбору методов для различных задач | |
| ## 🤝 Вклад в проект | |
| Проект выполнен в рамках лабораторной работы по курсу "Обработка естественного языка" и демонстрирует полный цикл работы с текстовыми данными — от сбора до анализа и визуализации результатов. | |
| ## 📄 Лицензия | |
| Проект создан в образовательных целях для изучения методов токенизации и нормализации текста на русском языке. | |