From 2eaf2039974427e9592236067fc178ff8662619a Mon Sep 17 00:00:00 2001 From: Jim O'Regan Date: Fri, 7 Aug 2026 14:39:30 +0100 Subject: [PATCH 1/9] Plus / minus Signed-off-by: Jim O'Regan --- .../text_normalization/sv/data/math_operations.tsv | 4 +++- .../text_normalization/sv/taggers/measure.py | 9 ++++++--- .../sv/data_text_normalization/test_cases_measure.txt | 2 ++ 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/nemo_text_processing/text_normalization/sv/data/math_operations.tsv b/nemo_text_processing/text_normalization/sv/data/math_operations.tsv index ce51d4154..20c4c3bc9 100644 --- a/nemo_text_processing/text_normalization/sv/data/math_operations.tsv +++ b/nemo_text_processing/text_normalization/sv/data/math_operations.tsv @@ -1,8 +1,10 @@ + plus ++/- plus minus +± plus minus - minus / delad ÷ delad : delad × gånger * gånger -· gånger \ No newline at end of file +· gånger diff --git a/nemo_text_processing/text_normalization/sv/taggers/measure.py b/nemo_text_processing/text_normalization/sv/taggers/measure.py index 4da3f81c2..04a04927c 100644 --- a/nemo_text_processing/text_normalization/sv/taggers/measure.py +++ b/nemo_text_processing/text_normalization/sv/taggers/measure.py @@ -215,13 +215,14 @@ def __init__(self, cardinal: GraphFst, decimal: GraphFst, fraction: GraphFst, de math_operations = pynini.string_file(get_abs_path("data/math_operations.tsv")) delimiter = pynini.accep(" ") | pynutil.insert(" ") + math_operand = cardinal_graph_ett | SV_ALPHA | greek equals = pynini.cross("=", "är") if not deterministic: equals |= pynini.cross("=", "är lika med") math = ( - (cardinal_graph_ett | SV_ALPHA | greek) + math_operand + delimiter + math_operations + (delimiter | SV_ALPHA) @@ -229,11 +230,11 @@ def __init__(self, cardinal: GraphFst, decimal: GraphFst, fraction: GraphFst, de + delimiter + equals + delimiter - + (cardinal_graph_ett | SV_ALPHA | greek) + + math_operand ) math |= ( - (cardinal_graph_ett | SV_ALPHA | greek) + math_operand + delimiter + equals + delimiter @@ -244,6 +245,8 @@ def __init__(self, cardinal: GraphFst, decimal: GraphFst, fraction: GraphFst, de + cardinal_graph_ett ) + math |= math_operand + delimiter + math_operations + delimiter + math_operand + math = ( pynutil.insert("units: \"math\" cardinal { integer: \"") + math diff --git a/tests/nemo_text_processing/sv/data_text_normalization/test_cases_measure.txt b/tests/nemo_text_processing/sv/data_text_normalization/test_cases_measure.txt index 2fa5a70bb..2737d8e66 100644 --- a/tests/nemo_text_processing/sv/data_text_normalization/test_cases_measure.txt +++ b/tests/nemo_text_processing/sv/data_text_normalization/test_cases_measure.txt @@ -5,3 +5,5 @@ 3mm~tre millimeter 1+5=6~ett plus fem är sex α+1=3~alfa plus ett är tre +1 +/- 0~ett plus minus noll +1 ± 0~ett plus minus noll From dce05a16476ff2b1f838a7d778dbd6a5b373e769 Mon Sep 17 00:00:00 2001 From: Jim O'Regan Date: Fri, 7 Aug 2026 15:48:29 +0100 Subject: [PATCH 2/9] Add Swedish legal reference readings Signed-off-by: Jim O'Regan --- .../sv/data/reference/__init__.py | 13 +++++++++++++ .../sv/data/reference/cardinal.tsv | 6 ++++++ .../sv/data/reference/ordinal.tsv | 7 +++++++ .../text_normalization/sv/taggers/cardinal.py | 10 +++++++++- .../text_normalization/sv/taggers/ordinal.py | 14 ++++++++++---- .../test_cases_cardinal.txt | 9 +++++++++ .../test_cases_normalize_with_audio.txt | 10 ++++++++++ .../data_text_normalization/test_cases_ordinal.txt | 1 - 8 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 nemo_text_processing/text_normalization/sv/data/reference/__init__.py create mode 100644 nemo_text_processing/text_normalization/sv/data/reference/cardinal.tsv create mode 100644 nemo_text_processing/text_normalization/sv/data/reference/ordinal.tsv diff --git a/nemo_text_processing/text_normalization/sv/data/reference/__init__.py b/nemo_text_processing/text_normalization/sv/data/reference/__init__.py new file mode 100644 index 000000000..6ebc808fa --- /dev/null +++ b/nemo_text_processing/text_normalization/sv/data/reference/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/nemo_text_processing/text_normalization/sv/data/reference/cardinal.tsv b/nemo_text_processing/text_normalization/sv/data/reference/cardinal.tsv new file mode 100644 index 000000000..fc26c067c --- /dev/null +++ b/nemo_text_processing/text_normalization/sv/data/reference/cardinal.tsv @@ -0,0 +1,6 @@ +§ paragraf +art artikel +kap kapitel +mom moment +s sida +st stycke diff --git a/nemo_text_processing/text_normalization/sv/data/reference/ordinal.tsv b/nemo_text_processing/text_normalization/sv/data/reference/ordinal.tsv new file mode 100644 index 000000000..bcb50c230 --- /dev/null +++ b/nemo_text_processing/text_normalization/sv/data/reference/ordinal.tsv @@ -0,0 +1,7 @@ +§ paragrafen +§ paragraf +art artikeln +kap kapitlet +mom momentet +s sidan +st stycket diff --git a/nemo_text_processing/text_normalization/sv/taggers/cardinal.py b/nemo_text_processing/text_normalization/sv/taggers/cardinal.py index 750ff867b..a1b470d4e 100644 --- a/nemo_text_processing/text_normalization/sv/taggers/cardinal.py +++ b/nemo_text_processing/text_normalization/sv/taggers/cardinal.py @@ -25,7 +25,7 @@ insert_space, ) from nemo_text_processing.text_normalization.sv.graph_utils import SV_ALPHA -from nemo_text_processing.text_normalization.sv.utils import get_abs_path +from nemo_text_processing.text_normalization.sv.utils import get_abs_path, load_labels def make_million(number: str, non_zero_no_one: 'pynini.FstLike', deterministic: bool = True) -> 'pynini.FstLike': @@ -360,6 +360,14 @@ def __init__(self, deterministic: bool = True): optional_minus_graph = pynini.closure(pynutil.insert("negative: ") + pynini.cross("-", "\"true\" "), 0, 1) final_graph = optional_minus_graph + pynutil.insert("integer: \"") + self.graph + pynutil.insert("\"") + reference_graph = pynini.Fst() + for written, spoken in load_labels(get_abs_path("data/reference/cardinal.tsv")): + optional_dot = pynini.closure(pynutil.delete("."), 0, 1) if written.isalpha() else pynini.accep("") + unit = pynutil.delete(written) + optional_dot + unit_first = pynutil.insert(f"{spoken} ") + unit + delete_space + self.graph + number_first = pynutil.insert(f"{spoken} ") + self.graph + delete_space + unit + reference_graph |= unit_first | number_first + final_graph |= pynutil.insert("integer: \"") + reference_graph + pynutil.insert("\"") if not deterministic: final_graph |= pynutil.add_weight( optional_minus_graph + pynutil.insert("integer: \"") + self.graph_en + pynutil.insert("\""), -0.001 diff --git a/nemo_text_processing/text_normalization/sv/taggers/ordinal.py b/nemo_text_processing/text_normalization/sv/taggers/ordinal.py index 0877ca08f..e5b4f2ae8 100644 --- a/nemo_text_processing/text_normalization/sv/taggers/ordinal.py +++ b/nemo_text_processing/text_normalization/sv/taggers/ordinal.py @@ -26,7 +26,7 @@ insert_space, ) from nemo_text_processing.text_normalization.sv.taggers.cardinal import filter_punctuation, make_million -from nemo_text_processing.text_normalization.sv.utils import get_abs_path +from nemo_text_processing.text_normalization.sv.utils import get_abs_path, load_labels class OrdinalFst(GraphFst): @@ -200,12 +200,18 @@ def __init__(self, cardinal: GraphFst, deterministic: bool = True): self.suffixed_to_words = self.suffixed_ordinal @ self.graph self.bare_ordinals = cleaned_graph - kapitlet_word = pynini.union("kapitlet", pynini.cross("kap", "kapitlet")) - kapitlet = cleaned_graph + NEMO_SPACE + kapitlet_word + reference_graph = pynini.Fst() + if not deterministic: + for written, spoken in load_labels(get_abs_path("data/reference/ordinal.tsv")): + optional_dot = ( + pynini.closure(pynutil.delete("."), 0, 1) if written.isalpha() else pynini.accep("") + ) + unit = pynutil.delete(written) + optional_dot + reference_graph |= cleaned_graph + delete_space + unit + pynutil.insert(f" {spoken}") tok_graph = ( pynutil.insert("integer: \"") - + (cleaned_graph + pynutil.delete(".") | self.suffixed_to_words | kapitlet) + + (cleaned_graph + pynutil.delete(".") | self.suffixed_to_words | reference_graph) + pynutil.insert("\"") ) diff --git a/tests/nemo_text_processing/sv/data_text_normalization/test_cases_cardinal.txt b/tests/nemo_text_processing/sv/data_text_normalization/test_cases_cardinal.txt index 7b0f75a54..2fcd04af9 100644 --- a/tests/nemo_text_processing/sv/data_text_normalization/test_cases_cardinal.txt +++ b/tests/nemo_text_processing/sv/data_text_normalization/test_cases_cardinal.txt @@ -18,6 +18,15 @@ 201~tvåhundraett 111~hundraelva 110~hundratio +§ 3~paragraf tre +3 §~paragraf tre +kap. 9~kapitel nio +9 kap~kapitel nio +st. 2~stycke två +2 st.~stycke två +s. 4~sida fyra +art. 7~artikel sju +3 mom.~moment tre 1000~tusen 540~femhundrafyrtio 850~åttahundrafemtio diff --git a/tests/nemo_text_processing/sv/data_text_normalization/test_cases_normalize_with_audio.txt b/tests/nemo_text_processing/sv/data_text_normalization/test_cases_normalize_with_audio.txt index dd9874bae..478ed39c2 100644 --- a/tests/nemo_text_processing/sv/data_text_normalization/test_cases_normalize_with_audio.txt +++ b/tests/nemo_text_processing/sv/data_text_normalization/test_cases_normalize_with_audio.txt @@ -12,3 +12,13 @@ två ett tredje december tjugotjugotvå tredje december tjugohundratjugotvå tredje december tvåtusen tjugotvå +~3 § +paragraf tre +tredje paragraf +tredje paragrafen +~9 kap. +kapitel nio +nionde kapitlet +~2 st. +stycke två +andra stycket diff --git a/tests/nemo_text_processing/sv/data_text_normalization/test_cases_ordinal.txt b/tests/nemo_text_processing/sv/data_text_normalization/test_cases_ordinal.txt index fee817946..f11bdeb5f 100644 --- a/tests/nemo_text_processing/sv/data_text_normalization/test_cases_ordinal.txt +++ b/tests/nemo_text_processing/sv/data_text_normalization/test_cases_ordinal.txt @@ -4,4 +4,3 @@ 2.~andra 20.~tjugonde 23.~tjugotredje -9 kap~nionde kapitlet From 66ccc05bf5f638b8f1044aa1dc4bbae3fc213be2 Mon Sep 17 00:00:00 2001 From: Jim O'Regan Date: Fri, 7 Aug 2026 16:57:09 +0100 Subject: [PATCH 3/9] Expand abbreviations from Sardin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jim O'Regan Signed-off-by: "Christina Tånnander" --- .../sv/data/abbreviations/__init__.py | 0 .../data/abbreviations/case_insensitive.tsv | 220 +++++++++++ .../case_insensitive_alternatives.tsv | 22 ++ .../case_insensitive_opt_dot.tsv | 344 ++++++++++++++++++ .../sv/data/abbreviations/case_sensitive.tsv | 181 +++++++++ .../case_sensitive_alternatives.tsv | 2 + .../abbreviations/case_sensitive_opt_dot.tsv | 45 +++ .../nondeterministic.tsv} | 0 .../text_normalization/sv/data/whitelist.tsv | 2 + .../sv/taggers/whitelist.py | 41 ++- .../test_cases_whitelist.txt | 14 + 11 files changed, 868 insertions(+), 3 deletions(-) create mode 100644 nemo_text_processing/text_normalization/sv/data/abbreviations/__init__.py create mode 100644 nemo_text_processing/text_normalization/sv/data/abbreviations/case_insensitive.tsv create mode 100644 nemo_text_processing/text_normalization/sv/data/abbreviations/case_insensitive_alternatives.tsv create mode 100644 nemo_text_processing/text_normalization/sv/data/abbreviations/case_insensitive_opt_dot.tsv create mode 100644 nemo_text_processing/text_normalization/sv/data/abbreviations/case_sensitive.tsv create mode 100644 nemo_text_processing/text_normalization/sv/data/abbreviations/case_sensitive_alternatives.tsv create mode 100644 nemo_text_processing/text_normalization/sv/data/abbreviations/case_sensitive_opt_dot.tsv rename nemo_text_processing/text_normalization/sv/data/{abbreviations_nondet.tsv => abbreviations/nondeterministic.tsv} (100%) diff --git a/nemo_text_processing/text_normalization/sv/data/abbreviations/__init__.py b/nemo_text_processing/text_normalization/sv/data/abbreviations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/nemo_text_processing/text_normalization/sv/data/abbreviations/case_insensitive.tsv b/nemo_text_processing/text_normalization/sv/data/abbreviations/case_insensitive.tsv new file mode 100644 index 000000000..60e4d9571 --- /dev/null +++ b/nemo_text_processing/text_normalization/sv/data/abbreviations/case_insensitive.tsv @@ -0,0 +1,220 @@ +AlkhL Alkohollagen +AnstF anställningsförordningen +AnstF:s anställningsförordningens +ArkivF Arkivförordningen +AvbetköpL Avbetalningsköplagen +BokfL Bokföringslagen +Co. kompani +CoQ10 koenzym Q 10 +DelgL:s delgivningslagens +DepCh departementschef +DiskrL diskrimineringslagen +FiskeL fiskelagen +FullmL Lagen om fullmaktsanställning +FörfSamlF författningssamlingsförordningen +GWh gigawattimmar +HSjvL Hälso och sjukvårdslagen +HyresfL lagen om förvärv av hyresfastighet +HyresftL lagen om förvärv av hyresfastighet +Hz hertz +HögskF Högskoleförordningen +HögskL Högskolelagen +Ibid. Ibidem +JustR justitieråd +K. Instr kunglig instruktion +KKöpL Konsumentköplagen +KTjL konsumenttjänstlagen +KamR Kammarrätten +KamR:s Kammarrättens +Kebbe-förl Kebbe-förlaget +Km² kvadratkilometer +KomL Kommunallagen +KomL:s Kommunallagens +KonkurrensL konkurrenslagen +KulturmL Lagen om kulturminnen +KulturmL:s Lagen om kulturminnens +Kungl Maj:t kungliga majestät +Kungl Maj:ts kungliga majestäts +Kungl. Maj:t kungliga majestät +Kungl. Maj:ts kungliga majestäts +KökrkL Körkortslagen +KökrkL:s Körkortslagens +KörkF Körkortsförordningen +LKAvg Lagen om rätt för kommun att ta ut avgift +LSTInstr Förordning med länsstyrelseinstruktion +LivsmL Livsmedelslagen +LivsmL:s Livsmedelslagens +LösdrL lösdriverilagen +MHz megahertz +MJ megajoule +MW megawatt +MWel megawatt el +MedbL Lagen om svenskt medborgarskap +MedbL:s Lagen om svenskt medborgarskaps +Mme madame +MyndF Myndighetsförordningen +NamnL Namnlagen +PartnerL partnerlagen +PolisF polisförordningen +PreskL preskriptionslagen +PreskrL preskriptionslagen +RättsprL Rättsprövningslagen +SBetL Skattebetalningslagen +SkolL Skollagen +TWhel terawattimmar el +TWhkyla terawattimmar kyla +TWhvärme terawattimmar värme +TullL tullagen +US$ US-dollar +VitesL Viteslagen +VägL Väglagen +VägmF Vägmärkesförordningen +a st. anfört ställe +adr. adress +adv. adverb +agr. agronomie +al.fälgar aluminiumfälgar +alufälg aluminiumfälgar +arbetsmarkn.pol arbetsmarknadspolitisk +art nr artikelnummer +avg. avgift +begr.byrå begravningsbyrå +beh. behandling +behandl. behandling +behanl behandling +best nr beställningsnummer +cal. kalori +chefsexp chefsexpedition +chefsexp. chefsexpedition +cl/l centiliter per liter +cm2 kvadratcentimeter +cm3 kubikcentimeter +cm² kvadratcentimeter +cm³ kubikcentimeter +d:o dito +dens. densamma +dep chef departementschef +dep sek departementssekreterare +dep. chef departementschef +dep. chefen departementschefen +dep. sekreterare departementssekreterare +dep.chef departementschef +dep.chefen departementschefen +dep.sekreterare departementssekreterare +dm2 kvadratdecimeter +dm3 kubikdecimeter +dm² kvadratdecimeter +dm³ kubikdecimeter +doc. docent +dw dödvikt +e.t.c. etcetera +ekon. ekonomie +el dyl. eller dylikt +el. eller +eng. engelska +epist. epistel +ex. exempel +fig. figur +fjv fjärrvärme +fr a. framför allt +fr. från +fre-sön fredag till söndag +fred-sönd fredag till söndag +frfattare författare +följ. följande +förf.s författarens +förf:a författarna +förf:na författarna +förf:nas författarnas +förf:s författarens +hovr. hovrätt +i sht. i synnerhet +inv/km2 invånare per kvadratkilometer +isht i synnerhet +jmftal jämförelsetal +jr junior +jur. juris +jur.utr. juris utriusque +k:a kyrka +kHz kilohertz +kJ kilojoule +kV kilovolt +kW kilowatt +kWh kilowattimme +kand. kandidat +kbit kilobit +kbps kilobits per sekund +kcal/dag kilokalorier per dag +kcal/gram kilokalorier per gram +kj/kg kilojoule per kilo +kl. klockan +km/h kilometer i timmen +km/s kilometer per sekund +km2 kvadratkilometer +km:s kilometers +kostn. kostnad +kr/kg kronor per kilo +kr/m2 kronor per kvadratmeter +kr/månad kronor per månad +kr/styck kronor styck +kr/år kronor per år +kton kiloton +leg. legitimerad +lic. licentiat +lig. ligament +lx lux +m2 kvadratmeter +m3 kubikmeter +mag. magister +maj:t majestät +maj:ts majestäts +mbar millibar +mbps megabits per sekund +mbyte megabyte +mdkr miljarder kronor +mg/kg milligram per kilo +min övers. min översättning +ml/l milliliter per liter +mm vp millimeter vattenpelare +mm2 kvadratmillimeter +mm3 kubikmillimeter +mmHg millimeter kvicksilver +mmol millimol +mmol/l millimol per liter +mm² kvadratmillimeter +mm³ kubikmillimeter +mnkr miljoner kronor +mom. moment +m² kvadratmeter +m³ kubikmeter +ng/kg nanogram per kilo +nmol nanomol +nr/år nummer per år +omm om och endast om +op. opus +ord pris ordinarie pris +ord. pris ordinarie pris +ord.pris ordinarie pris +pat.avg. patientavgift +pers. person +pmol pikomol +rec. recension +reg. register +rev. reviderad +s:a summa +sign. signatur +spec. speciell +startförp. startförpackning +startförpackn startförpackning +stud. studerande +t e x till exempel +tab. tabell +tekn. teknologie +tel. telefon +tel: telefon +temp. temperatur +teol. teologie +tkr/månad tusen kronor per månad +tkronor tusen kronor +vs. versus +överkl.nämnd överklagarnämnd diff --git a/nemo_text_processing/text_normalization/sv/data/abbreviations/case_insensitive_alternatives.tsv b/nemo_text_processing/text_normalization/sv/data/abbreviations/case_insensitive_alternatives.tsv new file mode 100644 index 000000000..7a879406f --- /dev/null +++ b/nemo_text_processing/text_normalization/sv/data/abbreviations/case_insensitive_alternatives.tsv @@ -0,0 +1,22 @@ +Ibid. på samma sida +adj. adjektiv +bearb. bearbetade +ev. eventuell +ex. exemplar +fr. fru +fr. fröken +kl. klass +omarb. omarbetade +omm ekvivalent +red. redaktörer +red. redigerad +red. revision +rev. revision +sign. signum +suppl. supplement +tekn. tekniska +tkr. tusental kronor +tkronor tusental kronor +trol. trolovad +utg. utgivare +övers. översättare diff --git a/nemo_text_processing/text_normalization/sv/data/abbreviations/case_insensitive_opt_dot.tsv b/nemo_text_processing/text_normalization/sv/data/abbreviations/case_insensitive_opt_dot.tsv new file mode 100644 index 000000000..4a8e89799 --- /dev/null +++ b/nemo_text_processing/text_normalization/sv/data/abbreviations/case_insensitive_opt_dot.tsv @@ -0,0 +1,344 @@ +Drottningg Drottninggatan +Engl England +Frankf Frankfurt +Friedr Friderich +Hantverkarg Hantverkargatan +Hornsg Hornsgatan +LL-förl LL-förlaget +Läkartidn Läkartidningen +Pirat-förl piratförlaget +Sveav Sveavägen +Söderk Söderköping +TPB-nr TPB-nummer +Tunnbindareg Tunnbindaregatan +a. st anfört ställe +a.st anfört ställe +adj adjunkt +ak. avh akademisk avhandling +akad. avh akademisk avhandling +allm allmän +ankomstnr ankomstnummer +anläggn anläggning +anm anmärkning +anmärkn anmärkning +anskaffn anskaffning +anst anställning +anstnr anställningsnummer +arb arbete +art. nr artikelnummer +art.nr artikelnummer +artikelnr artikelnummer +artnr artikelnummer +avd avdelning +avh avhandling +bakgr bakgrund +bearb bearbetad +begravn begravning +best. nr beställningsnummer +best.nr beställningsnummer +bestnr beställningsnummer +beställn beställning +betaln betalning +betr beträffande +bg bankgiro +bitr biträdande +bl a bland annat +bl. a bland annat +bl.a bland annat +bokförl bokförlag +brottsbal brottsbalken +bränsleförbr bränsleförbrukning +budgetprop budgetproposition +cg centigram +civ ek civilekonom +civ ing civilingenjör +civ. ek civilekonom +civ. ing civilingenjör +d v s det vill säga +d. v. s det vill säga +d.v.s det vill säga +dagl dagligen +delnr delnummer +deltävl deltävling +dep. sek departementssekreterare +dep.sek departementssekreterare +dgr dagar +diagr diagram +div diverse +dnr diarienummer +dopgtj dopgudstjänst +dvs det vill säga +e Kr efter Kristus +e dyl eller dylikt +e. Kr efter Kristus +e. dyl eller dylikt +e.Kr efter Kristus +e.dyl eller dylikt +eftr efterträdare +ekonomprogr ekonomiprogram +el. dyl eller dylikt +el.dyl eller dylikt +elitutb elitutbildning +et al med flera +et. al med flera +etc etcetera +ev eventuellt +ex vis exempelvis +ex. vis exempelvis +exkl exklusive +exv exempelvis +exvis exempelvis +f Kr före Kristus +f. Kr före Kristus +f. v. b för vidare befordran +f.Kr före Kristus +f.v.b för vidare befordran +fil cand filosofie kandidat +fil dr filosofie doktor +fil lic filosofie licentiat +fil mag filosofie magister +fil. cand filosofie kandidat +fil. dr filosofie doktor +fil. lic filosofie licentiat +fil. mag filosofie magister +fil.cand filosofie kandidat +fil.dr filosofie doktor +fil.lic filosofie licentiat +fil.mag filosofie magister +fortf fortfarande +forts fortsättning +fr o m från och med +fr. a framför allt +fr. o. m från och med +fr.a framför allt +fr.o.m från och med +fr.om från och med +fskr festskrift +fvb för vidare befordran +färgill färgillustration +föreg föregående +förest föreståndare +förf författare +försl förslag +försäkr försäkring +försälj försäljning +förv. arb förvärvsarbete +förv.arb förvärvsarbete +förvärvsarb förvärvsarbetande +geriatr geriatriska +ggr gånger +hg hekto +hovr hovrätt +hänv hänvisning +högskoleutb högskoleutbildning +högskoleutbildn högskoleutbildning +i o f s i och för sig +i o. f. s i och för sig +i st. f i stället för +i st.f i stället för +i.o.f.s i och för sig +i.st.f i stället för +infonr infonummer +inkl inklusive +inkomstfr inkomstfrämjande +inköpsnr inköpsnummer +inst. f institutionen för +inv invånare +iofs i och för sig +jfr jämför +jmf jämför +jmfr jämför +jourtfn jourtelefon +km/tim kilometer per timme +kommunfullm kommunfullmäktige +kompetensutv kompetensutveckling +kongl kongelige +kr kronor +kr/st kronor styck +krm kryddmått +kulturdep kulturdepartementet +kundtelnr kundtelefonnummer +kvm kvadratmeter +köksutr köksutrustning +licensnr licensnummer +lärarutb lärarutbildning +löneutv löneutveckling +löpnr löpnummer +m a o med andra ord +m fl med flera +m m med mera +m. a. o med andra ord +m. fl med flera +m. m med mera +m.a.o med andra ord +m.e.m mer eller mindre +m.fl med flera +m.v.h med vänlig hälsning +m.ö.h meter över havet +medförf medförfattare +medl medlem +mfl med flera +mg milligram +mikrog mikrogram +mkr miljoner kronor +mkt mycket +mnkr miljoner kronor +motsv motsvarande +msek miljoner svenska kronor +mvh med vänlig hälsning +målgr målgrupp +målnr målnummer +mö.h meter över havet +möjl möjligen +ngt något +nuv nuvarande +nybes nybesiktad +näml nämligen +näringsdep näringsdepartementet +närv närvarande +o d och dylikt +o dyl och dylikt +o s v och så vidare +o. s. v och så vidare +o.s.v och så vidare +obesk obeskattad +obet obetald +obs observera +odont odontologie +officersutb officersutbildning +omarb omarbetad +omkr omkring +onsd onsdag +op cit i anfört arbete +op. cit i anfört arbete +op.cit i anfört arbete +opubl opublicerad +ordertel ordertelefon +ordertlf ordertelefon +ordf ordförande +orig original +osign osignerad +ospec ospecificerad +osv och så vidare +p g a på grund av +p gr a på grund av +p. g. a på grund av +p. gr. a på grund av +p.g.a på grund av +p.gr.a på grund av +pat avg patientavgift +pat. avg patientavgift +pediatr pediatrik +personkm personkilometer +personnr personnummer +pga på grund av +pkt paket +plac placering +pocketuppl pocketupplaga +postnr postnummer +prof professor +prog program +progr program +prop proposition +psalt Psaltaren +pseud pseudonym +publ publikation +påfölj påföljande +radnr radnummer +rangnr rangnummer +rapportnr rapportnummer +red redaktör +repr repris +resp respektive +revsekr revisionssekreterare +revuppl revisionsupplaga +rundskr rundskrivelse +rundskriv rundskrivelse +s. a. s så att säga +s.a.s så att säga +samtl samtliga +sedv sedvanlig +sekr sekreterare +serviceorg serviceorganisation +sjukd sjukdom +sjuksköt sjuksköterska +sjukv sjukvård +socialdemokr socialdemokratiska +soffgr soffgrupp +spec ped specialpedagog +spec. ped specialpedagog +spec.ped specialpedagog +specialped specialpedagog +spårnr spårnummer +startm startmotor +stl storlek +studentlitt studentlitteratur +studieförb studieförbund +suppl suppleant +sv. övers svensk översättning +sängb sängbord +sänkn sänkning +särsk särskilt +t ex till exempel +t o m till och med +t. e. x till exempel +t. o. m till och med +taknr taknummer +tandvb tandvårdsbyrån +tel nr telefonnummer +tel. nr telefonnummer +tel.nr telefonnummer +telefon-nr telefonnummer +telefonnr telefonnummer +telnr telefonnummer +temanr temanummer +tex till exempel +texttfn texttelefon +tfn telefon +tfn nr telefonnummer +tfn. nr telefonnummer +tfn.nr telefonnummer +tfnnr telefonnummer +tidn tidning +tidskr tidskrift +tidsskr tidsskrift +tillb tillbehör +tillg tillgång +tillh tillhör +tjf tjänsteförrättare +tjl tjänstledig +tkr tusen kronor +trol troligen +trpt transport +träningslgh träningslägenhet +tävl tävling +u p a utan personligt ansvar +u. p. a utan personligt ansvar +u.p.a utan personligt ansvar +udg udgave +univ universitet +uppdr uppdrag +upphandl upphandling +urspr ursprungligen +ursprungl ursprungligen +utb utbildning +utbildn utbildning +utg utgiven +uth uthyres +utl utländsk +vanl vanligen +varusmugglingssl varusmugglingslagen +verksamh verksamhet +vindistr vindistrikt +vol volym +vuxenutb vuxenutbildning +vx växel +webbnr webbnummer +ytterl ytterligare +yttr yttrande +årg årgång +åtg åtgärd +ökn ökning +övers översättning +övn övning +övr övrigt diff --git a/nemo_text_processing/text_normalization/sv/data/abbreviations/case_sensitive.tsv b/nemo_text_processing/text_normalization/sv/data/abbreviations/case_sensitive.tsv new file mode 100644 index 000000000..c0d6d71f8 --- /dev/null +++ b/nemo_text_processing/text_normalization/sv/data/abbreviations/case_sensitive.tsv @@ -0,0 +1,181 @@ +AckL ackordslagen +ActL lagen om avtal och andra rättshandlingar på förmögenhetsrättens område +AnlL anläggningslagen +AnmL Anmälningsskyldighetslagen +ArkF Arkivförordningen +ArkivL Arkivlagen +AvbetKL lagen om avbetalningsköp mellan näringsidkare +AvbetLN lagen om avbetalningsköp mellan näringsidkare +AvgF avgiftsförordningen +AvtL avtalslagen +AvtvillkL Lagen om avtalsvillkorslag i konsumentförhållanden +BVerfG Bundesverfassungsgericht +BVerfGE Entscheidungen des Bundenverfassungerichts +BehL Behandlingslagen +BehandlL Lagen om behandling av häktade och anhållna med flera +BetsL Betalningssäkringslagen +BoU bostadsutskottet +BrB brottsbalken +BrB:s brottsbalkens +BrL Brottsskadelagen +BrP Lagen om införande av brottsbalken +ChL checklagen +CheckL Checklagen +CsSkr Centralstyrelsens skrivelse +DataF Dataförordningen +DelgF Delgivningsförordningen +DelgL Delgivningslagen +DelgivnL Delgivningslagen +DepL depositionslagen +DjsL Djurskyddslagen +DlgL Delgivningslagen +DsJu Departementsserien, Justitiedepartementet +DödnL dödningslagen +EGTullK EG tull K +EkomL Lagen om elektronisk kommunikation +ErFL Lagen om ersättningsfonder +ErsL Ersättningslagen +Exml Expansionsmedelslagen +ExpL Expropriationslagen +ExprL Expropriationslagen +Exprk Expropriationskungörelsen +F d föredetta +FVIII faktor åtta +FiU finansutskottet +FingeravtrycksF Fingeravtrycksförordningen +FirmaL firmalagen +FrämjandeL Främjandelagen +FtaxL Fastighetstaxeringslagen +FvL Förvaltningslagen +FvPrL Förvaltningsprocesslagen +FöU försvarsutskottet +GUtlL gamla utlänningslagen +GåvoL Gåvolagen +HovR hovrätten +HovR:n hovrätten +HovR:ns hovrättens +HskL Hälsoskyddslagen +IndrivningsF Indrivningsförordningen +InkassoL Inkassolagen +InsiderL Insiderlagen +InstrRPS Förordning med instruktion för RPS +InstrRÅ Förordning med instruktion för riksåklagaren +Ju-dep justitiedepartementet +JuU Justitieutskottet +JvSL Järnvägssäkerhetslagen +JvTrL Järnvägstrafiklagen +JämL jämställdhetslagen +K.prop. Kunglig proposition +KKL Konsumentköplagen +KRes Kunglig Resolution +KSkr Kunglig Skrivelse +KamrR kammarrätten +KamrR:s kammarrättens +Kförkl Kunglig förklaring +KkL Körkortslagen +KkrL Konsumentkreditlagen +KommL kommissionslagen +KonkL Konkurslagen +KonsTjL Konsumenttjänstlagen +KrU Kulturutskottet +KskL Kommunalskattelagen +Ku-dep kulturdepartementet +KungL Kungörandelagen +KöpL köplagen +LSt:s Länsstyrelses +LagR Lagrådet +Lst Länsstyrelsen +MSkL Miljöskadelagen +Mc mac +MiljöB Miljöbalken +MiljöB:s Miljöbalkens +NUtlL nya utlänningslagen +NoK Natur och kultur +NyttjL lagen om nyttjanderätt till fast egendom +OffSekrL offentlighets- och sekretesslagen +PbrL Lagen om pantbrevsregister +PolL polislagen +PolL:s Polislagens +PolisL polislagen +ProkuraL Prokuralagen +RBKomm Kommentar till rättegångsbalken +RegF Regeringsformen +RegR regeringsrätten +RegR:s Regeringsrättens +RhjF Rättshjälpsförordningen +RhjL Rättshjälpslagen +Ridd.O Riddarhusordningen +RomF Romfördraget +RtjL Räddningstjänstlagen +RänteL räntelagen +SEK svenska kronor +SamboL Lagen om sambors gemensamma hem +SamägarL Lagen om samäganderätt +SekrF Sekretessförordningen +SekrL sekretesslagen +SekrL:s Sekretesslagens +SemL Semesterlagen +ServL Lagen om servitut +SjöL Sjölagen +SkBrL Skattebrottslagen +SkL Skadeståndslagen +SkU skatteutskottet +SkadestL Skadeståndslagen +SkadestL:s Skadeståndslagens +SkbrL skuldebrevslagen +SkkL Skogskontolagen +SksanL skuldsaneringslagen +SkstL skadeståndslagen +SmittskL Smittskyddslagen +SmittskL:s Smittskyddslagens +SoF Socialtjänstförordningen +SoL Socialtjänstlagen +SoL:s Socialtjänstlagens +SoU socialutskottet +SofL Socialförsäkringslagen +StsSkl Strålskyddslagen +SvJT Svensk Juristtidning +TR:n tingsrätten +TR:ns tingsrättens +TaxL Taxeringslagen +TaxL:s Taxeringslagens +TeleL Telelagen +Tr.F Tryckfrihetsförordningen +Tr.O Tryckfrihetsförordningen +TrF Trafikförordningen +TrF:s Trafikförordningens +TraF Trafikförordningen +TraF:s Trafikförordningens +TrafikF Trafikförordningen +TrafikF:s Trafikförordningens +TskL Trafikskadelagen +TvL Lagen om särskilda tvångsåtgärder i beskattningsförfarandet +UbU Utbildningsutskottet +UpphL upphovsrättslagen +UtlF Utlänningsförordningen +UtlL utlänningslagen +UtlL:s Utlänningslagens +ValL:s Vallagens +VerksF Verksförordningen +VerksF:s Verksförordningens +VxL Växellagen +a.d. anno domini +c:a cirka +dB decibel +dBA decibel +e l. eller liknande +eg. egentligen +em. eftermiddag +eo. extra ordinarie +f d. föredetta +f.m. förmiddag +fn. för närvarande +hPa hektopascal +sr. senior +valL vallagen +µm mikrometer +ÄgofrL Lagen om ägofred +ÄktB Äktenskapsbalken +ÄktP Lagen om införande av äktenskapsbalken +ÄrendeL Lagen om domstolsärenden +ÅklF Åklagarförordningen diff --git a/nemo_text_processing/text_normalization/sv/data/abbreviations/case_sensitive_alternatives.tsv b/nemo_text_processing/text_normalization/sv/data/abbreviations/case_sensitive_alternatives.tsv new file mode 100644 index 000000000..c8da639e0 --- /dev/null +++ b/nemo_text_processing/text_normalization/sv/data/abbreviations/case_sensitive_alternatives.tsv @@ -0,0 +1,2 @@ +e. u. enligt uppdrag +e.u. enligt uppdrag diff --git a/nemo_text_processing/text_normalization/sv/data/abbreviations/case_sensitive_opt_dot.tsv b/nemo_text_processing/text_normalization/sv/data/abbreviations/case_sensitive_opt_dot.tsv new file mode 100644 index 000000000..94265195c --- /dev/null +++ b/nemo_text_processing/text_normalization/sv/data/abbreviations/case_sensitive_opt_dot.tsv @@ -0,0 +1,45 @@ +Ca cirka +F. d föredetta +Fd föredetta +Sc.St.L Scandinavian Studies in Law +ca cirka +cm centimeter +d. y den yngre +d. ä den äldre +d.y den yngre +d.ä den äldre +e. l eller liknande +e. o extra ordinarie +e. u enligt uppgift +e.c e contrario +e.l eller liknande +e.m eftermiddag +e.o extra ordinarie +e.u enligt uppgift +f. d föredetta +f. n för närvarande +f. ö för övrigt +f.n för närvarande +f.ö för övrigt +fd föredetta +ff och följande sidor +fg föregående +interp interpellation +kg kilo +km kilometer +o. a och andra +o.a och andra +rskr riksdagsskrivelse +u. a utan anmärkning +u. o utan ort +u. å utan årtal +u.a utan anmärkning +u.o utan ort +u.å utan årtal +ua utan anmärkning +uo utan ort +uå utan årtal +ö. g över gården +ö. h över havet +ö.g över gården +ö.h över havet diff --git a/nemo_text_processing/text_normalization/sv/data/abbreviations_nondet.tsv b/nemo_text_processing/text_normalization/sv/data/abbreviations/nondeterministic.tsv similarity index 100% rename from nemo_text_processing/text_normalization/sv/data/abbreviations_nondet.tsv rename to nemo_text_processing/text_normalization/sv/data/abbreviations/nondeterministic.tsv diff --git a/nemo_text_processing/text_normalization/sv/data/whitelist.tsv b/nemo_text_processing/text_normalization/sv/data/whitelist.tsv index a8f66fb52..a08b6a1cf 100644 --- a/nemo_text_processing/text_normalization/sv/data/whitelist.tsv +++ b/nemo_text_processing/text_normalization/sv/data/whitelist.tsv @@ -56,3 +56,5 @@ rdr. riksdaler ÅR åskådliga rummet o.s.a. om svar anhålles o. s. a. om svar anhålles +& co och kompani +& Co. och kompani diff --git a/nemo_text_processing/text_normalization/sv/taggers/whitelist.py b/nemo_text_processing/text_normalization/sv/taggers/whitelist.py index e8bf8151c..e5451cf44 100644 --- a/nemo_text_processing/text_normalization/sv/taggers/whitelist.py +++ b/nemo_text_processing/text_normalization/sv/taggers/whitelist.py @@ -14,7 +14,8 @@ import pynini from pynini.lib import pynutil -from nemo_text_processing.text_normalization.en.graph_utils import GraphFst, convert_space +from nemo_text_processing.text_normalization.en.graph_utils import NEMO_SIGMA, GraphFst, convert_space +from nemo_text_processing.text_normalization.sv.graph_utils import TO_LOWER from nemo_text_processing.text_normalization.sv.utils import get_abs_path, load_labels @@ -41,10 +42,36 @@ def _get_whitelist_graph(input_case, file): graph = pynini.string_map(whitelist) return graph + def _get_optional_dot_graph(input_case, file): + graph = _get_whitelist_graph(input_case, file) + return graph + pynini.closure(pynutil.delete("."), 0, 1) + + def _get_case_insensitive_graph(input_case, file): + graph = _get_whitelist_graph("lower_cased", file) + if input_case == "lower_cased": + return graph + lower_cased_input = pynini.cdrewrite(TO_LOWER, "", "", NEMO_SIGMA) + return lower_cased_input @ graph + + def _get_case_insensitive_optional_dot_graph(input_case, file): + graph = _get_case_insensitive_graph(input_case, file) + return graph + pynini.closure(pynutil.delete("."), 0, 1) + graph = _get_whitelist_graph(input_case, get_abs_path("data/whitelist.tsv")) + graph |= _get_whitelist_graph(input_case, get_abs_path("data/abbreviations/case_sensitive.tsv")) + graph |= _get_optional_dot_graph( + input_case, get_abs_path("data/abbreviations/case_sensitive_opt_dot.tsv") + ) + graph |= _get_case_insensitive_graph( + input_case, get_abs_path("data/abbreviations/case_insensitive.tsv") + ) + graph |= _get_case_insensitive_optional_dot_graph( + input_case, get_abs_path("data/abbreviations/case_insensitive_opt_dot.tsv") + ) if not deterministic and input_case != "lower_cased": + lower_cased_graph = _get_whitelist_graph("lower_cased", get_abs_path("data/whitelist.tsv")) graph |= pynutil.add_weight( - _get_whitelist_graph("lower_cased", get_abs_path("data/whitelist.tsv")), weight=0.0001 + lower_cased_graph, weight=0.0001 ) if input_file: @@ -57,7 +84,15 @@ def _get_whitelist_graph(input_case, file): if not deterministic: units_graph = _get_whitelist_graph(input_case, file=get_abs_path("data/measure/unit.tsv")) units_graph |= _get_whitelist_graph(input_case, file=get_abs_path("data/measure/unit_neuter.tsv")) - units_graph |= _get_whitelist_graph(input_case, file=get_abs_path("data/abbreviations_nondet.tsv")) + units_graph |= _get_whitelist_graph( + input_case, file=get_abs_path("data/abbreviations/nondeterministic.tsv") + ) + units_graph |= _get_case_insensitive_graph( + input_case, get_abs_path("data/abbreviations/case_insensitive_alternatives.tsv") + ) + units_graph |= _get_whitelist_graph( + input_case, get_abs_path("data/abbreviations/case_sensitive_alternatives.tsv") + ) graph |= units_graph self.graph = graph diff --git a/tests/nemo_text_processing/sv/data_text_normalization/test_cases_whitelist.txt b/tests/nemo_text_processing/sv/data_text_normalization/test_cases_whitelist.txt index 78649e640..d9e2c64d9 100644 --- a/tests/nemo_text_processing/sv/data_text_normalization/test_cases_whitelist.txt +++ b/tests/nemo_text_processing/sv/data_text_normalization/test_cases_whitelist.txt @@ -1 +1,15 @@ s:t erik~sankt erik +allm. information~allmän information +ALLM information~allmän information +bg. 123~bankgiro hundratjugotre +Kalle Anka & co~Kalle Anka och kompani +bl. a. böcker~bland annat böcker +se ff.~se och följande sidor +d.v.s. samma sak~det vill säga samma sak +fr.o.m. måndag~från och med måndag +akad. avh. i ämnet~akademisk avhandling i ämnet +dnr. 123~diarienummer hundratjugotre +i.o.f.s. inte~i och för sig inte +pga. vädret~på grund av vädret +AckL gäller~ackordslagen gäller +ackl gäller~ackl gäller From 98869d5c53f659b0b4b68c71cd7629a1a7cb2d05 Mon Sep 17 00:00:00 2001 From: Jim O'Regan Date: Fri, 7 Aug 2026 17:12:18 +0100 Subject: [PATCH 4/9] Add header to __init__.py Signed-off-by: Jim O'Regan --- .../sv/data/abbreviations/__init__.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/nemo_text_processing/text_normalization/sv/data/abbreviations/__init__.py b/nemo_text_processing/text_normalization/sv/data/abbreviations/__init__.py index e69de29bb..6ebc808fa 100644 --- a/nemo_text_processing/text_normalization/sv/data/abbreviations/__init__.py +++ b/nemo_text_processing/text_normalization/sv/data/abbreviations/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. From 5b50a186d3cc379739330692f4665a679407772a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 7 Aug 2026 16:15:34 +0000 Subject: [PATCH 5/9] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .../text_normalization/sv/taggers/ordinal.py | 4 +--- .../text_normalization/sv/taggers/whitelist.py | 12 +++--------- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/nemo_text_processing/text_normalization/sv/taggers/ordinal.py b/nemo_text_processing/text_normalization/sv/taggers/ordinal.py index e5b4f2ae8..9f492ac5f 100644 --- a/nemo_text_processing/text_normalization/sv/taggers/ordinal.py +++ b/nemo_text_processing/text_normalization/sv/taggers/ordinal.py @@ -203,9 +203,7 @@ def __init__(self, cardinal: GraphFst, deterministic: bool = True): reference_graph = pynini.Fst() if not deterministic: for written, spoken in load_labels(get_abs_path("data/reference/ordinal.tsv")): - optional_dot = ( - pynini.closure(pynutil.delete("."), 0, 1) if written.isalpha() else pynini.accep("") - ) + optional_dot = pynini.closure(pynutil.delete("."), 0, 1) if written.isalpha() else pynini.accep("") unit = pynutil.delete(written) + optional_dot reference_graph |= cleaned_graph + delete_space + unit + pynutil.insert(f" {spoken}") diff --git a/nemo_text_processing/text_normalization/sv/taggers/whitelist.py b/nemo_text_processing/text_normalization/sv/taggers/whitelist.py index e5451cf44..689a1ac58 100644 --- a/nemo_text_processing/text_normalization/sv/taggers/whitelist.py +++ b/nemo_text_processing/text_normalization/sv/taggers/whitelist.py @@ -59,20 +59,14 @@ def _get_case_insensitive_optional_dot_graph(input_case, file): graph = _get_whitelist_graph(input_case, get_abs_path("data/whitelist.tsv")) graph |= _get_whitelist_graph(input_case, get_abs_path("data/abbreviations/case_sensitive.tsv")) - graph |= _get_optional_dot_graph( - input_case, get_abs_path("data/abbreviations/case_sensitive_opt_dot.tsv") - ) - graph |= _get_case_insensitive_graph( - input_case, get_abs_path("data/abbreviations/case_insensitive.tsv") - ) + graph |= _get_optional_dot_graph(input_case, get_abs_path("data/abbreviations/case_sensitive_opt_dot.tsv")) + graph |= _get_case_insensitive_graph(input_case, get_abs_path("data/abbreviations/case_insensitive.tsv")) graph |= _get_case_insensitive_optional_dot_graph( input_case, get_abs_path("data/abbreviations/case_insensitive_opt_dot.tsv") ) if not deterministic and input_case != "lower_cased": lower_cased_graph = _get_whitelist_graph("lower_cased", get_abs_path("data/whitelist.tsv")) - graph |= pynutil.add_weight( - lower_cased_graph, weight=0.0001 - ) + graph |= pynutil.add_weight(lower_cased_graph, weight=0.0001) if input_file: whitelist_provided = _get_whitelist_graph(input_case, input_file) From cdb85eb0bc4d3ac703e29bb5c8e816348021ef26 Mon Sep 17 00:00:00 2001 From: Jim O'Regan Date: Fri, 7 Aug 2026 17:29:24 +0100 Subject: [PATCH 6/9] Move Swedish units into measure grammar Signed-off-by: Jim O'Regan --- .../data/abbreviations/case_insensitive.tsv | 52 ------------------- .../case_insensitive_alternatives.tsv | 1 - .../case_insensitive_opt_dot.tsv | 8 --- .../sv/data/abbreviations/case_sensitive.tsv | 5 -- .../abbreviations/case_sensitive_opt_dot.tsv | 4 -- .../sv/data/measure/unit.tsv | 33 ++++++++++++ .../sv/data/measure/unit_neuter.tsv | 3 ++ .../sv/data/measure/unit_plural.tsv | 25 +++++++++ .../reference/cardinal_nondeterministic.tsv | 1 + .../sv/data/reference/ordinal.tsv | 1 + .../text_normalization/sv/taggers/cardinal.py | 5 +- .../test_cases_measure.txt | 24 +++++++++ .../test_cases_normalize_with_audio.txt | 6 +++ 13 files changed, 97 insertions(+), 71 deletions(-) create mode 100644 nemo_text_processing/text_normalization/sv/data/reference/cardinal_nondeterministic.tsv diff --git a/nemo_text_processing/text_normalization/sv/data/abbreviations/case_insensitive.tsv b/nemo_text_processing/text_normalization/sv/data/abbreviations/case_insensitive.tsv index 60e4d9571..9e9a46b87 100644 --- a/nemo_text_processing/text_normalization/sv/data/abbreviations/case_insensitive.tsv +++ b/nemo_text_processing/text_normalization/sv/data/abbreviations/case_insensitive.tsv @@ -12,11 +12,9 @@ DiskrL diskrimineringslagen FiskeL fiskelagen FullmL Lagen om fullmaktsanställning FörfSamlF författningssamlingsförordningen -GWh gigawattimmar HSjvL Hälso och sjukvårdslagen HyresfL lagen om förvärv av hyresfastighet HyresftL lagen om förvärv av hyresfastighet -Hz hertz HögskF Högskoleförordningen HögskL Högskolelagen Ibid. Ibidem @@ -27,7 +25,6 @@ KTjL konsumenttjänstlagen KamR Kammarrätten KamR:s Kammarrättens Kebbe-förl Kebbe-förlaget -Km² kvadratkilometer KomL Kommunallagen KomL:s Kommunallagens KonkurrensL konkurrenslagen @@ -45,10 +42,6 @@ LSTInstr Förordning med länsstyrelseinstruktion LivsmL Livsmedelslagen LivsmL:s Livsmedelslagens LösdrL lösdriverilagen -MHz megahertz -MJ megajoule -MW megawatt -MWel megawatt el MedbL Lagen om svenskt medborgarskap MedbL:s Lagen om svenskt medborgarskaps Mme madame @@ -61,9 +54,6 @@ PreskrL preskriptionslagen RättsprL Rättsprövningslagen SBetL Skattebetalningslagen SkolL Skollagen -TWhel terawattimmar el -TWhkyla terawattimmar kyla -TWhvärme terawattimmar värme TullL tullagen US$ US-dollar VitesL Viteslagen @@ -83,14 +73,8 @@ beh. behandling behandl. behandling behanl behandling best nr beställningsnummer -cal. kalori chefsexp chefsexpedition chefsexp. chefsexpedition -cl/l centiliter per liter -cm2 kvadratcentimeter -cm3 kubikcentimeter -cm² kvadratcentimeter -cm³ kubikcentimeter d:o dito dens. densamma dep chef departementschef @@ -101,10 +85,6 @@ dep. sekreterare departementssekreterare dep.chef departementschef dep.chefen departementschefen dep.sekreterare departementssekreterare -dm2 kvadratdecimeter -dm3 kubikdecimeter -dm² kvadratdecimeter -dm³ kubikdecimeter doc. docent dw dödvikt e.t.c. etcetera @@ -136,21 +116,7 @@ jr junior jur. juris jur.utr. juris utriusque k:a kyrka -kHz kilohertz -kJ kilojoule -kV kilovolt -kW kilowatt -kWh kilowattimme kand. kandidat -kbit kilobit -kbps kilobits per sekund -kcal/dag kilokalorier per dag -kcal/gram kilokalorier per gram -kj/kg kilojoule per kilo -kl. klockan -km/h kilometer i timmen -km/s kilometer per sekund -km2 kvadratkilometer km:s kilometers kostn. kostnad kr/kg kronor per kilo @@ -162,33 +128,16 @@ kton kiloton leg. legitimerad lic. licentiat lig. ligament -lx lux -m2 kvadratmeter -m3 kubikmeter mag. magister maj:t majestät maj:ts majestäts mbar millibar -mbps megabits per sekund -mbyte megabyte mdkr miljarder kronor -mg/kg milligram per kilo min övers. min översättning ml/l milliliter per liter -mm vp millimeter vattenpelare -mm2 kvadratmillimeter -mm3 kubikmillimeter -mmHg millimeter kvicksilver -mmol millimol -mmol/l millimol per liter -mm² kvadratmillimeter mm³ kubikmillimeter mnkr miljoner kronor mom. moment -m² kvadratmeter -m³ kubikmeter -ng/kg nanogram per kilo -nmol nanomol nr/år nummer per år omm om och endast om op. opus @@ -197,7 +146,6 @@ ord. pris ordinarie pris ord.pris ordinarie pris pat.avg. patientavgift pers. person -pmol pikomol rec. recension reg. register rev. reviderad diff --git a/nemo_text_processing/text_normalization/sv/data/abbreviations/case_insensitive_alternatives.tsv b/nemo_text_processing/text_normalization/sv/data/abbreviations/case_insensitive_alternatives.tsv index 7a879406f..42d6d4fb1 100644 --- a/nemo_text_processing/text_normalization/sv/data/abbreviations/case_insensitive_alternatives.tsv +++ b/nemo_text_processing/text_normalization/sv/data/abbreviations/case_insensitive_alternatives.tsv @@ -5,7 +5,6 @@ ev. eventuell ex. exemplar fr. fru fr. fröken -kl. klass omarb. omarbetade omm ekvivalent red. redaktörer diff --git a/nemo_text_processing/text_normalization/sv/data/abbreviations/case_insensitive_opt_dot.tsv b/nemo_text_processing/text_normalization/sv/data/abbreviations/case_insensitive_opt_dot.tsv index 4a8e89799..993fac142 100644 --- a/nemo_text_processing/text_normalization/sv/data/abbreviations/case_insensitive_opt_dot.tsv +++ b/nemo_text_processing/text_normalization/sv/data/abbreviations/case_insensitive_opt_dot.tsv @@ -49,7 +49,6 @@ bokförl bokförlag brottsbal brottsbalken bränsleförbr bränsleförbrukning budgetprop budgetproposition -cg centigram civ ek civilekonom civ ing civilingenjör civ. ek civilekonom @@ -149,7 +148,6 @@ jfr jämför jmf jämför jmfr jämför jourtfn jourtelefon -km/tim kilometer per timme kommunfullm kommunfullmäktige kompetensutv kompetensutveckling kongl kongelige @@ -158,7 +156,6 @@ kr/st kronor styck krm kryddmått kulturdep kulturdepartementet kundtelnr kundtelefonnummer -kvm kvadratmeter köksutr köksutrustning licensnr licensnummer lärarutb lärarutbildning @@ -174,12 +171,9 @@ m.a.o med andra ord m.e.m mer eller mindre m.fl med flera m.v.h med vänlig hälsning -m.ö.h meter över havet medförf medförfattare medl medlem mfl med flera -mg milligram -mikrog mikrogram mkr miljoner kronor mkt mycket mnkr miljoner kronor @@ -188,7 +182,6 @@ msek miljoner svenska kronor mvh med vänlig hälsning målgr målgrupp målnr målnummer -mö.h meter över havet möjl möjligen ngt något nuv nuvarande @@ -229,7 +222,6 @@ p.gr.a på grund av pat avg patientavgift pat. avg patientavgift pediatr pediatrik -personkm personkilometer personnr personnummer pga på grund av pkt paket diff --git a/nemo_text_processing/text_normalization/sv/data/abbreviations/case_sensitive.tsv b/nemo_text_processing/text_normalization/sv/data/abbreviations/case_sensitive.tsv index c0d6d71f8..f8194bee3 100644 --- a/nemo_text_processing/text_normalization/sv/data/abbreviations/case_sensitive.tsv +++ b/nemo_text_processing/text_normalization/sv/data/abbreviations/case_sensitive.tsv @@ -161,19 +161,14 @@ VerksF:s Verksförordningens VxL Växellagen a.d. anno domini c:a cirka -dB decibel dBA decibel e l. eller liknande eg. egentligen -em. eftermiddag eo. extra ordinarie f d. föredetta -f.m. förmiddag fn. för närvarande -hPa hektopascal sr. senior valL vallagen -µm mikrometer ÄgofrL Lagen om ägofred ÄktB Äktenskapsbalken ÄktP Lagen om införande av äktenskapsbalken diff --git a/nemo_text_processing/text_normalization/sv/data/abbreviations/case_sensitive_opt_dot.tsv b/nemo_text_processing/text_normalization/sv/data/abbreviations/case_sensitive_opt_dot.tsv index 94265195c..fdaceb265 100644 --- a/nemo_text_processing/text_normalization/sv/data/abbreviations/case_sensitive_opt_dot.tsv +++ b/nemo_text_processing/text_normalization/sv/data/abbreviations/case_sensitive_opt_dot.tsv @@ -3,7 +3,6 @@ F. d föredetta Fd föredetta Sc.St.L Scandinavian Studies in Law ca cirka -cm centimeter d. y den yngre d. ä den äldre d.y den yngre @@ -13,7 +12,6 @@ e. o extra ordinarie e. u enligt uppgift e.c e contrario e.l eller liknande -e.m eftermiddag e.o extra ordinarie e.u enligt uppgift f. d föredetta @@ -25,8 +23,6 @@ fd föredetta ff och följande sidor fg föregående interp interpellation -kg kilo -km kilometer o. a och andra o.a och andra rskr riksdagsskrivelse diff --git a/nemo_text_processing/text_normalization/sv/data/measure/unit.tsv b/nemo_text_processing/text_normalization/sv/data/measure/unit.tsv index e0e2af1fe..c3522bf42 100644 --- a/nemo_text_processing/text_normalization/sv/data/measure/unit.tsv +++ b/nemo_text_processing/text_normalization/sv/data/measure/unit.tsv @@ -21,6 +21,7 @@ cu mi kubikmil cwt centner da atommassenhet db decibel +dl deciliter dm2 kvadratdecimeter dm² kvadratdecimeter dm3 kubikdecimeter @@ -112,6 +113,7 @@ ms millisekund Mv megavolt mv millivolt mw megawatt +mwh megawattimme nm nanometer ns nanosekund ºc celsiusgrad @@ -134,6 +136,8 @@ TB terabyte tim timme tj terajoule tl teraliter +tsk tesked +twh terawattimme " tum v volt YB yottabyte @@ -145,3 +149,32 @@ zj zettajoule μs mikrosekund ω ohm msk matsked +cal kalori +cl centiliter +hpa hektopascal +hPa hektopascal +kbit kilobit +kHz kilohertz +kJ kilojoule +kV kilovolt +kWh kilowattimme +kcal/dag kilokalori per dag +kcal/gram kilokalori per gram +l liter +lx lux +mbyte megabyte +mm vp millimeter vattenpelare +mmhg millimeter kvicksilver +mmHg millimeter kvicksilver +mmol millimol +mwel megawatt el +nmol nanomol +personkm personkilometer +pmol pikomol +twhel terawattimme el +twhkyla terawattimme kyla +twhvärme terawattimme värme +µm mikrometer +kvm kvadratmeter +m.ö.h meter över havet +mö.h meter över havet diff --git a/nemo_text_processing/text_normalization/sv/data/measure/unit_neuter.tsv b/nemo_text_processing/text_normalization/sv/data/measure/unit_neuter.tsv index 0ca4d4e3c..da70c6b60 100644 --- a/nemo_text_processing/text_normalization/sv/data/measure/unit_neuter.tsv +++ b/nemo_text_processing/text_normalization/sv/data/measure/unit_neuter.tsv @@ -1,3 +1,4 @@ +dg decigram g gram kg kilogram kp kilopond @@ -11,3 +12,5 @@ pg petagram rpm varv per minut varv/min varv per minut μg mikrogram +cg centigram +mikrog mikrogram diff --git a/nemo_text_processing/text_normalization/sv/data/measure/unit_plural.tsv b/nemo_text_processing/text_normalization/sv/data/measure/unit_plural.tsv index 1e7d79aa9..32fd5509b 100644 --- a/nemo_text_processing/text_normalization/sv/data/measure/unit_plural.tsv +++ b/nemo_text_processing/text_normalization/sv/data/measure/unit_plural.tsv @@ -9,6 +9,8 @@ celsiusgrad celsiusgrader centimeter centner decibel +decigram +deciliter decimeter decisekund decisekunder elektronvolt @@ -76,6 +78,7 @@ megasekund megasekunder megasiemens megavolt megawatt +megawattimme megawattimmar meter mikrogram mikrometer @@ -106,6 +109,8 @@ radian radianer sekund sekunder sievert terabyte +terawattimme terawattimmar +tesked teskedar terajoule teraliter timme timmar @@ -119,3 +124,23 @@ yottajoule zettabyte zettajoule matsked matskedar +centigram +centiliter +hektopascal +kilobit per sekund +kilokalori per dag kilokalorier per dag +kilokalori per gram kilokalorier per gram +liter +lux +megawatt el +megabyte +meter över havet +millimeter kvicksilver +millimeter vattenpelare +millimol +nanomol +personkilometer +pikomol +terawattimme el terawattimmar el +terawattimme kyla terawattimmar kyla +terawattimme värme terawattimmar värme diff --git a/nemo_text_processing/text_normalization/sv/data/reference/cardinal_nondeterministic.tsv b/nemo_text_processing/text_normalization/sv/data/reference/cardinal_nondeterministic.tsv new file mode 100644 index 000000000..7e57c1c1d --- /dev/null +++ b/nemo_text_processing/text_normalization/sv/data/reference/cardinal_nondeterministic.tsv @@ -0,0 +1 @@ +kl klass diff --git a/nemo_text_processing/text_normalization/sv/data/reference/ordinal.tsv b/nemo_text_processing/text_normalization/sv/data/reference/ordinal.tsv index bcb50c230..15387b654 100644 --- a/nemo_text_processing/text_normalization/sv/data/reference/ordinal.tsv +++ b/nemo_text_processing/text_normalization/sv/data/reference/ordinal.tsv @@ -2,6 +2,7 @@ § paragraf art artikeln kap kapitlet +kl klassen mom momentet s sidan st stycket diff --git a/nemo_text_processing/text_normalization/sv/taggers/cardinal.py b/nemo_text_processing/text_normalization/sv/taggers/cardinal.py index a1b470d4e..5145175ad 100644 --- a/nemo_text_processing/text_normalization/sv/taggers/cardinal.py +++ b/nemo_text_processing/text_normalization/sv/taggers/cardinal.py @@ -361,7 +361,10 @@ def __init__(self, deterministic: bool = True): final_graph = optional_minus_graph + pynutil.insert("integer: \"") + self.graph + pynutil.insert("\"") reference_graph = pynini.Fst() - for written, spoken in load_labels(get_abs_path("data/reference/cardinal.tsv")): + reference_labels = load_labels(get_abs_path("data/reference/cardinal.tsv")) + if not deterministic: + reference_labels += load_labels(get_abs_path("data/reference/cardinal_nondeterministic.tsv")) + for written, spoken in reference_labels: optional_dot = pynini.closure(pynutil.delete("."), 0, 1) if written.isalpha() else pynini.accep("") unit = pynutil.delete(written) + optional_dot unit_first = pynutil.insert(f"{spoken} ") + unit + delete_space + self.graph diff --git a/tests/nemo_text_processing/sv/data_text_normalization/test_cases_measure.txt b/tests/nemo_text_processing/sv/data_text_normalization/test_cases_measure.txt index 2737d8e66..e026137d1 100644 --- a/tests/nemo_text_processing/sv/data_text_normalization/test_cases_measure.txt +++ b/tests/nemo_text_processing/sv/data_text_normalization/test_cases_measure.txt @@ -7,3 +7,27 @@ α+1=3~alfa plus ett är tre 1 +/- 0~ett plus minus noll 1 ± 0~ett plus minus noll +1 dg~ett decigram +2 dg~två decigram +1 dl~en deciliter +2 dl~två deciliter +1 MWh~en megawattimme +2 MWh~två megawattimmar +1 TWh~en terawattimme +2 TWh~två terawattimmar +1 tsk~en tesked +2 tsk~två teskedar +1 cg~ett centigram +2 cg~två centigram +1 cal.~en kalori +2 cal~två kalorier +1 hPa~en hektopascal +2 MWel~två megawatt el +1 TWhel~en terawattimme el +2 TWhel~två terawattimmar el +1 µm~en mikrometer +1 mmol~en millimol +1 mbyte~en megabyte +1 mmHg~en millimeter kvicksilver +100 m.ö.h~hundra meter över havet +1 kvm~en kvadratmeter diff --git a/tests/nemo_text_processing/sv/data_text_normalization/test_cases_normalize_with_audio.txt b/tests/nemo_text_processing/sv/data_text_normalization/test_cases_normalize_with_audio.txt index 478ed39c2..38e2de859 100644 --- a/tests/nemo_text_processing/sv/data_text_normalization/test_cases_normalize_with_audio.txt +++ b/tests/nemo_text_processing/sv/data_text_normalization/test_cases_normalize_with_audio.txt @@ -22,3 +22,9 @@ nionde kapitlet ~2 st. stycke två andra stycket +~kl. 3 +klockan tre +klass tre +~3 kl. +klass tre +tredje klassen From 70e2767b24084d9e1daa991a65eb86442dfe5e54 Mon Sep 17 00:00:00 2001 From: Jim O'Regan Date: Fri, 7 Aug 2026 17:36:23 +0100 Subject: [PATCH 7/9] extend non-det ordinal readings to also accept an article Signed-off-by: Jim O'Regan --- .../sv/data/reference/ordinal.tsv | 8 -------- .../sv/data/reference/ordinal_common.tsv | 4 ++++ .../sv/data/reference/ordinal_neuter.tsv | 3 +++ .../text_normalization/sv/taggers/ordinal.py | 20 +++++++++++++++---- .../test_cases_normalize_with_audio.txt | 8 ++++++++ 5 files changed, 31 insertions(+), 12 deletions(-) delete mode 100644 nemo_text_processing/text_normalization/sv/data/reference/ordinal.tsv create mode 100644 nemo_text_processing/text_normalization/sv/data/reference/ordinal_common.tsv create mode 100644 nemo_text_processing/text_normalization/sv/data/reference/ordinal_neuter.tsv diff --git a/nemo_text_processing/text_normalization/sv/data/reference/ordinal.tsv b/nemo_text_processing/text_normalization/sv/data/reference/ordinal.tsv deleted file mode 100644 index 15387b654..000000000 --- a/nemo_text_processing/text_normalization/sv/data/reference/ordinal.tsv +++ /dev/null @@ -1,8 +0,0 @@ -§ paragrafen -§ paragraf -art artikeln -kap kapitlet -kl klassen -mom momentet -s sidan -st stycket diff --git a/nemo_text_processing/text_normalization/sv/data/reference/ordinal_common.tsv b/nemo_text_processing/text_normalization/sv/data/reference/ordinal_common.tsv new file mode 100644 index 000000000..ea5c97366 --- /dev/null +++ b/nemo_text_processing/text_normalization/sv/data/reference/ordinal_common.tsv @@ -0,0 +1,4 @@ +§ paragrafen paragraf +art artikeln artikel +kl klassen klass +s sidan sida diff --git a/nemo_text_processing/text_normalization/sv/data/reference/ordinal_neuter.tsv b/nemo_text_processing/text_normalization/sv/data/reference/ordinal_neuter.tsv new file mode 100644 index 000000000..a3b2c9b4a --- /dev/null +++ b/nemo_text_processing/text_normalization/sv/data/reference/ordinal_neuter.tsv @@ -0,0 +1,3 @@ +kap kapitlet kapitel +mom momentet moment +st stycket stycke diff --git a/nemo_text_processing/text_normalization/sv/taggers/ordinal.py b/nemo_text_processing/text_normalization/sv/taggers/ordinal.py index 9f492ac5f..19d6f7bb9 100644 --- a/nemo_text_processing/text_normalization/sv/taggers/ordinal.py +++ b/nemo_text_processing/text_normalization/sv/taggers/ordinal.py @@ -202,10 +202,22 @@ def __init__(self, cardinal: GraphFst, deterministic: bool = True): self.bare_ordinals = cleaned_graph reference_graph = pynini.Fst() if not deterministic: - for written, spoken in load_labels(get_abs_path("data/reference/ordinal.tsv")): - optional_dot = pynini.closure(pynutil.delete("."), 0, 1) if written.isalpha() else pynini.accep("") - unit = pynutil.delete(written) + optional_dot - reference_graph |= cleaned_graph + delete_space + unit + pynutil.insert(f" {spoken}") + reference_groups = [ + ("ordinal_common.tsv", "den", "denna"), + ("ordinal_neuter.tsv", "det", "detta"), + ] + for filename, article, demonstrative in reference_groups: + for written, definite, indefinite in load_labels(get_abs_path(f"data/reference/{filename}")): + optional_dot = ( + pynini.closure(pynutil.delete("."), 0, 1) if written.isalpha() else pynini.accep("") + ) + unit = pynutil.delete(written) + optional_dot + reference = cleaned_graph + delete_space + unit + reference_graph |= reference + pynutil.insert(f" {definite}") + reference_graph |= pynutil.insert(f"{article} ") + reference + pynutil.insert(f" {definite}") + reference_graph |= ( + pynutil.insert(f"{demonstrative} ") + reference + pynutil.insert(f" {indefinite}") + ) tok_graph = ( pynutil.insert("integer: \"") diff --git a/tests/nemo_text_processing/sv/data_text_normalization/test_cases_normalize_with_audio.txt b/tests/nemo_text_processing/sv/data_text_normalization/test_cases_normalize_with_audio.txt index 38e2de859..a7cddb3d0 100644 --- a/tests/nemo_text_processing/sv/data_text_normalization/test_cases_normalize_with_audio.txt +++ b/tests/nemo_text_processing/sv/data_text_normalization/test_cases_normalize_with_audio.txt @@ -16,15 +16,23 @@ tredje december tvåtusen tjugotvå paragraf tre tredje paragraf tredje paragrafen +den tredje paragrafen +denna tredje paragraf ~9 kap. kapitel nio nionde kapitlet +det nionde kapitlet +detta nionde kapitel ~2 st. stycke två andra stycket +det andra stycket +detta andra stycke ~kl. 3 klockan tre klass tre ~3 kl. klass tre tredje klassen +den tredje klassen +denna tredje klass From b28f04e47ae2faa6c6095a70237548ce0122027b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 7 Aug 2026 16:37:08 +0000 Subject: [PATCH 8/9] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- nemo_text_processing/text_normalization/sv/taggers/ordinal.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/nemo_text_processing/text_normalization/sv/taggers/ordinal.py b/nemo_text_processing/text_normalization/sv/taggers/ordinal.py index 19d6f7bb9..3f713895b 100644 --- a/nemo_text_processing/text_normalization/sv/taggers/ordinal.py +++ b/nemo_text_processing/text_normalization/sv/taggers/ordinal.py @@ -208,9 +208,7 @@ def __init__(self, cardinal: GraphFst, deterministic: bool = True): ] for filename, article, demonstrative in reference_groups: for written, definite, indefinite in load_labels(get_abs_path(f"data/reference/{filename}")): - optional_dot = ( - pynini.closure(pynutil.delete("."), 0, 1) if written.isalpha() else pynini.accep("") - ) + optional_dot = pynini.closure(pynutil.delete("."), 0, 1) if written.isalpha() else pynini.accep("") unit = pynutil.delete(written) + optional_dot reference = cleaned_graph + delete_space + unit reference_graph |= reference + pynutil.insert(f" {definite}") From 3f3ab4ece180680a05abac65ec09cd2df544dd4f Mon Sep 17 00:00:00 2001 From: Jim O'Regan Date: Fri, 7 Aug 2026 22:55:11 +0100 Subject: [PATCH 9/9] fixes for sparrowhawk Signed-off-by: Jim O'Regan --- .../text_normalization/sv/data/measure/unit.tsv | 1 - .../text_normalization/sv/data/measure/unit_optional_dot.tsv | 1 + .../text_normalization/sv/data/measure/unit_plural.tsv | 1 + nemo_text_processing/text_normalization/sv/taggers/measure.py | 2 ++ .../text_normalization/sv/taggers/tokenize_and_classify.py | 2 +- tests/nemo_text_processing/sv/test_sparrowhawk_normalization.sh | 2 +- 6 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 nemo_text_processing/text_normalization/sv/data/measure/unit_optional_dot.tsv diff --git a/nemo_text_processing/text_normalization/sv/data/measure/unit.tsv b/nemo_text_processing/text_normalization/sv/data/measure/unit.tsv index c3522bf42..d40217315 100644 --- a/nemo_text_processing/text_normalization/sv/data/measure/unit.tsv +++ b/nemo_text_processing/text_normalization/sv/data/measure/unit.tsv @@ -149,7 +149,6 @@ zj zettajoule μs mikrosekund ω ohm msk matsked -cal kalori cl centiliter hpa hektopascal hPa hektopascal diff --git a/nemo_text_processing/text_normalization/sv/data/measure/unit_optional_dot.tsv b/nemo_text_processing/text_normalization/sv/data/measure/unit_optional_dot.tsv new file mode 100644 index 000000000..5ec5bf9f1 --- /dev/null +++ b/nemo_text_processing/text_normalization/sv/data/measure/unit_optional_dot.tsv @@ -0,0 +1 @@ +cal kalori diff --git a/nemo_text_processing/text_normalization/sv/data/measure/unit_plural.tsv b/nemo_text_processing/text_normalization/sv/data/measure/unit_plural.tsv index 32fd5509b..654dbc610 100644 --- a/nemo_text_processing/text_normalization/sv/data/measure/unit_plural.tsv +++ b/nemo_text_processing/text_normalization/sv/data/measure/unit_plural.tsv @@ -128,6 +128,7 @@ centigram centiliter hektopascal kilobit per sekund +kalori kalorier kilokalori per dag kilokalorier per dag kilokalori per gram kilokalorier per gram liter diff --git a/nemo_text_processing/text_normalization/sv/taggers/measure.py b/nemo_text_processing/text_normalization/sv/taggers/measure.py index 04a04927c..2668a757e 100644 --- a/nemo_text_processing/text_normalization/sv/taggers/measure.py +++ b/nemo_text_processing/text_normalization/sv/taggers/measure.py @@ -49,6 +49,8 @@ def __init__(self, cardinal: GraphFst, decimal: GraphFst, fraction: GraphFst, de cardinal_graph_en = cardinal.graph_en graph_unit = pynini.string_file(get_abs_path("data/measure/unit.tsv")) + graph_unit_optional_dot = pynini.string_file(get_abs_path("data/measure/unit_optional_dot.tsv")) + graph_unit |= graph_unit_optional_dot + pynini.closure(pynutil.delete("."), 0, 1) graph_unit_ett = pynini.string_file(get_abs_path("data/measure/unit_neuter.tsv")) graph_plurals = pynini.string_file(get_abs_path("data/measure/unit_plural.tsv")) greek_lower = pynini.string_file(get_abs_path("data/measure/greek_lower.tsv")) diff --git a/nemo_text_processing/text_normalization/sv/taggers/tokenize_and_classify.py b/nemo_text_processing/text_normalization/sv/taggers/tokenize_and_classify.py index ff2495524..ac980d61e 100644 --- a/nemo_text_processing/text_normalization/sv/taggers/tokenize_and_classify.py +++ b/nemo_text_processing/text_normalization/sv/taggers/tokenize_and_classify.py @@ -147,7 +147,7 @@ def __init__( | pynutil.add_weight(decimal_graph, 1.1) | pynutil.add_weight(measure_graph, 1.1) | pynutil.add_weight(cardinal_graph, 1.1) - | pynutil.add_weight(ordinal_graph, 1.1) + | pynutil.add_weight(ordinal_graph, 1.09) | pynutil.add_weight(money_graph, 1.1) | pynutil.add_weight(telephone_graph, 1.1) | pynutil.add_weight(electonic_graph, 1.1) diff --git a/tests/nemo_text_processing/sv/test_sparrowhawk_normalization.sh b/tests/nemo_text_processing/sv/test_sparrowhawk_normalization.sh index 49480ee6a..0f204bae9 100644 --- a/tests/nemo_text_processing/sv/test_sparrowhawk_normalization.sh +++ b/tests/nemo_text_processing/sv/test_sparrowhawk_normalization.sh @@ -15,7 +15,7 @@ runtest () { # trim white space spoken="$(echo -e "${spoken}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" - denorm_pred="$(echo -e "${denorm_pred}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" + denorm_pred="$(echo -e "${denorm_pred}" | sed -e 's/ / /g' -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" # input expected actual assertEquals "$written" "$spoken" "$denorm_pred"