Word stemming for 33 languages — Snowball 3.0.1 compiled to WebAssembly.
Node.js · Browser · TypeScript · Zero dependencies.
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 |
|---|
npm install multilingual-stemmer
# pnpm add multilingual-stemmer
# yarn add multilingual-stemmerRequires Node.js ≥ 22. ESM only.
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.
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('бегущий'); // → 'бег'No setup, just call:
import { stem } from 'multilingual-stemmer';
stem('en', 'fruitlessly'); // → 'fruitless'
stem('ru', 'бегущий'); // → 'бег'
stem('de', 'laufenden'); // → 'lauf'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);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);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.
MIT — see LICENSE.
Based on rust-stemmers by CurrySoftware (MIT) and Snowball 3.0.1 (BSD-3-Clause).