Для чего нужна данная статья? :
- Создать представления текста, генерировать и обрабатывать их несколькими способами с использованием базовых библиотек.
Зачем Вам это уметь? :
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"] }