Skip to content

MrRefactoring/multilingual-stemmer

Repository files navigation

multilingual-stemmer

Word stemming for 33 languagesSnowball 3.0.1 compiled to WebAssembly.
Node.js · Browser · TypeScript · Zero dependencies.

npm license node languages

Live Demo →


import { english, russian, german } from 'multilingual-stemmer';

english('fruitlessly'); // → 'fruitless'
russian('бегущий');     // → 'бег'
german('laufenden');    // → 'lauf'
⚡ Zero config 🌐 33 languages 📦 WASM — no native addons 🔷 TypeScript-first 🖥 Node + Browser

Install

npm install multilingual-stemmer
# pnpm add multilingual-stemmer
# yarn add multilingual-stemmer

Requires Node.js ≥ 22. ESM only.


Usage

Named exports — one function per language

The fastest way to get started. Import the language you need and call it directly.

import { english, russian, french, german, spanish } from 'multilingual-stemmer';

english('running');    // → 'run'
english('beautiful'); // → 'beauti'
french('mangeons');   // → 'mange'
spanish('corriendo'); // → 'corr'

Every function is lazy — the WASM stemmer is created on first call and cached automatically.

createStemmer(language) — reusable function

When you stem many words for the same language, create a stemmer once and reuse it:

import { createStemmer } from 'multilingual-stemmer';

const stem = createStemmer('en'); // ISO 639-1 code
const words = ['running', 'runs', 'runner', 'ran'];
words.map(stem); // → ['run', 'run', 'runner', 'ran']

Also accepts Languages enum values:

import { createStemmer, Languages } from 'multilingual-stemmer';

const stem = createStemmer(Languages.Russian);
stem('бегущий'); // → 'бег'

stem(language, word) — one-off

No setup, just call:

import { stem } from 'multilingual-stemmer';

stem('en', 'fruitlessly'); // → 'fruitless'
stem('ru', 'бегущий');     // → 'бег'
stem('de', 'laufenden');   // → 'lauf'

Browser

Works out of the box in Vite, webpack, and any modern bundler. The WASM binary loads automatically on import — no init() call needed.

import { english } from 'multilingual-stemmer';

// That's it. No setup, no init().
document.getElementById('result').textContent = english(inputWord);

TypeScript

Full types are included. The language parameter accepts either an ISO 639-1 string or the Languages enum — your choice.

import { stem, createStemmer, Languages } from 'multilingual-stemmer';
import type { IsoCode, Language } from 'multilingual-stemmer';

// Both are valid:
stem(Languages.English, 'running');
stem('en', 'running');

// Type-safe ISO codes:
const code: IsoCode = 'ru';
const stemFn: (word: string) => string = createStemmer(code);

Supported languages

Arabic Armenian Basque Catalan Czech Danish Dutch English Esperanto Estonian Finnish French German Greek Hindi Hungarian Indonesian Irish Italian Lithuanian Nepali Norwegian Persian Polish Portuguese Romanian Russian Serbian Spanish Swedish Tamil Turkish Yiddish


How it works

Stemming reduces a word to its root form, which is useful for search indexing, text analysis, and NLP pipelines. For example, running, runs, and runner all stem to run.

This package compiles the Snowball stemming algorithms (written in Rust via rust-stemmers) to WebAssembly. The WASM binary ships inside the npm package — no native addons, no build step, no external calls.


License

MIT — see LICENSE.

Based on rust-stemmers by CurrySoftware (MIT) and Snowball 3.0.1 (BSD-3-Clause).

About

Word stemming for 33 languages via Snowball 3.0 compiled to WebAssembly — English, Arabic, Russian, French, German, Spanish, Turkish and more. TypeScript-first, Node.js & browser, zero dependencies.

Topics

Resources

License

Contributing

Stars

7 stars

Watchers

1 watching

Forks

Packages

 
 
 

Contributors