diff --git a/src/normalize.rs b/src/normalize.rs index 4b0fd9d..ab13d8e 100644 --- a/src/normalize.rs +++ b/src/normalize.rs @@ -1 +1,23 @@ -// implemented in a later task +/// (pattern, replacement) — applied as whole-token, case-insensitive. +const ABBREV: &[(&str, &str)] = &[ + ("v.a.", "verdacht auf"), + ("z.n.", "zustand nach"), + ("art.", "arterielle"), + ("op", "operation"), + ("dd", "differentialdiagnose"), + ("re.", "rechts"), + ("li.", "links"), +]; + +pub fn normalize(input: &str) -> String { + let lower = input.to_lowercase(); + let mut out: Vec = Vec::new(); + for tok in lower.split_whitespace() { + let replaced = ABBREV.iter() + .find(|(p, _)| *p == tok) + .map(|(_, r)| r.to_string()) + .unwrap_or_else(|| tok.to_string()); + out.push(replaced); + } + out.join(" ") +} diff --git a/tests/normalize_tests.rs b/tests/normalize_tests.rs new file mode 100644 index 0000000..a4f658f --- /dev/null +++ b/tests/normalize_tests.rs @@ -0,0 +1,17 @@ +use alpha_id::normalize::normalize; + +#[test] +fn lowercases_and_collapses_whitespace() { + assert_eq!(normalize(" Diabetes Mellitus\tTyp 2 "), "diabetes mellitus typ 2"); +} + +#[test] +fn expands_common_medical_abbreviations() { + assert_eq!(normalize("V.a. art. Hypertonie"), "verdacht auf arterielle hypertonie"); + assert_eq!(normalize("Z.n. OP"), "zustand nach operation"); +} + +#[test] +fn keeps_german_umlauts() { + assert_eq!(normalize("Ödem"), "ödem"); +}