Skip to content
RADIXOR
Dictionary-trained. Not dictionary-bound.

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.

Choose your runtime
Learned transformationsTrie + compact patch commands
GeneralizesNot restricted to listed word forms
ReproduciblePublic quality and speed evidence

Java reference agreement and Python runtime — Finnish case study

Radixor❄ Snowball Finnish Radixor advantage
Balanced accuracyJava quality evaluation · higher is better0.980.74+33.11% higher
◌Under-stemmingJava quality evaluation · lower is better3.03%52.03%94.17% lower
Python PyO3 speedbatch N=100 · higher ratio is faster1.26× vs PyStemmer1.00× PyStemmer baseline1.26× faster

Java 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.

144 models · 143 language pages
Adygheady-default★★★★☆Afrikaansaf-za-default★★★★★Aimeleail-default★★☆☆☆Akanaka-default★★☆☆☆Albaniansq-al-default★★★☆☆Alsatiangsw-default★★☆☆☆Amharicam-et-default★★★★☆Amuzgoazg-default★★★☆☆Ancient Greekgrc-default★★★★☆Anglo-Normanxno-default★☆☆☆☆Arabicar-default★★★★★Armenianhy-am-default★★★★★Ashaninkacni-default★★★☆☆Assameseas-in-default★★★★★Asturianast-default★★★★☆Aymaraaym-default★★★★★Azerbaijaniaz-az-default★★★☆☆Bashkirbak-default★★★☆☆Belarusianbe-by-default★★★★☆Bengalibn-bd-default★★☆☆☆Bininj Kun-wokgup-default★☆☆☆☆Brajbra-default★★☆☆☆Bretonbre-default★★☆☆☆Bulgarianbg-bg-default★★★★☆Catalanca-es-default★★★★★Cebuanoceb-default★☆☆☆☆Chichewany-mw-default★★★☆☆Chichicapan Zapoteczpv-default★★☆☆☆Chukchickt-default★☆☆☆☆Church Slavonicchu-default★★☆☆☆Classical Armenianxcl-default★★★★☆Classical Syriacsyc-default★★★★☆Congo Swahiliswc-default★★★☆☆Copala Triquicpa-default★★☆☆☆Cornishcor-default★☆☆☆☆Creecre-default★★☆☆☆Crimean Tatarcrh-default★★★☆☆Czechcs-cz-default★★★★☆Dakotadak-default★★★☆☆Danishda-dk-default★★★★☆Dutchnl-nl-default★★★★☆Eastern Chatinocly-default★★☆☆☆Egyptian Arabicarz-default★★★★☆Englishus-uk-default★★★★★Estonianet-ee-default★★★★☆Evenkievn-default★★★☆☆Faroesefo-fo-default★★★★☆Finnishfi-fi-default★★★★★Frenchfr-fr-default★★★★★Friulianfur-default★★★☆☆Gagaa-default★☆☆☆☆Galolengal-default★★★★☆Germande-de-default★★★★★Gothicgot-default★★★★★Greekel-gr-default★★★★★Gulf Arabicafb-default★★★★☆Haidahai-default★★★☆☆Hebrewhe-il-default★★★★☆Hiligaynonhil-default★☆☆☆☆Hsilimohsi-default★☆☆☆☆Hungarianhu-hu-default★★★★★Icelandicis-is-default★★★★☆Indonesianid-id-default★★★★☆Ingrianizh-default★★☆☆☆Irishga-ie-default★★★★☆Italianit-it-default★★★★★Itelmenitl-default★★★☆☆Japaneseja-jp-default★★★☆☆Kabardiankbd-default★★☆☆☆Kalaallisutkl-gl-default★☆☆☆☆Kannadakn-in-default★★★☆☆Kareliankrl-default★☆☆☆☆Kashubiancsb-default★☆☆☆☆Kazakhkk-kz-default★★★★☆Khakaskjh-default★★☆☆☆Khalingklr-default★★★★☆Kodikod-default★☆☆☆☆Kongokon-default★☆☆☆☆Kyrgyzky-kg-default★★☆☆☆Ladinlld-default★★★☆☆Latinla-default★★★★★Latvianlv-lv-default★★★★★Lingalalin-default★☆☆☆☆Lithuanianlt-lt-default★★★★☆Livonianliv-default★★☆☆☆Low Germannds-default★★☆☆☆Lower Sorbiandsb-default★★★☆☆Lugandalg-ug-default★★★☆☆Macedonianmk-mk-default★★★★★Magahimag-default★★☆☆☆Malagasymg-mg-default★☆☆☆☆Maltesemt-mt-default★★☆☆☆Manxgv-im-default★☆☆☆☆Maorimi-nz-default★☆☆☆☆Mapudungunarn-default★☆☆☆☆Middle Frenchfrm-default★★★★☆Middle High Germangmh-default★☆☆☆☆Middle Low Germangml-default★☆☆☆☆Mongolianmn-mn-default★★★★☆Murrinh-Pathamwf-default★☆☆☆☆Navajonav-default★★★☆☆Neapolitannap-default★★☆☆☆North Frisianfrr-default★☆☆☆☆Northern Samisme-default★★★★☆Norwegian Bokmålnb-no-default★★★★★Norwegian Nynorsknn-no-default★★★★☆Old Englishang-default★★★★☆Old Frenchfro-default★★★★★Old High Germangoh-default★★★☆☆Old Irishsga-default★★☆☆☆Old Norsenon-default★★★★☆Old Saxonosx-default★★★☆☆Oodhamood-default★★☆☆☆Otomi (ote)ote-default★★★☆☆Pashtops-af-default★★☆☆☆Persianfa-ir-default★★★☆☆Polishpl-pl-unimorph + pl-pl-polimorf★★★★★Portuguesept-pt-default★★★★★Quechuaque-default★★★★★Romanianro-ro-default★★★★☆Russianru-ru-default★★★★★Senecasee-default★★★☆☆Serbo-Croatianhbs-default★★★★★Shipibo-Coniboshp-default★★★☆☆Shonasn-zw-default★★☆☆☆Sotho, Southernst-za-default★☆☆☆☆Southern Kurdishsdh-default★☆☆☆☆Spanishes-es-default★★★★★Swedishsv-se-default★★★★★Tagalogtl-ph-default★★☆☆☆Turkishtr-tr-default★★★★★Ukrainianuk-ua-default★★★★☆Uyghurug-cn-default★★★☆☆Uzbekuz-uz-default★★★☆☆Vorovro-default★☆☆☆☆Western Highland Chatinoctp-default★★☆☆☆Xibesjo-default★★★☆☆Yanesha’ame-default★★☆☆☆Yiddishyi-default★★★☆☆Yoloxóchitl Mixtecxty-default★★☆☆☆Zarmadje-default★☆☆☆☆Zenzontepec Chatinoczn-default★★☆☆☆Zuluzu-za-default★★★★☆
♨Java
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 →
PyPython
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.

Technology & lineage ▣  Read the Docs
23 benchmark-only dictionariesNot distributed or installable; license evidence unresolved