Библиотека 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 }
]
2. Вычисление косинусного сходства между двумя словами
Для прямого сравнения двух слов используется метод
distance:
word2vec.distance('кошка', 'собака', (err, similarity) => {
if (err) {
console.error(err);
return;
}
console.log('Сходство:', similarity);
});
similarity варьируется от 0 до 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.