#[cfg(feature = "dep-parsing")]
pub use arc_eager::{ConlluToken as PipelineToken, ParseResult};
#[cfg(feature = "dep-parsing")]
pub struct PipelineParser {
tagger: crftag::POSTagger,
lemmatizer: crate::lemmatizer::Lemmatizer,
parser: arc_eager::DependencyParser,
}
#[cfg(feature = "dep-parsing")]
impl PipelineParser {
pub fn new(tagger: crftag::POSTagger, lemmatizer: crate::lemmatizer::Lemmatizer) -> Self {
Self { tagger, lemmatizer, parser: arc_eager::DependencyParser::new() }
}
pub fn load_model(&mut self, path: impl AsRef<std::path::Path>) -> arc_eager::Result<()> {
self.parser.load_model(path)
}
pub fn is_loaded(&self) -> bool {
self.parser.is_loaded()
}
pub fn parse(&self, words: &[&str]) -> Result<ParseResult, Box<dyn std::error::Error>> {
let tagged = self.tagger.tag(words)?;
let tokens = self.build_conllu(&tagged);
Ok(self.parser.parse(&tokens)?)
}
pub fn parse_sents(
&self,
sentences: &[Vec<&str>],
) -> Result<Vec<ParseResult>, Box<dyn std::error::Error>> {
sentences.iter().map(|s| self.parse(s)).collect()
}
fn build_conllu(&self, tagged: &[(&str, String)]) -> Vec<arc_eager::ConlluToken> {
tagged
.iter()
.enumerate()
.map(|(i, (word, pos))| {
let lemma = self.lemmatizer.lemmatize(word, pos);
arc_eager::ConlluToken {
id: i + 1,
form: word.to_string(),
lemma,
upos: pos.clone(),
xpos: pos.clone(),
feats: "_".to_string(),
head: 0,
deprel: "_".to_string(),
}
})
.collect()
}
}