Обработка естественного языка
Введение в NLP
ChatGPT не видит слово "don't". Видит токены [Don, 'n't] - это меняет всё. Модель обрабатывает отрицание иначе, чем предполагает интуиция. tiktoken OpenAI: словарь из 100277 токенов, не 26 букв. Первые 10 лет NLP сломались именно здесь - на допущении что слово = единица смысла. Хомский в 1956 построил теорию универсальной грамматики. Современные трансформеры достигают лучшего качества перевода вообще без грамматических правил - только токены и статистика на терабайтах текста.
- **GPT tokenization:** tiktoken разбивает текст на 100277 возможных токенов. Слово "unbelievable" → ["un", "bel", "ievable"]. Именно поэтому LLM считают токены, не слова - и именно поэтому цена API в $/1M tokens, не $/1M words
- **BERT WordPiece и DeepL:** нейронный перевод DeepL с 1B+ параметров работает на subword-токенизации. Разбивая редкие слова на части, модель обобщается на слова, которые не видела при обучении
- **Sentiment analysis в Bloomberg:** финансовый NLP анализирует тысячи новостей в секунду. Один токен "не" перед "вырос" - и сигнал инвертируется. Preprocessing определяет, правильно ли модель поймёт отрицание
- **Named Entity Recognition:** Bloomberg Terminal извлекает названия компаний, тикеры, имена из неструктурированных новостей - это NER в продакшене с требованием latency < 100 ms
- **spaCy и HuggingFace:** spaCy обрабатывает миллион токенов в секунду на одном CPU. HuggingFace Transformers за три строки кода даёт BERT, GPT-2, RoBERTa - то, на что раньше уходили месяцы
Предварительные знания
- Базовый Python: строки, списки, циклы, импорт библиотек
- Понимание, что такое модель машинного обучения и обучающая выборка
- Командная строка: установка пакетов через pip, запуск скриптов
От Джорджтаунского эксперимента до эпохи эмбеддингов
История NLP начинается с Джорджтаунского эксперимента 1954 года: IBM и Джорджтаунский университет публично перевели больше шестидесяти русских предложений на английский на машине IBM 701. Пресса предсказала автоматический перевод за пять лет, но реальность оказалась куда сложнее. В 1966 Джозеф Вайценбаум из MIT написал ELIZA, программу, имитировавшую психотерапевта простым сопоставлением шаблонов. Люди приписывали ELIZA понимание, которого у неё не было, и сам Вайценбаум был встревожен этим эффектом. Десятилетиями NLP опирался на рукописные правила и грамматики. Перелом наступил в 1990-х: статистическая революция заменила правила вероятностными моделями, обученными на больших корпусах текста. Следующий скачок произошёл в 2013 году с приходом word2vec и плотных эмбеддингов, которые открыли эру глубокого обучения в обработке языка.
Tokenization
ChatGPT не видит слово "don't". Модель видит токены - и от того, как именно разбито "don't", зависит качество обработки отрицания. NLTK даёт ["ca", "n't"] для "can't" - отрицание выделено. Наивный split() даёт ["can't"] - отрицание склеено со вспомогательным глаголом. **Tokenization** - первый и самый важный шаг в NLP: разбиение текста на минимальные единицы (токены), с которыми работает модель.
**Токен** - это атомарная единица текста, с которой работает модель. Это может быть слово, часть слова, символ или даже байт. Выбор стратегии токенизации определяет, какую информацию модель сможет извлечь из текста.
| Стратегия | Вход: "unbelievable" | Результат | Плюсы / Минусы |
|---|---|---|---|
| Word-level | unbelievable | ["unbelievable"] | Сохраняет смысл / Огромный словарь |
| Subword (BPE) | unbelievable | ["un", "believ", "able"] | Баланс / Стандарт в LLM |
| Character-level | unbelievable | ["u","n","b","e",...] | Маленький словарь / Длинные последовательности |
**Не все языки используют пробелы!** В китайском (我喜欢猫) и японском (私は猫が好き) нет пробелов между словами. В немецком составные слова вроде "Donaudampfschiffahrtsgesellschaftskapitän" - это одно "слово". Универсальной токенизации не существует.
**Современные LLM** (GPT, BERT, LLaMA) используют **subword-токенизацию** (BPE или SentencePiece). Частые слова остаются целыми ("the" → ["the"]), редкие разбиваются на части ("tokenization" → ["token", "ization"]). Это позволяет работать с любыми словами, даже с опечатками.
Какой результат даст NLTK word_tokenize для строки "I can't"?
Preprocessing
После токенизации текст всё ещё «грязный»: регистр, пунктуация, стоп-слова, разные формы Unicode. **Preprocessing** - серия преобразований, приводящих токены к единому виду перед подачей в модель. Каждый шаг - осознанный выбор, а не автоматический ритуал.
**Стоп-слова** (stop words) - это высокочастотные слова, которые несут мало смысловой нагрузки: "the", "is", "at", "on", "a". В английском их ~180, в русском ~250. Удаление стоп-слов уменьшает размер данных и снижает шум.
**Не удаляйте стоп-слова бездумно!** Для задачи sentiment analysis фраза "not good" без стоп-слов станет просто "good" - смысл инвертирован! Для поисковых систем и BoW - удалять полезно. Для BERT и GPT - не нужно, модель сама учитывает контекст.
| Шаг | Когда применять | Когда НЕ применять |
|---|---|---|
| Lowercasing | Поиск, классификация | NER ("Apple" компания vs "apple" фрукт) |
| Удаление пунктуации | BoW, TF-IDF | Sentiment ("!!!" = сильная эмоция) |
| Стоп-слова | Поиск, topic modeling | Переводчик, QA-системы |
| Unicode NFC | Всегда | Почти нет исключений |
**Порядок preprocessing имеет значение.** Если удалить пунктуацию до токенизации, то "don't" станет "dont" - одним непонятным токеном. Правильный порядок: токенизация → lowercasing → удаление пунктуации → стоп-слова.
Почему удаление стоп-слов может навредить задаче sentiment analysis?
NLP Pipeline
Отдельные шаги - токенизация, нормализация, vectorization - объединяются в **NLP pipeline**: цепочку преобразований от сырого текста до результата модели. Конвейер, где выход одного шага - вход следующего. Критичное следствие: vectorizer обучается только на train-данных, иначе модель «подсматривает» статистику теста - data leakage.
**Зачем нужен pipeline?** Три причины: 1. **Воспроизводимость** - все шаги зафиксированы. 2. **Без утечки данных** - vectorizer обучается только на train, а не на test. 3. **Batch processing** - один вызов `pipeline.predict()` обрабатывает тысячи текстов.
**spaCy vs NLTK:** NLTK - это набор отдельных инструментов (как конструктор Lego). spaCy - готовый pipeline (как собранная модель). Для продакшена обычно выбирают spaCy или HuggingFace Transformers. Для обучения и экспериментов - NLTK.
Современные Transformer-пайплайны (HuggingFace) ещё проще - модель сама выполняет токенизацию и preprocessing, три строки кода. Но понимание каждого шага критично для диагностики: когда BERT выдаёт странные результаты, причина чаще всего - неправильный preprocessing или несоответствие токенизатора модели.
Что произойдёт, если обучить TfidfVectorizer на всех данных (train + test), а не только на train?
Задачи NLP
NLP - не одна задача, а целое семейство. Каждая формулирует вопрос по-своему: «какую эмоцию передаёт текст?», «кто упомянут в документе?», «как перевести это на другой язык?». HuggingFace Transformers решает каждую из них за три строки кода - но понимать разницу между ними необходимо, чтобы выбрать нужную.
| Задача | Вход → Выход | Пример применения |
|---|---|---|
| Text Classification | Текст → Категория | Спам-фильтр: письмо → спам/не спам |
| Sentiment Analysis | Текст → Эмоция | Отзывы: "Отличный товар!" → Positive |
| Named Entity Recognition | Текст → Сущности | "Apple в Купертино" → Apple=ORG, Купертино=LOC |
| Machine Translation | Текст (яз. A) → Текст (яз. B) | Google Translate |
| Question Answering | Вопрос + Контекст → Ответ | ChatGPT, поисковые системы |
| Summarization | Длинный текст → Краткий | Сжатие новостей до 2-3 предложений |
| Text Generation | Промпт → Текст | GPT-4, копирайтинг, код |
**NER (Named Entity Recognition)** - одна из самых практичных задач NLP. Она позволяет автоматически извлекать имена людей (PER), организации (ORG), локации (LOC), даты (DATE) и другие сущности из неструктурированного текста. Используется в поисковых системах, CRM, юридическом анализе документов.
Задачи NLP делятся по уровню контекста: уровень токена - POS-tagging, NER; уровень предложения - classification, sentiment; уровень документа - summarization, topic modeling; между текстами - translation, QA, semantic similarity. Чем выше уровень - тем больше контекста нужно модели, тем дороже инференс.
**Начните с HuggingFace pipeline.** Для прототипа или MVP достаточно трёх строк кода. Когда поймёте, что нужна кастомизация (свои данные, другой язык, latency) - тогда углубляйтесь в обучение моделей.
NLP - это просто набор регулярных выражений и правил для обработки текста
Современный NLP основан на deep learning (Transformers, BERT, GPT). Регулярки решают лишь простейшие задачи вроде валидации email. Для понимания смысла, контекста, иронии и многозначности нужны нейросети, обученные на миллиардах текстов.
Регулярные выражения не способны обрабатывать контекст и семантику. Фразу "банк реки" и "банк выдал кредит" невозможно различить правилами - нужна модель, которая понимает окружающий контекст каждого слова.
Какая задача NLP решает проблему: "из 10-страничного договора вытащить все упомянутые компании и даты"?
Ключевые идеи
- **Tokenization** - разбиение текста на минимальные единицы. Стратегия (word/subword/char) определяет что видит модель. ChatGPT видит [Don, 'n't], не слово "don't"
- **Subword (BPE/WordPiece)** - стандарт в LLM: частые слова целые, редкие разбиваются. tiktoken: 100277 токенов, не 26 букв
- **Preprocessing** - нормализация текста. Каждый шаг осознан: удаление стоп-слов ломает sentiment ("not good" → "good"), Unicode NFC нужен всегда
- **Pipeline** объединяет все шаги в воспроизводимую цепочку. fit только на train - иначе data leakage
- **Хомский 1956 → tiktoken:** теория универсальной грамматики проиграла статистике на масштабе. Трансформеры переводят лучше без единого грамматического правила
Связанные темы
NLP - на пересечении лингвистики и машинного обучения:
- Регулярные выражения и текст — Инструменты для работы с текстом на низком уровне - когда pipeline избыточен
- Bag of Words и TF-IDF — Vectorization - ключевой шаг pipeline, превращение токенов в числа для модели
Вопросы для размышления
- tiktoken разбивает "tokenization" на ["token", "ization"]. Почему subword лучше word-level для редких слов и опечаток?
- Фраза "not bad" после удаления стоп-слов становится "bad". Sentiment-модель, обученная с удалёнными стоп-словами, даст какой результат?
- BERT использует WordPiece, GPT-4 использует BPE (tiktoken). Оба subword-алгоритма, но принципиально разные. Что между ними общего и в чём ключевое отличие?
Связанные уроки
- nlp-02 — Следующий шаг: векторные представления слов и эмбеддинги
- ml-01-intro — ML-фундамент для обучения языковых моделей
- fl-01-intro — Формальные языки: грамматики и парсинг
- prob-01-intro — Вероятности для языкового моделирования
- aie-03-llm-fundamentals — NLP-пайплайны внутри современных LLM
- ir-01 — Поиск информации как приложение NLP