Почему язык труден для машин
Прежде чем строить модели, важно понять врага: что именно в языке мешает машине понимать его «в лоб».
Неоднозначность — свойство языка, при котором одно и то же слово или предложение можно понять несколькими способами в зависимости от контекста.
Язык не похож на язык программирования
В Python x = 2 + 2 всегда означает одно и то же. Естественный язык устроен иначе: значение слова зависит от соседей, от темы разговора, от того, кто говорит и зачем. Машина, которая видит лишь цепочку символов, должна как-то восстановить этот скрытый смысл. Разберём главные сложности.
1. Лексическая неоднозначность (омонимы)
Одно слово — несколько значений. «Ключ» — это и от двери, и родник, и нотный знак. «Лук» — растение или оружие. Человек выбирает значение по контексту мгновенно; модель должна научиться этому из данных.
senses = {
"ключ": ["от двери", "родник", "нотный знак", "к разгадке"],
"лук": ["растение", "оружие для стрельбы"],
}
for word, meanings in senses.items():
print(word, "->", len(meanings), "значения:", ", ".join(meanings))
Вывод:
ключ -> 4 значения: от двери, родник, нотный знак, к разгадке лук -> 2 значения: растение, оружие для стрельбы
2. Синтаксическая неоднозначность
Целое предложение может разбираться по-разному. Классика: «Казнить нельзя помиловать» — смысл меняется от запятой. Или «Я видел человека с биноклем»: бинокль у меня или у человека? Структура предложения не всегда однозначна, и это влияет на смысл.
3. Контекст и связи между предложениями
Смысл слова часто определяется не соседним словом, а тем, что было сказано абзацем выше. «Он положил книгу на стол. Она была тяжёлой.» — что было тяжёлым, книга или стол? Чтобы это понять, модели нужна память о контексте — именно отсюда вырастет потребность в рекуррентных сетях и внимании в конце курса.
4. Идиомы, ирония, культурный фон
«Бить баклуши» не про баклуши, «золотые руки» не про золото. Ирония вообще переворачивает буквальный смысл: «Ну отличная погодка» под дождём означает обратное. Буквальное чтение здесь проваливается.
5. Морфологическое богатство
В русском у одного слова десятки форм: «стол, стола, столу, столом, столы…». Для машины это разные строки, хотя для человека — одно слово. Если просто сравнивать строки, «бежал» и «бежит» окажутся «разными словами».
forms = ["бежать", "бежит", "бежал", "бегут", "побежали"]
# наивно: считаем формы разными, если строки не равны
unique_as_strings = len(set(forms))
print("Форм:", len(forms))
print("Разных строк для машины:", unique_as_strings)
print("А по смыслу слово одно: 'бежать'")
Вывод:
Форм: 5 Разных строк для машины: 5 А по смыслу слово одно: 'бежать'
6. Длинный хвост и редкие слова
В любом языке несколько слов встречаются очень часто, а огромное число слов — крайне редко (закон Ципфа). Модель почти не видит редких слов на обучении, а новые слова (неологизмы, имена, опечатки) появляются постоянно. Это называют проблемой «out-of-vocabulary» — слов, которых нет в словаре модели.
Зачем нам это знать
Каждая сложность из списка породила конкретный приём в NLP. С морфологией борются стемминг и лемматизация. С редкими словами — подсловная токенизация (BPE). С контекстом — рекуррентные сети, а затем внимание и трансформеры. Дальше в курсе мы будем встречать эти решения и каждый раз сможем сказать, какую именно трудность языка они снимают.
Итог
- Язык неоднозначен на уровне слов и предложений — значение зависит от контекста.
- Идиомы и ирония ломают буквальное прочтение.
- Богатая морфология плодит много форм одного слова.
- Редкие и новые слова — постоянная головная боль (out-of-vocabulary).
- Эти трудности и определяют развитие методов NLP — от стемминга до трансформеров.