Skip to main content

PyPI - Version PyPI - Python Version PyPI - Downloads codecov

abbr2words

Multilingual, context-aware abbreviation expansion for text normalization and speech.

This standalone package was extracted from the abbreviation framework and language registries in kokorog2p. It has no runtime dependencies and uses a flat package layout (no src/ directory).

Supported languages

The registry follows the pinned current-master num2words key contract. It has 49 base keys:

am, ar, az, be, bn, ca, ce, cs, cy, da, de, en, eo, es, fa, fi, fr, he, hi, hu, hy, id, is, it, ja, kn, ko, kz, lt, lv, mn, nl, no, pl, pt, ro, ru, sk, sl, sr, sv, te, tet, tg, th, tr, uk, vi, and zh.

The 17 explicit locale overlays are en_GB, en_IN, en_NG, en_US, es_CO, es_CR, es_GT, es_MX, es_NI, es_VE, fr_BE, fr_CH, fr_DZ, pt_BR, zh_CN, zh_HK, and zh_TW.

Language resolution trims input, accepts hyphens and underscores, canonicalizes base/region casing, tries an exact locale first, then falls back to its base. Thus pt-BR resolves to pt_BR, fr_FR to fr, and en_GB to its explicit British-English overlay. eo and es_NI are explicit registry keys; eu is unsupported. Use base_language() when a caller needs the resolved base key.

Coverage is intentionally tiered rather than uniform:

  • Reviewed extended registries retain mature bespoke inventories for Czech, Dutch, English, French, German, Italian, Polish, Portuguese, Russian, Spanish, Swedish, and Turkish.
  • Reviewed baseline registries provide source-tagged references/titles, guarded numeric markers, localized neutral unit labels, and script-specific boundaries for the remaining base languages.
  • Locale overlays inherit their base and add structured numeric identities; they do not create ordinary-prose currency rewrites.

DATE is a bounded context mode for numeric evidence such as 5 Mar. 2026, not a date parser. Uncased scripts do not receive the Latin uppercase-name heuristic, and CJK lexical rules use explicit boundaries. CLDR 48.2.1 and BIPM are development/source inputs only; the installed package has no CLDR, Babel, spaCy, or network runtime dependency.

This is abbreviation and unit support. Optional num2words remains a separate number-verbalization component, and installed releases may support fewer keys than this registry. No num2words code or runtime dependency is copied here.

Installation

python -m pip install abbr2words

For development:

python -m pip install -e ".[dev]"
python -m build
pytest

API

from abbr2words import abbr2words

text = "Prof. Klein kommt ggf. am Fr."
print(abbr2words(text, lang="de"))
# Professor Klein kommt gegebenenfalls am Freitag

Context can be disabled:

abbr2words("Fr. Klein", lang="de", context=False)
# Freitag Klein

External linguistic annotations

abbr2words remains dependency-free. Applications that already tokenize and tag text can pass provider-neutral TokenAnnotation objects with character offsets and optional POS labels. spaCy is not installed or imported by abbr2words; see the external POS annotation guide and examples/spacy_pos.py. Bundled registries do not currently require POS labels; annotations are used by custom entries configured with POS guards. The provider-specific tag value is retained as metadata but is not currently evaluated.

Use an isolated mutable registry for project-specific entries:

from abbr2words import Expander

expander = Expander("de")
expander.add("KI", "Künstliche Intelligenz", case_sensitive=True)
print(expander("KI hilft."))

Consumers that need the shared language registry can use get_shared_expander() and reset_expanders(). Expander and get_expander() remain isolated mutable registries.

Command line

python -m abbr2words --lang de "Prof. Klein kommt ggf."
printf 'Prof. Klein kommt ggf.' | abbr2words --lang de

Scope

abbr2words expands registered abbreviations and a reviewed set of unit symbols when they occur after numeric quantities. It preserves numeric values and does not spell ordinary numbers, dates, or times, and does not perform unit conversion or currency realization. Unit support is not universal UCUM support. Use the public iter_unit_matches() API when a downstream semantic normalizer needs the original numeric lexeme, source span, and stable canonical quantity identity.

Reviewed initialisms that represent spelling are rendered with source graphemes, including German GmbH as G m b H and AG as A G. A small set of ambiguous one-letter unit symbols (B, A, and K) requires separation from the numeric value, so identifier-like forms such as 7B, 3A, and 5K remain available to downstream structured-code handling while 7 B, 3 A, and 300 K remain units. Use iter_unit_diagnostics() when a caller needs to distinguish an accepted unit claim from a compact candidate rejected by that policy.

English dotted forms are handled conservatively when a spelling can be either a semantic abbreviation or a person's initials. Uppercase dotted initialisms such as E.D. and F.C.S.C.J. fall back to source-letter spelling only when no registered rule wins; lowercase e.g. remains for example, while uppercase E.G. is letter-spelled. Single-letter compass forms expand to directions only with bounded address/street evidence, and D.C./L.A. remain letter-spelled in author names. This lexical layer does not parse dates, numbers, URLs, versions, or product identifiers; those belong to a downstream speech normalizer.

