Skip to content

Compiling Dictionaries in Python

The Python package can compile a textual Radixor dictionary into the shared version 7 binary trie format. This moves dictionary parsing, patch-command generation, trie construction, reduction, and serialization out of application startup.

Use this workflow when the application owns its model file. Standard language aliases already load validated, precompiled .rxc resources from radixor-models-standard; they do not parse or compile textual dictionaries when a Stemmer is constructed.

Source format

The input is a plain UTF-8 or GZip-compressed UTF-8 tab-separated dictionary. The first column is the canonical stem and the remaining columns are its known surface forms:

run running runs    ran
cat cats

Remarks beginning with # or // are accepted. The complete syntax and normalization rules are documented on the shared Dictionary Format page.

Compile a model

import radixor

radixor.compile(
    "stemmer.tsv.gz",
    "english.rxc",
    language="en",
)

language is used to choose traversal direction when backward is omitted. Persian (fa), Hebrew (he), and Yiddish (yi) use forward traversal; the other bundled languages use backward traversal. For a custom language, select the direction explicitly:

radixor.compile(
    "custom.tsv",
    "custom.rxc",
    backward=True,
    store_original=True,
    lowercase=True,
)

The arguments are:

Argument Meaning
source Plain or GZip-compressed textual dictionary.
out_path Destination for the GZip-compressed version 7 trie.
language Optional alias or model ID used only to infer traversal direction.
backward Explicit traversal direction; overrides inference from language.
store_original Include a no-op mapping for every canonical stem. Defaults to True.
lowercase Record lowercase lookup normalization in the compiled metadata. Defaults to True.

Compilation refuses an input that is already a compiled trie. The destination is written by the native extension; the caller is responsible for choosing its location and for replacing an existing file only when that is intended.

Load the compiled model

from radixor import Stemmer

stemmer = Stemmer(compiled="english.rxc")
print(stemmer.stem("running"))

Stemmer(path=...) also auto-detects textual dictionaries and compiled version 7 streams, but compiled= communicates the deployment intent more clearly. Traversal direction, store_original, and lookup normalization are already stored in a compiled artifact; constructor build options do not rewrite them.

Java interoperability

Python and Java share the inner version 7 trie stream. A binary produced by radixor.compile(...) can be loaded by Java's StemmerPatchTrieLoader.loadBinaryCompiled(...), and Python can load a version 7 artifact written by StemmerPatchTrieBinaryIO.

The outer GZip bytes need not be identical because compressor implementations may differ. Interoperability applies to the decompressed version 7 stream and its persisted metadata.

Differences from the Java compiler

Python compilation intentionally exposes the production dominant-result configuration used by the Python runtime. Java additionally offers three selectable reduction modes, more normalization controls, incremental extension, and a CLI with explicit overwrite handling. Use Java CLI Compilation when those controls are required.

For normal Python use, compile once during preparation, deploy the resulting .rxc file as an application-owned asset, and reuse one loaded Stemmer at runtime.