#nlp #text #xml-parser #russian #binary-encoding #binary-format #corpus

kathoey

Rust library for text feminization using open corpus linguistics data

13 stable releases

1.1.5 May 23, 2023
1.1.4 Oct 28, 2022
1.1.2 Jun 28, 2022
1.0.10 Oct 22, 2021
1.0.2 Jan 11, 2021

#304 in Text processing

LGPL-3.0-only

18KB
389 lines

Kathoey

Rust library for text feminization

Rust crates.io version

  • currently using Russian from http://opencorpora.org
  • using xmlparser for perfomance
  • exporting parsed Kathoey to binary format
  • use load (from bincode) for speed up!
  • two modes (extreme and regular)

Usage

Serialization from xml and export to binary serialized format (tho, export is optional, export from xml is fast enough)

fn from_xml() -> eyre::Result<()> {
  match Kathoey::from_xml("dict.opcorpora.xml") {
    Ok(k) => {
      if let Err(exerr) = k.save("dict.bin") {
        return
          Err(eyre!("Failed to export {:?}", exerr));
      }
    }
    Err(kerr) => {
      return
        Err(eyre!("Failed to create {:?}", kerr));
    }
  }
  Ok(())
}

Few test and import from binary:

fn from_binary() -> eyre::Result<()> {
  match Kathoey::load("dict.bin") {
    Ok(k) => {
      assert_eq!("Я сделала это!", k.feminize("Я сделал это!"));
      assert_eq!("Я потеряла ключи", k.feminize("Я потерял ключи"));
      assert_eq!("Хорошо, я ответила.", k.feminize("Хорошо, я ответил."));
      assert_eq!("Я не хотела этого говорить на случай, если ты увидишь",
        k.feminize("Я не хотел этого говорить на случай, если ты увидишь"));
      assert_eq!("Я уверена, что у него была идея получше, он просто забыл",
        k.feminize("Я уверен, что у него была идея получше, он просто забыл"));
      assert_eq!("Вообще-то, я была немного удивлена.",
        k.feminize("Вообще-то, я был немного удивлен."));
      assert_eq!("Мне нравилось, когда я в аниме и не беспокойся о спойлерах.",
        k.feminize("Мне нравилось, когда я в аниме и не беспокойся о спойлерах."));
      assert_eq!("Я скажу ему это.",
        k.feminize("Я скажу ему это."));
      assert_eq!("Начала наруто смотреть",
        k.feminize("Начал наруто смотреть"));
    }
    Err(kerr) => {
      return
        Err(eyre!("Failed to import rs {:?}", kerr));
    }
  }
  Ok(())
}

Dependencies

~455KB