Найти в Дзене
Цифровая Переплавка

🔢 Косинусное сходство: как TypeScript помогает ИИ понять, что котёнок — это почти кот

Оглавление

Если вы когда-либо задумывались, как современные приложения и ИИ-сервисы определяют, что «котёнок» ближе к «коту», чем к «автомобилю», то вам будет интересно узнать о косинусной мере сходства (Cosine Similarity). Это мощный инструмент, который активно используется в NLP (Natural Language Processing), системах рекомендаций и даже поисковых движках.

Но что это за магия такая — косинусное сходство?

🧭 Что такое Cosine Similarity и почему это важно?

Представьте себе два слова: «котёнок» и «щенок». Очевидно, что они имеют много общего. Но как научить машину понимать это сходство? Один из самых эффективных способов — представить слова в виде векторов и замерить угол между ними. Чем меньше угол, тем больше похожи векторы (а значит, и сами слова).

Cosine Similarity оценивает именно угол между векторами, а не их длину, что позволяет сравнивать даже тексты разного размера и длины, избегая проблем с масштабами.

Примеры возможных значений:

  • ✅ 1 — идентичные векторы (полное сходство)
  • ⚠️ 0 — векторы перпендикулярны (никакой связи)
  • ❌ -1 — противоположные векторы (противоположный смысл)

⚙️ Технические детали реализации на TypeScript

Давайте взглянем на техническую сторону вопроса и реализуем Cosine Similarity, используя современный подход в TypeScript.

🛠️ Реализация функции Cosine Similarity в TypeScript

/*
* Вычисляет косинусное сходство между двумя векторами
* @param vecA Первый вектор
* @param vecB Второй вектор
* @returns число от -1 до 1, где 1 означает полную идентичность
*/
function cosineSimilarity(vecA: number[], vecB: number[]): number {
if (vecA.length !== vecB.length) {
throw new Error("Векторы должны быть одинаковой длины");
}

// Dot product (скалярное произведение)
const dotProduct = vecA.reduce((sum, current, idx) => sum + current * vecB[idx], 0);

// Magnitude (длина) векторов
const magnitudeA = Math.hypot(...vecA);
const magnitudeB = Math.hypot(...vecB);

// Проверка на нулевые векторы
if (magnitudeA === 0 || magnitudeB === 0) {
return 0;
}

// Cosine Similarity (финальный расчёт)
return dotProduct / (magnitudeA * magnitudeB);
}

Эта функция максимально проста, эффективна и легко встраивается в любые существующие приложения на JavaScript или TypeScript.

📈 Что происходит под капотом?

Чтобы лучше понять механику Cosine Similarity, давайте рассмотрим простой пример расчёта.

📌 Пример расчёта по шагам:

Возьмём векторы [3, 4] и [5, 2].

  • 🧮 Скалярное произведение (Dot Product):
    (3 × 5) + (4 × 2) = 15 + 8 = 23
  • 📐 Вычисление длины векторов (Magnitude):Длина первого вектора: √(3² + 4²) = √25 = 5
    Длина второго вектора: √(5² + 2²) ≈ √29 ≈ 5.385
  • 🎯 Итоговое Cosine Similarity:
    23 / (5 × 5.385) ≈ 0.854

Значение 0.854 говорит о том, что векторы направлены примерно в одном направлении и поэтому похожи.

⚡️ Практические применения Cosine Similarity

Использование Cosine Similarity актуально для множества задач:

  • 🔍 Семантический поиск
    Позволяет находить документы по смыслу, а не только по ключевым словам.
  • 🛒 Системы рекомендаций
    «Похожие товары» в интернет-магазине или рекомендации Netflix работают на похожем принципе.
  • 🗂️ Системы классификации текстов
    Классификация текстов по темам или выявление плагиата.
  • 🤖 ChatGPT и похожие ИИ-ассистенты
    Подбор наиболее близких ответов или запросов пользователей.

📌 Технические детали реализации и оптимизации

Современные реализации Cosine Similarity, такие как предложенная выше, обычно используют функции JavaScript:

  • 🛠️ Math.hypot() — быстрая и точная функция для вычисления длины вектора (без необходимости вручную возводить в квадрат и извлекать корень).
  • ♻️ Array.reduce() для простого и чистого кода вычисления скалярного произведения.

Кроме того, важно помнить о проверках на крайние случаи (например, деление на ноль при нулевой длине вектора).

💬 Личное мнение автора статьи

С моей точки зрения, одна из главных причин популярности Cosine Similarity — простота и ясность. Она не только даёт чёткое и понятное математическое обоснование, но и легко интерпретируется даже новичками. Это особенно важно в мире современных веб-приложений и ИИ, где сложность решений растёт с каждым днём, и ясность реализации становится преимуществом.

К тому же Cosine Similarity легко реализуется на любом языке программирования и отлично подходит для масштабирования — именно то, что нужно в современной разработке!

🛎️ Заключение

Cosine Similarity — это не просто математика ради математики. Это инструмент, который может существенно улучшить ваше приложение, сделав его по-настоящему «умным». Применяя его на практике, вы сможете создавать более точные и эффективные системы, улучшать пользовательский опыт и раскрывать новые возможности для вашего продукта.

🗃️ Полезные ссылки по теме:

💬 А вы уже использовали Cosine Similarity в своих проектах? Поделитесь опытом в комментариях! 🚀