use crate::{Lemmatizer, Normalizer, SentenceTokenizer, Stemmer, WordTokenizer};
pub struct Rustam {
normalizer: Normalizer,
sent_tokenizer: SentenceTokenizer,
word_tokenizer: WordTokenizer,
stemmer: Stemmer,
lemmatizer: Lemmatizer,
}
impl Rustam {
pub fn new() -> Self {
Self {
normalizer: Normalizer::new(),
sent_tokenizer: SentenceTokenizer::new(),
word_tokenizer: WordTokenizer::new(),
stemmer: Stemmer::new(),
lemmatizer: Lemmatizer::new(),
}
}
pub fn normalize(&self, text: &str) -> String {
self.normalizer.normalize(text)
}
pub fn sentences(&self, text: &str) -> Vec<String> {
self.sent_tokenizer.tokenize(text)
}
pub fn words(&self, text: &str) -> Vec<String> {
self.word_tokenizer.tokenize(text)
}
pub fn word_tokenize_normalized(&self, text: &str) -> Vec<String> {
self.words(&self.normalize(text))
}
pub fn tokenize_sents(&self, text: &str) -> Vec<Vec<String>> {
self.sentences(&self.normalize(text))
.into_iter()
.map(|s| self.words(&s))
.collect()
}
pub fn stem(&self, word: &str) -> String {
self.stemmer.stem(word)
}
pub fn lemmatize(&self, word: &str, pos: &str) -> String {
self.lemmatizer.lemmatize(word, pos)
}
pub fn normalizer(&self) -> &Normalizer { &self.normalizer }
pub fn sent_tokenizer(&self) -> &SentenceTokenizer { &self.sent_tokenizer }
pub fn word_tokenizer(&self) -> &WordTokenizer { &self.word_tokenizer }
pub fn stemmer(&self) -> &Stemmer { &self.stemmer }
pub fn lemmatizer(&self) -> &Lemmatizer { &self.lemmatizer }
}
impl Default for Rustam {
fn default() -> Self { Self::new() }
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn pipeline_normalize_words() {
let nlp = Rustam::new();
let words = nlp.word_tokenize_normalized("کتابها را میخوانم");
assert!(!words.is_empty());
}
#[test]
fn pipeline_sentences() {
let nlp = Rustam::new();
let sents = nlp.sentences("جمله اول. جمله دوم.");
assert!(sents.len() >= 1);
}
#[test]
fn pipeline_stem_lemma() {
let nlp = Rustam::new();
assert_eq!(nlp.stem("کتابها"), "کتاب");
let _ = nlp.lemmatize("میروم", "V");
}
#[test]
fn pipeline_tokenize_sents() {
let nlp = Rustam::new();
let result = nlp.tokenize_sents("اول. دوم.");
assert!(!result.is_empty());
}
}