Unknown undotted uppercase initialisms are preserved by default. A downstream speech normalizer that has already reserved its structured spans can opt into a bounded residual fallback:

abbr2words("BBC News", initialism_mode="spell_undotted")
# "B B C News"

abbr2words(
    "BBC PDF",
    initialism_mode="spell_undotted",
    initialism_case="lower",
)
# "b b c p d f"

initialism_case (source, upper, or lower) controls rendering separately from detection. The fallback accepts only standalone ASCII uppercase tokens of two through eight letters, skips Roman-like and hyphenated identifier fragments, and leaves protected spans unchanged. Registered semantic entries continue to win; registered_initialism_mode="spell" is a separate opt-in that applies only to reviewed entries tagged for source spelling. The API is included in the planned v0.2.7 feature release; callers should require that release (or a newer compatible release) before using these options.

abbr2words recognizes and identifies quantity symbols; it does not decide how a complete numeric quantity is spoken. Number words, grammatical number, currency major/minor decomposition, and locale-specific spoken decimal policy belong to the consuming speech normalizer.

Structured currency identities are available in the reviewed quantity registry for Czech, English, French, Italian, Portuguese, and Spanish. The shared inventory also recognizes JPY, CHF, INR, KRW, and MXN. Czech recognizes /CZK as currency-czech-koruna; Portuguese also recognizes R$/BRL as currency-brazilian-real; English, French, Italian, and Spanish recognize the shared currency-euro, currency-us-dollar, and currency-pound-sterling identities for EUR/USD/GBP. In es_MX, unqualified $ resolves to currency-mexican-peso, while US$ and USD remain currency-us-dollar. These identities are numeric-context-only. These identities are recognized when a numeric value is adjacent in either prefix or suffix position:

from abbr2words import iter_unit_matches

match = next(iter_unit_matches("12,80 EUR", "it"))
match.value           # "12,80"
match.canonical_id    # "currency-euro"
match.canonical_symbol  # "€"

The match preserves the written numeric lexeme, symbol, and source-relative offsets. Currency names, number wording, singular/plural agreement, gender, cents, decimal realization, and arithmetic remain the responsibility of the downstream speech normalizer; standalone currency symbols and codes are not lexical rewrites. The reviewed shared inventory is limited to EUR/USD/GBP.

abbr2words("500 g", lang="en")
# "500 gram"

abbr2words("section g", lang="en")
# "section g"

Examples

The repository includes runnable examples for abbreviation-only expansion and for composing abbr2words with num2words:

python -m pip install "abbr2words[examples]"
python examples/abbreviations.py
python examples/full_text_demo.py --sample german

abbr2words itself expands abbreviations only. The optional examples show how to combine it with num2words for broader speech-text normalization, including output such as 500 g -> five hundred grams. The full-text demo is example code, not part of the stable public API. See examples/README.md for the complete command reference.

Versioning

The package version is derived from Git tags by setuptools-scm. Use tags in the form v<version>; the corresponding package version is generated automatically during builds. A checkout without tags falls back to 0+unknown.

For a release, commit the changes, create an annotated tag, and build from that tag:

git tag -a v<version> -m "Release <version>"
git push origin v<version>
python -m build

License

Apache License 2.0. See LICENSE and NOTICE.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

abbr2words-0.2.7.tar.gz (226.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

abbr2words-0.2.7-py3-none-any.whl (108.7 kB view details)

Uploaded Python 3

File details

Details for the file abbr2words-0.2.7.tar.gz.

File metadata

  • Download URL: abbr2words-0.2.7.tar.gz
  • Upload date:
  • Size: 226.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for abbr2words-0.2.7.tar.gz
Algorithm Hash digest
SHA256 2962bb5c1f8c35e383cc37df8bce9cd586e69fc5cbdb46ba0c3f7cb747e1a399
MD5 0629fd9d645580c146f7615f8fbbd124
BLAKE2b-256 8df99549a1e9b7be5e3232e9de556815a9cd84ccd6e640d24f3f817f170ddec3

See more details on using hashes here.

File details

Details for the file abbr2words-0.2.7-py3-none-any.whl.

File metadata

  • Download URL: abbr2words-0.2.7-py3-none-any.whl
  • Upload date:
  • Size: 108.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for abbr2words-0.2.7-py3-none-any.whl
Algorithm Hash digest
SHA256 fde5d399ba3e100337741b435a367ef742d1818764913945aa695d2fa765a328
MD5 451b1fa8484ce2e1130807ba44c9d29f
BLAKE2b-256 8072dc5d5fdc55e64bc99cfe584b6e3bebf90b988119e95734dd01b0d2140281

See more details on using hashes here.

Release history Release notifications | RSS feed

0.2.9

2 files

0.2.8

2 files

This release

0.2.7 This release

2 files

0.2.6

2 files

0.2.5

2 files

0.2.4

2 files

0.2.3

2 files

0.2.2

2 files

0.2.1

2 files

0.2.0

2 files

0.1.1

2 files

0.1.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page