use prosaic_core::Gender;
pub fn infer_gender(word: &str) -> Gender {
let lower = word.to_lowercase();
if let Some(g) = exception_lookup(lower.as_str()) {
return g;
}
if lower.ends_with("ung")
|| lower.ends_with("heit")
|| lower.ends_with("keit")
|| lower.ends_with("schaft")
|| lower.ends_with("ion")
|| lower.ends_with("ei")
{
return Gender::Fem;
}
if lower.ends_with('e') && !lower.ends_with("chen") && !lower.ends_with("lein") {
return Gender::Fem;
}
if lower.ends_with("chen")
|| lower.ends_with("lein")
|| lower.ends_with("um")
|| lower.ends_with("ment")
{
return Gender::Neut;
}
if lower.ends_with("er")
|| lower.ends_with("ling")
|| lower.ends_with("ismus")
|| lower.ends_with("ant")
|| lower.ends_with("ist")
{
return Gender::Masc;
}
Gender::Masc
}
fn exception_lookup(lower: &str) -> Option<Gender> {
match lower {
"mädchen" | "fräulein" | "kind" | "haus" | "buch" | "auto" | "wort" | "bett" | "geld"
| "jahr" | "land" | "licht" | "meer" | "tier" => Some(Gender::Neut),
"tisch" | "stuhl" | "mann" | "tag" | "monat" | "herbst" | "brief" | "baum" | "berg"
| "hund" | "zug" => Some(Gender::Masc),
"frau" | "nacht" | "stadt" | "hand" | "welt" | "zeit" => Some(Gender::Fem),
_ => None,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn feminine_ung_suffix() {
assert_eq!(infer_gender("Meinung"), Gender::Fem);
assert_eq!(infer_gender("Ordnung"), Gender::Fem);
assert_eq!(infer_gender("Zeitung"), Gender::Fem);
}
#[test]
fn feminine_heit_suffix() {
assert_eq!(infer_gender("Freiheit"), Gender::Fem);
assert_eq!(infer_gender("Gesundheit"), Gender::Fem);
}
#[test]
fn feminine_ion_suffix() {
assert_eq!(infer_gender("Nation"), Gender::Fem);
assert_eq!(infer_gender("Produktion"), Gender::Fem);
}
#[test]
fn neuter_chen_suffix() {
assert_eq!(infer_gender("Mädchen"), Gender::Neut);
assert_eq!(infer_gender("Hündchen"), Gender::Neut);
}
#[test]
fn neuter_um_suffix() {
assert_eq!(infer_gender("Ministerium"), Gender::Neut);
assert_eq!(infer_gender("Zentrum"), Gender::Neut);
}
#[test]
fn neuter_exception_buch() {
assert_eq!(infer_gender("Buch"), Gender::Neut);
}
#[test]
fn masculine_exception_tisch() {
assert_eq!(infer_gender("Tisch"), Gender::Masc);
}
#[test]
fn masculine_er_suffix() {
assert_eq!(infer_gender("Lehrer"), Gender::Masc);
assert_eq!(infer_gender("Arbeiter"), Gender::Masc);
}
#[test]
fn masculine_default_no_recognizable_suffix() {
assert_eq!(infer_gender("Schrank"), Gender::Masc);
}
#[test]
fn mädchen_is_neut_despite_e_ending() {
assert_eq!(infer_gender("Mädchen"), Gender::Neut);
}
#[test]
fn frau_is_fem_despite_no_e_ending() {
assert_eq!(infer_gender("Frau"), Gender::Fem);
}
}