multilingual-stemmer
v2.1.1
Published
Word stemming for 34 languages (English, Arabic, Russian, French, German, Spanish, Turkish and more) via Snowball algorithms compiled to WebAssembly. TypeScript-first · Node.js · Browser · Zero dependencies.
Downloads
1,872
Maintainers
Readme
import { english, russian, german } from 'multilingual-stemmer';
english('fruitlessly'); // → 'fruitless'
russian('бегущий'); // → 'бег'
german('laufenden'); // → 'lauf'| ⚡ Zero config | 🌐 34 languages | 📦 WASM — no native addons | 🔷 TypeScript-first | 🖥 Node + Browser | |:-:|:-:|:-:|:-:|:-:|
Install
npm install multilingual-stemmer
# pnpm add multilingual-stemmer
# yarn add multilingual-stemmerRequires 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
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.1.1 (BSD-3-Clause).
