import org.egothor.stemmer.StemmerPatchTrieLoader;
import org.egothor.stemmer.FrequencyTrie;
FrequencyTrie<CompiledPatchCommand> trie =
StemmerPatchTrieLoader.loadCompiled(
StemmerPatchTrieLoader.Language.US_UK, ...);
String word = "running";
CompiledPatchCommand patch = trie.get(word);
String stem = patch == null ? word : patch.apply(word);View Java docs →High-quality multilingual stemming.
Built for Java and Python.
Radixor learns word-to-stem transformations from lexical evidence, compiles them into compact tries of patch commands, and applies those transformations algorithmically at runtime. It combines deterministic results, small deployable models, and high throughput across 143 language defaults. The training dictionary supplies evidence—it does not define a closed runtime vocabulary.
Java reference agreement and Python runtime — Finnish case study
Radixor❄ Snowball Finnish Radixor advantageJava same-resource agreement: balanced accuracy and under-stemming use a Finnish model trained from the lexical resource that defines the reference relation. This is not independent external linguistic validation, and no Python quality evaluation is implied. Python runtime: PyO3 measured 6.73M words/s versus PyStemmer 3.1.0 at 5.36M words/s (1.26×), and Python-C measured 1.49×, all at batch size N=100.
from radixor import Stemmer
stemmer = Stemmer("en")
stems = stemmer.stem_batch([
"running", "studies", "better", "cars"
])View Python docs →Learned transformationsLexical evidence becomes
compact patch commands
Beyond the dictionaryRuntime is not a closed
word-to-lemma lookup
Native speedMulti-million words per
second in Python and Java
144 model artifactsOne architecture, trained
from language-specific data
Production readyDeterministic behavior
and reproducible evidence
A different stemming architecture.
Radixor combines learned patch commands, trie-based structural sharing, subtree reduction, and deterministic runtime application. It is neither a flat dictionary lookup nor another fixed suffix-rule table.