Вычисление близости слов

Библиотека ml5.js представляет собой удобный интерфейс для использования моделей машинного обучения в браузере на языке JavaScript. Она построена на базе TensorFlow.js и ориентирована на простоту интеграции и экспериментирование. Одной из важных задач в обработке текста является вычисление близости слов или фраз, что позволяет решать задачи поиска, кластеризации и семантического анализа.

В ml5.js для этого используются предобученные word embeddings — численные векторы, представляющие слова в многомерном пространстве. Основная идея заключается в том, что семантически похожие слова имеют близкие векторы, а метрика расстояния в этом пространстве позволяет оценивать степень их сходства.

Подключение библиотеки и загрузка модели

Для работы с ml5.js достаточно подключить библиотеку через CDN или npm. В браузерном окружении это выглядит так:

<script src="https://cdn.jsdelivr.net/npm/ml5@latest/dist/ml5.min.js"></script>

Затем создаётся объект модели для работы с векторными представлениями слов:

let word2vec;

ml5.word2vec('models/wordvecs.json', modelLoaded);

function modelLoaded() {
  console.log('Модель загружена и готова к использованию');
}

Ключевые моменты:

  • word2vec — объект, предоставляющий методы для вычисления близости слов.
  • Файл wordvecs.json содержит заранее обученные векторные представления.
  • Метод modelLoaded подтверждает, что модель доступна для вычислений.

Основные методы для вычисления близости слов

1. Поиск наиболее близких слов

Метод similar(word, callback) позволяет получить список слов, ближайших к заданному:

word2vec.similar('кошка', (err, results) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(results); 
});

Выходные данные имеют структуру массива объектов:

[
  { word: "кот", dist: 0.12 },
  { word: "питомец", dist: 0.25 },
  { word: "животное", dist: 0.33 }
]
  • word — ближайшее по семантике слово.
  • dist — числовое значение расстояния или меры сходства (чем меньше, тем ближе).

2. Вычисление косинусного сходства между двумя словами

Для прямого сравнения двух слов используется метод distance:

word2vec.distance('кошка', 'собака', (err, similarity) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log('Сходство:', similarity);
});
  • Значение similarity варьируется от 0 до 1.
  • Чем ближе к 1, тем более семантически похожи слова.

3. Аналогия слов

Метод analogy позволяет находить слово по принципу аналогий: «A относится к B, как C относится к ?»:

word2vec.analogy('король', 'мужчина', 'женщина', (err, result) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(result.word); // Например: 'королева'
});
  • Это полезно для поиска семантических закономерностей в текстовых данных.

Практические примеры использования

Кластеризация слов по семантике

Сначала нужно вычислить векторы всех слов, а затем применить алгоритмы кластеризации (например, k-means) на уровне Jav * aScript:

const words = ['кошка', 'собака', 'птица', 'рыба'];
const vectors = [];

words.forEach(word => {
  word2vec.vector(word, (err, vector) => {
    vectors.push(vector);
    if (vectors.length === words.length) {
      console.log('Все векторы получены', vectors);
      // здесь можно запускать алгоритм кластеризации
    }
  });
});
  • Метод vector(word, callback) возвращает численный массив, представляющий слово в пространстве признаков.
  • После получения векторов можно использовать библиотеку для кластеризации или визуализации (например, d3.js или PCA).

Поиск наиболее релевантных слов в тексте

Можно вычислять средний вектор для текста и искать ближайшие слова в модели:

function averageVector(wordsArray) {
  const vectors = [];
  let count = 0;
  wordsArray.forEach(word => {
    word2vec.vector(word, (err, vector) => {
      if (!err && vector) {
        vectors.push(vector);
        count++;
      }
      if (count === wordsArray.length) {
        const avgVector = vectors[0].map((_, i) => 
          vectors.reduce((sum, v) => sum + v[i], 0) / vectors.length
        );
        console.log('Средний вектор текста:', avgVector);
      }
    });
  });
}
averageVector(['кошка', 'мягкий', 'питомец']);
  • Средний вектор текста отражает его общую семантическую направленность.
  • На основе него можно находить ближайшие ключевые слова или темы.

Тонкости и ограничения

  • Модели word2vec в ml5.js обычно обучены на английском языке; для русского требуется отдельный корпус.

  • Метрики расстояния зависят от качества и объёма обучающих данных.

  • Для больших словарей и массивов слов важно учитывать асинхронность и обрабатывать данные через колбэки или промисы.

  • Векторы слов не учитывают контекст, поэтому слова с несколькими значениями могут давать смешанные результаты. Для контекстного анализа стоит использовать более современные модели, например, BERT или GPT-подобные, с преобразованием их в embeddings, что совместимо с ml5.js через TensorFlow.js.