Ответ
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 слишком большим — модель станет огромной и тупой, как валенок, потому что новые тексты будут состоять из незнакомых ей длинных цепочек. А сделаешь маленьким — толку будет, как от козла молока. Баланс, ёпта, везде нужен баланс.