Основная идея: "Скажи мне, кто твой друг, и я скажу, кто ты". Если два слова часто встречаются в похожих контекстах (окружены одними и теми же соседями), то их векторные представления будут похожи.
🎯 Простой пример-аналогия
Представьте, что у нас есть маленький корпус текста:
"кот ловит мышь. собака гоняет кота. кот и собака не дружат."
-
Создаём окно контекста
Алгоритм скользит по тексту "окном" (например, размером в 1 слово слева и справа). Для слова "кот" в первом предложении контекст — это["ловит"]. -
Запоминаем соседей
Алгоритм учится предсказывать: "Если в центре стоит слово 'кот', то с большой вероятностью рядом будет слово 'ловит'". Так он улавливает связи. -
Результат обучения
После обработки всего текста векторы слов "кот" и "собака" станут немного похожи (они оба могут быть "агентами" в предложении), но будут далеки от вектора "мышь" (объект действия).
Самое известное свойство: Вектор("король") - Вектор("мужчина") + Вектор("женщина") ≈ Вектор("королева").
🔧 Пошаговый алгоритм (на примере архитектуры Skip-gram)
Допустим, у нас есть предложение "кислый лимон", а размер окна = 1.
Шаг 1: Подготовка
* Создаём словарь: {"кислый": 0, "лимон": 1}
* Инициализируем каждому слову два случайных вектора:
* V — для когда слово целевое (в центре).
* U — для когда слово контекстное (сосед).
Шаг 2: Берём первую пару
Целевое слово: Wt = "лимон". Контекстное слово: Wc = "кислый".
Наша задача: настроить векторы так, чтобы для "лимона" вероятность слова "кислый" в контексте была максимальной.
Шаг 3: Считаем вероятность (упрощённо)
1. Берем вектор-строку V_лимон (для целевого слова).
2. Берем вектор-столбец U_кислый (для контекстного).
3. Скалярное произведение V_лимон • U_кислый показывает, насколько слова "подходят" друг другу.
4. Через функцию softmax превращаем это число в вероятность (например, 0.85).
Шаг 4: Обучение (корректировка векторов)
* Идеально: Вероятность для реальной пары ("лимон", "кислый") должна быть близка к 1.
* Реальность: Сначала она маленькая, так как векторы случайные.
* Алгоритм (например, backpropagation) сдвигает вектор V_лимон чуть ближе к вектору U_кислый, чтобы увеличить их скалярное произведение. А векторы других слов (например, "сладкий") — чуть отдаляет.
Шаг 5: Повторяем для всех пар
* Проходим по всем парам (целевое слово, контекстное слово) в тексте.
* Делаем тысячи таких корректировок.
* В конце обучения вектор V_кислый будет близок к векторам других прилагательных, а V_лимон — к векторам других фруктов.
🗺️ Наглядная таблица: два подхода Word2Vec
| Параметр | Skip-gram | CBOW (Continuous Bag of Words) |
|---|---|---|
| Задача | По целевому слову угадать контекстные слова. | По контекстным словам угадать целевое слово. |
| Аналогия | "Дано слово 'программист'. Какие слова обычно его окружают? ('пишет', 'код', 'компьютер')" | "Даны слова 'пишет', 'код'. Какое слово может быть в центре? ('программист')" |
| Работа с редкими словами | Работает лучше, так как одно редкое целевое слово встречается в нескольких примерах. | Хуже, так редкое слово "теряется" среди контекстных. |
| Скорость | Медленнее | Быстрее |
💻 Простой код на Python (с использованием библиотеки gensim)
from gensim.models import Word2Vec
# 1. Подготовка данных: каждое предложение — список слов
sentences = [
["кот", "ловит", "мышь"],
["собака", "гоняет", "кота"],
["кот", "и", "собака", "не", "дружат"]
]
# 2. Обучение модели (используем Skip-gram)
model = Word2Vec(sentences, vector_size=5, window=1, sg=1, min_count=1)
# 3. Проверяем вектор слова "кот"
print("Вектор слова 'кот':", model.wv["кот"])
# 4. Находим похожие слова
print("Самые похожие на 'кот':", model.wv.most_similar("кот", topn=2))
# 5. Проверяем сходство
print("Сходство 'кот' и 'собака':", model.wv.similarity("кот", "собака"))
print("Сходство 'кот' и 'мышь':", model.wv.similarity("кот", "мышь"))
Пояснение параметров:
* vector_size=5 — размерность вектора (в реальности 100-300).
* window=1 — размер окна контекста (1 слово слева и справа).
* sg=1 — алгоритм Skip-gram (если sg=0, то CBOW).
* min_count=1 — учитывать слова, встретившиеся минимум 1 раз.
🧠 Ключевые выводы
- Не алгоритм машинного перевода, а метод представления слов.
- Основан на распределённой гипотезе: значение слова определяется его окружением.
- Skip-gram: лучше для редких слов. CBOW: быстрее и лучше для частых слов.
- Векторы захватывают не только синтаксис (часть речи), но и семантику (значение), что позволяет делать арифметические операции со смыслом.
Простая аналогия для запоминания: Представьте, что вы на вечеринке. За каждым гостем наблюдают и записывают, с кем он чаще всего общается. Через пару часов, даже не зная профессий, можно кластеризовать гостей: "эти двое из IT", "эта группа — музыканты". Word2Vec делает то же самое со словами в тексте.
Если хотите глубже, стоит почитать оригинальную статью Миколова или покрутить параметры в gensim, чтобы увидеть, как меняются векторы.
Оставить отзыв
Комментарии
Загрузка комментариев...
★ Оставить отзыв