Что такое N-грамма (N-gram) в NLP?

Ответ

N-грамма — это непрерывная последовательность из N элементов (токенов) в тексте. Элементами обычно являются слова или символы. N-граммы — фундаментальная концепция в статистическом анализе языка.

Типы N-грамм:

  • Униграмма (1-gram): Отдельные слова. ["Я", "изучаю", "NLP"]
  • Биграмма (2-gram): Пары последовательных слов. ["Я изучаю", "изучаю NLP"]
  • Триграмма (3-gram): Тройки слов. ["Я изучаю NLP"]

Применение:

  • Языковое моделирование: Предсказание следующего слова на основе предыдущих N-1 слов.
  • Определение темы/жанра текста.
  • Поиск и исправление опечаток.
  • Построение простых чат-ботов.

Пример кода на Python с использованием NLTK:

from nltk import ngrams
from nltk.tokenize import word_tokenize

text = "Я изучаю обработку естественного языка."
tokens = word_tokenize(text, language='russian')

# Генерация биграмм
bigrams = list(ngrams(tokens, 2))
print(bigrams)
# Вывод: [('Я', 'изучаю'), ('изучаю', 'обработку'), ('обработку', 'естественного'), ...]

# Частотный анализ
from nltk.probability import FreqDist
freq_dist = FreqDist(bigrams)
print(freq_dist.most_common(3))

Ограничения: С ростом N резко увеличивается размер модели (проклятие размерности), а также падает вероятность встретить конкретную N-грамму в новых данных.

Ответ 18+ 🔞

А, ну вот, опять эти ваши N-граммы! Слушай, история-то проще пареной репы, но без неё нихуя в обработке текстов не сделаешь. Представь, что ты читаешь книгу и выписываешь оттуда не просто слова, а целые куски по N штук подряд. Вот и вся магия, ёпта.

Что это за зверь такой? Это просто последовательность из N каких-то кусочков текста, обычно слов. Типа как бусины на нитку нанизал.

  • Униграмма (1-gram): Одна бусина. По-простому — отдельное слово. ["Я", "изучаю", "NLP"]. Скукота, но основа.
  • Биграмма (2-gram): Две бусины подряд. ["Я изучаю", "изучаю NLP"]. Уже теплее, можно уловить, что за чем идёт.
  • Триграмма (3-gram): Ну ты понял, три бусины. ["Я изучаю NLP"]. Вот тут уже почти целая мысль.

И нахуя это всё? А применяется эта штука овердохуища где! Серьёзно.

  • Предсказание текста: Твой телефон, когда подсказывает следующее слово — он тупо смотрит, какие N-граммы чаще всего встречались в его тренировочных данных после такой же приставки. Умом не двигай, статистика, блядь!
  • Угадать, о чём текст: Если в тексте сплошь биграммы «квантовый компьютер» и «чёрная дыра», а не «сметана» и «огурчик», то, пиздец, вряд ли это рецепт окрошки.
  • Исправить опечатки: Написал «обрабоька» — система видит, что биграмма «естественного обрабоька» нихуя не встречается, а вот «естественного обработка» — пожалуйста. И поправляет тебя, умная жопа.
  • Чат-боты древние: Да-да, те тупые скриптовые боты, которые отвечали заученными фразами, часто работали на триграммах. Увидел в вопросе знакомую цепочку слов — выдал ответ.

Вот, смотри, как на Python это выглядит (код не трогаю, он святой):

from nltk import ngrams
from nltk.tokenize import word_tokenize

text = "Я изучаю обработку естественного языка."
tokens = word_tokenize(text, language='russian')

# Генерация биграмм
bigrams = list(ngrams(tokens, 2))
print(bigrams)
# Вывод: [('Я', 'изучаю'), ('изучаю', 'обработку'), ('обработку', 'естественного'), ...]

# Частотный анализ
from nltk.probability import FreqDist
freq_dist = FreqDist(bigrams)
print(freq_dist.most_common(3))

Но и тут, конечно, без ложки дёгтя. Главная беда — проклятие размерности, ядрёна вошь! Хочешь сделать модель на 5-граммах? Ну готовь терабайты памяти, потому что комбинаций слов будет, как звёзд на небе, а большинство из них ты в жизни не увидишь. Сделаешь N слишком большим — модель станет огромной и тупой, как валенок, потому что новые тексты будут состоять из незнакомых ей длинных цепочек. А сделаешь маленьким — толку будет, как от козла молока. Баланс, ёпта, везде нужен баланс.