Обработка естественного языка

Введение в 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, запуск скриптов
  • Введение в ML
  • Вероятности для языковых моделей

От Джорджтаунского эксперимента до эпохи эмбеддингов

История 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-levelunbelievable["unbelievable"]Сохраняет смысл / Огромный словарь
Subword (BPE)unbelievable["un", "believ", "able"]Баланс / Стандарт в LLM
Character-levelunbelievable["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-IDFSentiment ("!!!" = сильная эмоция)
Стоп-словаПоиск, 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
Введение в NLP

0

1

Войти