Что такое n-граммы?

n-граммы — это последовательности из n смежных элементов (обычно слов или символов) из текста. В контексте обработки естественного языка (NLP), n-граммы применяются для извлечения информации о лексических и синтаксических зависимостях, моделирования языка, извлечения признаков, машинного перевода, генерации текста и других задач.

Основные понятия

  • n-грамма — это непрерывная последовательность из n единиц (токенов), взятая из заданной выборки текста.

  • 1-грамма (униграмма) — отдельное слово или символ.

  • 2-грамма (биграмма) — пара подряд идущих слов или символов.

  • 3-грамма (триграмма) — три последовательных слова и т.д.

Пример (по словам):
Текст: "я люблю машинное обучение"

  • Унтиграммы (n=1): ["я", "люблю", "машинное", "обучение"]

  • Биграммы (n=2): [("я", "люблю"), ("люблю", "машинное"), ("машинное", "обучение")]

  • Триграммы (n=3): [("я", "люблю", "машинное"), ("люблю", "машинное", "обучение")]

Пример (по символам):
Текст: "машина"

  • Биграммы (символьные): ["ма", "аш", "ши", "ин", "на"]

Зачем нужны n-граммы

  1. Контекст и порядок слов
    В отличие от Bag of Words, n-граммы частично учитывают порядок слов. Например:

    • "не хочу" и "хочу" — разные биграммы.

    • Это особенно важно в задачах анализа тональности, автоматического перевода и генерации текста.

  2. Представление текста
    n-граммы используются как признаки (features) для обучения моделей машинного обучения, особенно в классификации текстов.

  3. Моделирование языка
    В языковых моделях вероятность следующего слова часто оценивается на основе предыдущих n–1 слов:
    P(wn∣w1,w2,...,wn−1)≈P(wn∣wn−(n−1),...,wn−1)P(w_n | w_1, w_2, ..., w_{n-1}) \approx P(w_n | w_{n-(n-1)}, ..., w_{n-1})
    Это называется n-граммной моделью языка (например, биграммная или триграммная модель).

  4. Поиск шаблонов и фраз
    Позволяют находить часто встречающиеся устойчивые фразы: "машинное обучение", "искусственный интеллект" и т.п.

  5. Улучшение качества моделей
    Добавление n-грамм в качестве признаков может значительно повысить точность классификации текста или извлечения информации.

Как работают n-граммы

Процесс генерации n-грамм из текста включает:

  1. Токенизацию — разделение текста на слова или символы.

  2. Скользящее окно размером n — проход по тексту с шагом 1 для получения последовательностей.

Пример:
Текст: "текстовый анализ данных"

Шаг 1: токенизация → ["текстовый", "анализ", "данных"]
Шаг 2: биграммы → [("текстовый", "анализ"), ("анализ", "данных")]

Взвешивание n-грамм

После извлечения n-грамм их можно представить в числовом виде, как и отдельные слова:

  • CountVectorizer: частоты n-грамм

  • TF-IDF Vectorizer: взвешенные значения

  • One-hot encoding: бинарные признаки наличия

  • Эмбеддинги: усреднение векторов слов в n-грамме

Использование в scikit-learn

from sklearn.feature_extraction.text import CountVectorizer
corpus = \[
"машинное обучение это интересно",
"обучение требует практики"
\]
vectorizer = CountVectorizer(ngram_range=(1, 2)) # униграммы и биграммы
X = vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names_out())

Выход:
['это', 'машинное', 'обучение', 'интересно', 'требует', 'практики', 'машинное обучение', 'обучение это', 'это интересно', 'обучение требует', 'требует практики']

Преимущества n-грамм

  1. Учитывают порядок слов
    Повышают точность задач, где важен контекст (например, "не хороший" vs. "хороший").

  2. Работают без лемматизации и синтаксического анализа
    Эффективны даже на "сырых" текстах.

  3. Просты в реализации
    Скользящее окно можно реализовать в пару строк кода.

Недостатки n-грамм

  1. **Экспоненциальный рост признаков
    **

    • При увеличении n размер словаря резко возрастает.

    • Например, при n=3 для большого корпуса может быть десятки миллионов уникальных триграмм.

  2. **Разреженность данных
    **

    • Большинство возможных n-грамм встречаются редко, что ухудшает обобщающую способность моделей.
  3. **Нет семантики
    **

    • "обучение машины" и "обучение собаки" — разные триграммы, хоть структура одна.
  4. **Ограниченный контекст
    **

    • Даже триграммы охватывают максимум 3 слова, не способны понять зависимости на уровне предложений или абзацев.

Практические советы

  • Используйте ngram_range=(1,2) или (1,3) — комбинация униграмм, биграмм и триграмм даёт хороший баланс.

  • Применяйте фильтрацию по частоте:

    • min_df — исключить редкие n-граммы.

    • max_df — исключить слишком частые (например, "в этом", "и это").

  • Объединяйте n-граммы с TF-IDF для повышения качества модели.

  • Для русскоязычных текстов полезна предварительная лемматизация, иначе каждый вариант слова создаст отдельную n-грамму.

В языковом моделировании

n-граммы лежали в основе первых языковых моделей, где вероятность следующего слова вычисляется как условная вероятность предыдущих:

  • Униграммная модель:
    P(w1,w2,...,wn)=∏iP(wi)P(w_1, w_2, ..., w_n) = \prod_i P(w_i)

  • Биграммная модель:
    P(w1,w2,...,wn)=∏iP(wi∣wi−1)P(w_1, w_2, ..., w_n) = \prod_i P(w_i | w_{i-1})

  • Триграммная модель:
    P(w1,w2,...,wn)=∏iP(wi∣wi−2,wi−1)P(w_1, w_2, ..., w_n) = \prod_i P(w_i | w_{i-2}, w_{i-1})

Сейчас эти модели в основном заменены нейросетевыми, но n-граммы остаются полезным инструментом в прикладных задачах и как baseline.