Найти в Дзене
Один Rust не п...Rust

Эмбединги с помощью Rust

Для чего нужна данная статья? : Зачем Вам это уметь? : Загрузить предварительно обученные вложения (например, GloVe или Word2Vec) в память и использовать их для представления слов или фраз. Пример : use std::collections::HashMap; fn load_embeddings(file_path: &str) -> HashMap<String, Vec<f32>> {
let mut embeddings = HashMap::new();
embeddings } fn get_embedding(word: &str, embeddings: &HashMap<String, Vec<f32>>) -> Option<&Vec<f32>> { embeddings.get(word) } Предварительно обученные векторы могут храниться в текстовых файлах (например glove.6B.300d.txt, ) или сериализованных форматах. После загрузки вы можете получить доступ к векторам по ключу или использовать средние значения для представления фраз из нескольких слов. use std::collections::HashMap; use std::fs::File; use std::io::{BufRead, BufReader}; fn load_embeddings(file_path: &str) -> HashMap<String, Vec<f32>> { let mut embeddings = HashMap::new(); let file = File::open(file_path).expect("Cannot open file");
Оглавление

Для чего нужна данная статья? :

  • Создать представления текста, генерировать и обрабатывать их несколькими способами с использованием базовых библиотек.

Зачем Вам это уметь? :

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

Загрузить предварительно обученные вложения (например, GloVe или Word2Vec) в память и использовать их для представления слов или фраз.

Пример :

use std::collections::HashMap;

fn load_embeddings(file_path: &str) -> HashMap<String, Vec<f32>> {


let mut embeddings = HashMap::new();

embeddings

}

fn get_embedding(word: &str, embeddings: &HashMap<String, Vec<f32>>) ->

Option<&Vec<f32>> { embeddings.get(word) }

Предварительно обученные векторы могут храниться в текстовых файлах (например glove.6B.300d.txt, ) или сериализованных форматах. После загрузки вы можете получить доступ к векторам по ключу или использовать средние значения для представления фраз из нескольких слов.

use std::collections::HashMap;

use std::fs::File;

use std::io::{BufRead, BufReader};

fn load_embeddings(file_path: &str) -> HashMap<String, Vec<f32>> {

let mut embeddings = HashMap::new();

let file = File::open(file_path).expect("Cannot open file");

let reader = BufReader::new(file);

for line in reader.lines() {

let line = line.expect("Could not read line");

let mut parts = line.split_whitespace();

let word = parts.next().unwrap().to_string();

let embedding: Vec<f32> = parts.map(|s| s.parse().unwrap()).collect();

embeddings.insert(word, embedding);

}

embeddings

}

fn main() {

let embeddings = load_embeddings("glove.6B.50d.txt"); // Path to the GloVe file

if let Some(vec) = embeddings.get("hello") {

println!("Embedding for 'hello': {:?}", vec);

} else {

println!("Word not found in embeddings");

}

}

2. Использование библиотек встраивания Rust

Rust-Bert : реализация модели языка BERT на языке Rust с предварительно обученными моделями и встраиваниями.

rust2vec : библиотека для загрузки и использования внедрений в Rust, поддерживающая различные форматы, такие как GloVe и Word2Vec.

Пример с Rust-Bert :

use rust_bert::pipelines::sentence_embeddings::{SentenceEmbeddingsBuilder,

SentenceEmbeddingsModelType}; fn main() -> anyhow::Result<()> {
let model =

SentenceEmbeddingsBuilder::remote(SentenceEmbeddingsModelType::AllMiniL

mL6V2).create_model()?;

let embeddings = model.encode(&["This is a sample sentence."])?;

println!

("{:?}", embeddings[0]); // Print embedding for the sentence Ok(()) }

Установите rust-bertдля встраивания на основе трансформатора. Обязательно добавьте rust-bertи tchв свой Cargo.toml.

[dependencies]

rust-bert = "0.16.0"

tch = { version = "0.6.1", features = ["libtorch-sys"] }

3. Создание пользовательских вложений с помощью библиотек машинного обучения

  • Linfa : инструменты для машинного обучения, похожие на scikit-learn Python. Его можно использовать для создания пользовательских алгоритмов встраивания, таких как PCA или t-SNE.

Пример использования PCA для снижения размерности :

use linfa::dataset::Dataset;


use linfa_reduction::pca::Pca; fn main() {


let dataset = Dataset::new(/* data here */);


let pca = Pca::params(3).fit(&dataset).unwrap();


let embeddings = pca.transform(&dataset);


println!("{:?}", embeddings.records);

}

Чтобы создать пользовательские вложения с помощью Linfa, добавьте linfaи linfa-reductionв Cargo.toml.

[dependencies]

linfa = "0.3.0"

linfa-reduction = "0.3.0"

ndarray = "0.15.4"

4. FFI вложения из Python

Для расширенных или пользовательских встраиваний можно вызывать библиотеки Python (например, gensimWord2Vec) из Rust с помощью pyo3или rust-cpython.

Пример сpyo3 :

use pyo3::prelude::*;


use pyo3::types::IntoPyDict; fn main() -> PyResult<()> {

Python::with_gil(|py| {


let gensim = py.import("gensim")?;


let keyed_vectors =

gensim.get("models").unwrap().call_method("KeyedVectors", (), None)?;

keyed_vectors.call_method("load_word2vec_format", ("model.bin",), None)?;


let embedding = keyed_vectors.call_method("get_vector", ("hello",), None)?;

println!("Embedding: {:?}", embedding);


Ok(()) }) }

Добавьте pyo3к Cargo.tomlдля прямого вызова функций Python.

[dependencies]

pyo3 = { version = "0.16.4", features = ["extension-module"] }

5. Обучение внедрению с помощью моделей Rust и ONNX

Пример с ONNX Runtime :

use ort::{environment::Environment, tensor::OrtOwnedTensor, session::Session};

fn main() -> Result<(), Box<dyn std::error::Error>> {


let environment = Environment::builder().build()?;


let session =

environment.new_session_builder()?.with_model_from_file("model.onnx")?;


let input = vec![1.0, 2.0, 3.0];

let outputs: Vec<OrtOwnedTensor<f32>> = session.run(vec![input])?;


println!("Embedding: {:?}", outputs[0]);


Ok(()) }

Добавьте ort для Cargo.tomlзапуска моделей в формате ONNX.

[dependencies]

ort = "0.8.1"

6. Использование моделей TensorFlow или PyTorch с Tch-rs

Пример с Tch-rs :

use tch::{Tensor, nn, nn::Module}; fn load_model() -> nn::Sequential {


let vs = nn::VarStore::new(tch::Device::Cpu);

nn::seq()

.add(nn::linear(&vs.root(), 100, 50, Default::default()))

.add_fn(|x| x.relu()) } fn generate_embedding(model: &nn::Sequential,

input: Tensor) -> Tensor { model.forward(&input) } fn main() {


let model = load_model();


let input = Tensor::of_slice(&[0.5, 1.0, -0.5]);

let embedding = generate_embedding(&model, input);


println!("Embedding: {:?}", embedding); }

Добавьте tch в Cargo.toml:

[dependencies]

tch = { version = "0.6.1", features = ["libtorch-sys"] }