Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

desacordo_ortografico

Detect and convert between Portuguese orthographies: the pre-1911 etymological writing, the Reforma de 1911, the Brazilian (1943 / 1971) and European (1945 / 1973) standards, and the Acordo Ortográfico de 1990, including the European and Brazilian sub-variants that AO1990 deliberately keeps distinct.

This is a single-purpose library. It does orthography detection and conversion, and nothing else.

  • Convert any text between seven orthographic norms along a graph of historical reforms, with AO1990 dual-form (facto/fato) handling.
  • Detect which orthography a text is written in: an explainable rule scorer, or two shipped zero-dependency learned classifiers (Naive Bayes / averaged perceptron).
  • Guard against sister varieties (Mirandese, Galician, Barranquenho) that look like Portuguese but are not.
  • A deterministic rule engine and curated, sourced exception lexicons. AO1990 word data is reused from tugalex.
  • A command-line tool and a parallel benchmark corpus, also published on the Hugging Face Hub.

Why it is not a single find-and-replace

Portuguese spelling is a (variant × era) matrix, not one timeline. Two official standards ran in parallel for most of the 20th century:

European / PALOP:  etymological → 1911 → 1945 → 1973 → AO1990 (PT)
Brazilian:         etymological → 1911 → 1943 → 1971 → AO1990 (BR)

AO1990 still admits divergent European/Brazilian spellings (facto/fato, António/Antônio, receção/recepção). A conversion is therefore a path through a graph of norms, applied edge by edge.

Some edges are clean regex rules (ph→f, trema abolition, the accent drops). Others are irreducibly lexical: which silent consonant drops, which form a norm prefers. Those are driven by curated, sourced data.

Install

pip install desacordo_ortografico    # pulls in tugalex

Use

from desacordo_ortografico import detect, convert, OrthographyConverter

# --- detection -----------------------------------------------------------
detect("a pharmacia do theatro").id          # 'etymological'
detect("o facto é óptimo").id                 # 'pt_1973'   (pre-AO1990, European)
detect("a idéia do vôo").id                   # 'br_1971'   (pre-AO1990, Brazilian)
detect("o Antônio é econômico").id            # 'ao1990-br'

# --- conversion ----------------------------------------------------------
convert("pharmacia", "etymological", "ao1990-br")          # 'farmácia'
convert("a acção directa", "pre-ao1990-pt", "ao1990-pt")   # 'a ação direta'
convert("freqüência", "pre-ao1990-br", "ao1990-br")        # 'frequência'
convert("facto", "ao1990-pt", "ao1990-br")                 # 'fato'

# --- the full result: warnings + dual-form alternatives ------------------
conv = OrthographyConverter()
res = conv.convert("o facto é óptimo", "ao1990-pt", "ao1990-br")
res.text            # 'o fato é óptimo'  (óptimo isn't a divergence, stays)
res.alternatives    # {'facto': ['facto', 'fato']}
conv.permitted_spellings("receção", "ao1990-pt")   # ['receção', 'recepção']

Detection: rules or a learned model

detect() defaults to an explainable rule scorer. Two zero-dependency learned models also ship: Naive Bayes and an averaged perceptron over character n-grams, sharing one sparse-dot-product scoring rule. They score higher on sentence-length text (~96% vs ~94% compatible accuracy, held-out 5-fold CV; see benchmark/):

detect("o Antônio era um génio econômico", method="nb")          # learned
detect("o Antônio era um génio econômico", method="perceptron")  # learned
detect("o Antônio era um génio econômico")                       # rules (default)

The guard runs first in every mode. Rule markers attach to a learned result for explainability.

Sister-language guard

Mirandese, Galician (especially reintegrationist), and Barranquenho look like Portuguese but are not. detect() recognizes and flags them rather than mangling them:

from desacordo_ortografico.guard import NotPortuguese
r = detect("umha cançom da naçom")
isinstance(r, NotPortuguese)   # True
r.name, r.convertible          # ('Galician', False)

CLI

desacordo detect "a pharmacia do theatro"
desacordo convert --from pre-ao1990-pt --to ao1990-pt "a acção directa"
desacordo convert --from ao1990-pt --to ao1990-br --variant br "o facto"
desacordo norms          # list the available orthographic norms

Norms

id reform who / when
etymological pre-1911 pseudo-etymological
reforma_1911 Reforma Ortográfica de 1911 Portugal, 1911
br_1943 Formulário Ortográfico de 1943 Brazil (ABL)
pt_1945 Convenção Luso-Brasileira de 1945 Portugal + PALOP
br_1971 accent mini-reform (Lei 5.765) Brazil, 1971
pt_1973 accent mini-reform (DL 32/73) Portugal, 1973
ao1990-pt / ao1990-br Acordo Ortográfico de 1990 all CPLP

See docs/orthographies.md for the rule sets and sources.

Reversibility

Forward conversion (toward newer norms) is well defined. Backward conversion is, for several edges, lexical and lossy. Dropping a silent consonant or an accent discards information no rule can recover. ConversionResult.lossless and .warnings report this instead of silently guessing.

Related projects

  • tugalex — the AO1990 word-map data this library reuses.

License

Apache-2.0.

Download files

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

Source Distribution

desacordo_ortografico-0.0.1a2.tar.gz (943.4 kB view details)

Uploaded Source

Built Distribution

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

desacordo_ortografico-0.0.1a2-py3-none-any.whl (952.6 kB view details)

Uploaded Python 3

File details

Details for the file desacordo_ortografico-0.0.1a2.tar.gz.

File metadata

  • Download URL: desacordo_ortografico-0.0.1a2.tar.gz
  • Upload date:
  • Size: 943.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for desacordo_ortografico-0.0.1a2.tar.gz
Algorithm Hash digest
SHA256 9334cb67ee52bd07b1ce10358fd8fc20012978088ae6a35755d9dc016020ccc9
MD5 acce33a39e83548bb81837a8eeeb4da9
BLAKE2b-256 503207de5719023a746a36517f29b6a8b961c9b2dc7289d8951f9ae77d72ad01

See more details on using hashes here.

File details

Details for the file desacordo_ortografico-0.0.1a2-py3-none-any.whl.

File metadata

File hashes

Hashes for desacordo_ortografico-0.0.1a2-py3-none-any.whl
Algorithm Hash digest
SHA256 62675fcb70495a65d783b78ac11ca285a341508e50b80942ef22961a852678f8
MD5 cf33d17978487835463be8748e071157
BLAKE2b-256 df52174400cd372cad40ffaaaef675528d459da92761d373655f5461cfbda13a

See more details on using hashes here.

Supported by

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