Что такое n-граммы?
n-граммы — это последовательности из n смежных элементов (обычно слов или символов) из текста. В контексте обработки естественного языка (NLP), n-граммы применяются для извлечения информации о лексических и синтаксических зависимостях, моделирования языка, извлечения признаков, машинного перевода, генерации текста и других задач.
Основные понятия
-
n-грамма — это непрерывная последовательность из n единиц (токенов), взятая из заданной выборки текста.
-
1-грамма (униграмма) — отдельное слово или символ.
-
2-грамма (биграмма) — пара подряд идущих слов или символов.
-
3-грамма (триграмма) — три последовательных слова и т.д.
Пример (по словам):
Текст: "я люблю машинное обучение"
-
Унтиграммы (n=1): ["я", "люблю", "машинное", "обучение"]
-
Биграммы (n=2): [("я", "люблю"), ("люблю", "машинное"), ("машинное", "обучение")]
-
Триграммы (n=3): [("я", "люблю", "машинное"), ("люблю", "машинное", "обучение")]
Пример (по символам):
Текст: "машина"
- Биграммы (символьные): ["ма", "аш", "ши", "ин", "на"]
Зачем нужны n-граммы
-
Контекст и порядок слов
В отличие от Bag of Words, n-граммы частично учитывают порядок слов. Например:-
"не хочу" и "хочу" — разные биграммы.
-
Это особенно важно в задачах анализа тональности, автоматического перевода и генерации текста.
-
-
Представление текста
n-граммы используются как признаки (features) для обучения моделей машинного обучения, особенно в классификации текстов. -
Моделирование языка
В языковых моделях вероятность следующего слова часто оценивается на основе предыдущих 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-граммной моделью языка (например, биграммная или триграммная модель). -
Поиск шаблонов и фраз
Позволяют находить часто встречающиеся устойчивые фразы: "машинное обучение", "искусственный интеллект" и т.п. -
Улучшение качества моделей
Добавление n-грамм в качестве признаков может значительно повысить точность классификации текста или извлечения информации.
Как работают n-граммы
Процесс генерации n-грамм из текста включает:
-
Токенизацию — разделение текста на слова или символы.
-
Скользящее окно размером 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-грамм
-
Учитывают порядок слов
Повышают точность задач, где важен контекст (например, "не хороший" vs. "хороший"). -
Работают без лемматизации и синтаксического анализа
Эффективны даже на "сырых" текстах. -
Просты в реализации
Скользящее окно можно реализовать в пару строк кода.
Недостатки n-грамм
-
**Экспоненциальный рост признаков
**-
При увеличении n размер словаря резко возрастает.
-
Например, при n=3 для большого корпуса может быть десятки миллионов уникальных триграмм.
-
-
**Разреженность данных
**- Большинство возможных n-грамм встречаются редко, что ухудшает обобщающую способность моделей.
-
**Нет семантики
**- "обучение машины" и "обучение собаки" — разные триграммы, хоть структура одна.
-
**Ограниченный контекст
**- Даже триграммы охватывают максимум 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.