Пределы классики: почему счётчиков слов мало
Классические методы довели нас далеко, но у них есть стеклянный потолок; этот урок честно очерчивает их границы и готовит почву для эмбеддингов.
Семантический разрыв — неспособность счётных моделей понять, что разные слова могут означать близкие вещи, а одно слово — разные вещи.
Что мы умеем после классики
К этому моменту мы научились многому без единой нейросети: превращать текст в векторы (bag-of-words, TF-IDF), мерить похожесть (косинус), классифицировать (наивный байес), предсказывать слова (n-граммы). Это рабочие инструменты, которые до сих пор применяются. Но у всех них общий фундаментальный изъян.
Изъян 1: слова — это просто индексы
В bag-of-words «кот», «кошка» и «котёнок» — три разных, никак не связанных измерения. Модель не знает, что они близки. Покажем это: косинус между «кот» и «кошка» в one-hot представлении равен нулю — как у совершенно несвязанных слов.
vocab = ["кот", "кошка", "молоток"]
def one_hot(word):
return [1 if w == word else 0 for w in vocab]
def cosine(a, b):
dot = sum(x * y for x, y in zip(a, b))
import math
na = math.sqrt(sum(x * x for x in a))
nb = math.sqrt(sum(y * y for y in b))
return dot / (na * nb) if na and nb else 0.0
print("cos(кот, кошка) =", cosine(one_hot("кот"), one_hot("кошка")))
print("cos(кот, молоток)=", cosine(one_hot("кот"), one_hot("молоток")))
Вывод:
cos(кот, кошка) = 0.0 cos(кот, молоток)= 0.0
Вот в чём беда: для классики «кот» одинаково далёк и от «кошки», и от «молотка». Близость по смыслу полностью утеряна. А ведь именно смысловая близость — то, чего мы хотим от понимания языка.
Изъян 2: разрежённость и размерность
Словарь реального корпуса — десятки и сотни тысяч слов. Каждый документ — вектор такой длины, почти весь из нулей. Это дорого по памяти и плохо для многих алгоритмов («проклятие размерности»). С n-граммами всё ещё хуже — размерность взрывается.
Изъян 3: слабый и короткий контекст
N-граммная модель видит 1-2 предыдущих слова. Она никогда не свяжет начало и конец длинного предложения, не разрешит «он/она» из соседнего абзаца. Контекст в классике либо отсутствует (мешок слов), либо предельно короток (n-граммы).
Изъян 4: незнакомые слова и формы
Новое слово или редкая форма — это новое измерение, про которое модель ничего не знает. Лемматизация помогает лишь отчасти и зависит от языка.
Что напрашивается
Хочется, чтобы у слова было плотное представление (не десятки тысяч нулей, а, скажем, 300 осмысленных чисел), в котором близкие по смыслу слова были близки геометрически. Тогда «кот» и «кошка» окажутся рядом, а арифметика над словами станет осмысленной. Это и есть идея эмбеддингов — следующий раздел.
А чтобы по-настоящему учитывать длинный контекст и порядок, понадобятся нейросети для последовательностей и механизм внимания — это разделы 5 и 6. Классика — фундамент, на котором всё это строится, но потолок у неё есть, и мы его достигли.
Сравнительная таблица
| Свойство | Классика (BoW/TF-IDF) | Чего хочется |
| Близость слов по смыслу | нет | «кот» ≈ «кошка» |
| Размер вектора слова | = размер словаря (десятки тысяч) | плотный, ~300 |
| Контекст | нет или 1-2 слова | длинный, гибкий |
Итог
- Классика мощна, но слова в ней — несвязанные индексы без смысла.
- Векторы огромны и разрежены; контекст короткий или отсутствует.
- Хочется плотных представлений, где близкие по смыслу слова близки геометрически.
- Это мотивирует эмбеддинги (раздел 4) и нейросети с вниманием (разделы 5-6).