kanpyo 0.2.0

Japanese Morphological Analyzer
Documentation
use crate::{
    lattice::{self, node::Node},
    token::{Token, TokenClass},
};
use kanpyo_dict::dict::Dict;

pub struct Tokenizer {
    pub dict: Dict,
}

impl Tokenizer {
    pub fn new(dict: Dict) -> Self {
        Self { dict }
    }

    pub fn tokenize(&self, input: &str) -> Vec<Token> {
        let lattice = lattice::Lattice::build(&self.dict, input);

        lattice
            .viterbi()
            .into_iter()
            .map(|node| {
                let token_class = match &node {
                    Node::Dummy { .. } => TokenClass::Dummy,
                    Node::Known(_) => TokenClass::Known,
                    Node::Unknown(_) => TokenClass::Unknown,
                };
                let surface = match &node {
                    Node::Dummy { .. } => "EOS".to_string(),
                    Node::Known(n) | Node::Unknown(n) => n.surface.clone(),
                };

                let char_pos = node.char_pos();
                let end_pos = char_pos + surface.chars().count();
                Token {
                    id: node.id(),
                    class: token_class,
                    position: node.byte_pos(),
                    start: char_pos,
                    end: end_pos,
                    surface,
                }
            })
            .collect()
    }
}