#[cfg(not(target_arch = "wasm32"))]
use std::path::Path;
use crate::{GlinerError, Result};
pub struct PretokenizedEncoding {
pub ids: Vec<i64>,
pub word_ids: Vec<Option<u32>>,
}
pub trait PretokenizingTokenizer {
fn encode_pretokenized(&self, words: Vec<&str>) -> Result<PretokenizedEncoding>;
}
pub struct V2Tokenizer {
inner: tokenizers::Tokenizer,
}
impl V2Tokenizer {
#[cfg(not(target_arch = "wasm32"))]
pub fn from_file<P: AsRef<Path>>(path: P) -> Result<Self> {
let inner = tokenizers::Tokenizer::from_file(path)
.map_err(|error| GlinerError::Tokenizer(format!("failed to load tokenizer from file: {error}")))?;
Ok(Self { inner })
}
#[cfg(feature = "candle")]
pub fn from_bytes(bytes: &[u8]) -> Result<Self> {
let inner = tokenizers::Tokenizer::from_bytes(bytes)
.map_err(|error| GlinerError::Tokenizer(format!("failed to load tokenizer from bytes: {error}")))?;
Ok(Self { inner })
}
}
impl PretokenizingTokenizer for V2Tokenizer {
fn encode_pretokenized(&self, words: Vec<&str>) -> Result<PretokenizedEncoding> {
let encoding = self
.inner
.encode(words, false)
.map_err(|error| GlinerError::Tokenizer(format!("failed to encode pre-tokenized input: {error}")))?;
Ok(PretokenizedEncoding {
ids: encoding.get_ids().iter().map(|&id| i64::from(id)).collect(),
word_ids: encoding.get_word_ids().to_vec(),
})
}
}