Universal Sentence Encoder (USE) — это мощная модель для получения векторных представлений предложений, фраз и текстовых блоков, которая позволяет эффективно выполнять задачи обработки естественного языка, такие как поиск по смыслу, классификация текста и кластеризация. В TensorFlow.js модель доступна для использования прямо в браузере или на сервере с Node.js, что обеспечивает удобство интеграции в веб-приложения.
В Node.js проект USE подключается через пакет
@tensorflow-models/universal-sentence-encoder:
import * as use from '@tensorflow-models/universal-sentence-encoder';
import * as tf from '@tensorflow/tfjs-node';
Для браузерного использования подключение происходит через скрипт:
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"></script>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/universal-sentence-encoder"></script>
После подключения модели необходимо её загрузить:
const model = await use.load();
Применение модели к тексту позволяет получить вектор фиксированной размерности, пригодный для последующей обработки:
const sentences = [
"TensorFlow.js позволяет выполнять машинное обучение в браузере.",
"Universal Sentence Encoder создаёт векторные представления предложений."
];
const embeddings = await model.embed(sentences);
embeddings.print();
embed возвращает объект Tensor,
где каждая строка соответствует вектору предложения.[число_предложений, 512].Векторные представления можно использовать для вычисления косинусного сходства между предложениями, что позволяет оценивать их семантическую близость:
function cosineSimilarity(vecA, vecB) {
const dotProduct = vecA.dot(vecB).dataSync()[0];
const normA = vecA.norm().dataSync()[0];
const normB = vecB.norm().dataSync()[0];
return dotProduct / (normA * normB);
}
const sentenceA = embeddings.slice([0, 0], [1, 512]);
const sentenceB = embeddings.slice([1, 0], [1, 512]);
const similarity = cosineSimilarity(sentenceA, sentenceB);
console.log('Косинусное сходство:', similarity);
[-1, 1].1 означает высокую семантическую
близость.USE можно использовать как встроенный слой эмбеддинга для нейронных сетей:
const modelTF = tf.sequential();
modelTF.add(tf.layers.dense({inputShape: [512], units: 128, activation: 'relu'}));
modelTF.add(tf.layers.dense({units: 3, activation: 'softmax'}));
const labels = tf.tensor([[1,0,0],[0,1,0],[0,0,1]]); // пример для трех классов
await modelTF.compile({optimizer: 'adam', loss: 'categoricalCrossentropy', metrics: ['accuracy']});
await modelTF.fit(embeddings, labels, {epochs: 10});
const batchSize = 32;
for (let i = 0; i < sentences.length; i += batchSize) {
const batch = sentences.slice(i, i + batchSize);
const batchEmbeddings = await model.embed(batch);
// обработка batchEmbeddings
}
@tensorflow/tfjs-node-gpu.