# Multilingual Stemmer

Stem words with Snowball algorithms in English, German, Spanish, French, Russian, Arabic and more. Browser-local text, stem list, mapping, table or JSON output.

## Run it

- **CLI:** `gizza tool multilingual-stemmer "The runners were running quickly. Studies studied studying."`
- **Web:** https://gizza.ai/tools/multilingual-stemmer/
- **Agents:** machine-readable descriptor (parameters JSON Schema) at https://gizza.ai/tools/multilingual-stemmer/tool.json

## Inputs

- `input` — Text to stem _(field)_
- `language` — Language _(field)_
- `output` — Output format _(field)_
- `min_length` — Minimum word length _(field)_
- `lowercase` — Lowercase before stemming _(field)_

## Output

- Stemmed output (text)

## Query parameters

Open the tool pre-filled and auto-run via URL:

- `input` — Text to stem
- `language` — Language
- `output` — Output format
- `min_length` — Minimum word length
- `lowercase` — Lowercase before stemming

Example: `https://gizza.ai/tools/multilingual-stemmer/?input=The%20runners%20were%20running%20quickly.%20Studies%20studied%20studying.&language=english&output=text&min_length=1&lowercase=true`

---

## About this tool

**Multilingual Stemmer** turns inflected words into Snowball stems for search, tagging,
keyword normalization and small corpus analysis. A stem is the reduced form used as an
index key: `running` becomes `run`, Spanish `corriendo` becomes `corr`, and German
`Häusern` becomes `haus`.

Choose the language that matches the text, then choose how you want the result:

- **Stemmed text** preserves punctuation, spacing and line breaks while replacing each word
  with its stem.
- **Unique stems** lists the vocabulary after stemming.
- **Form → stem mapping** shows how every distinct surface form was normalized.
- **Stem frequency table** counts each stem and the forms that collapsed into it.
- **JSON groups + stats** gives machine-readable stem groups for indexing pipelines.

Everything runs locally in WebAssembly. No text is uploaded.

### Worked example

Input:

```text
The runners were running quickly. Studies studied studying.
```

With language **English** and output **Stemmed text**, the result is:

```text
the runner were run quick. studi studi studi.
```

For a search index, switch to **JSON groups + stats** to get counts and surface forms per
stem. For an analyst checking a vocabulary cleanup, **Form → stem mapping** is usually the
most readable view.

### Languages

The tool uses Snowball stemming algorithms for Arabic, Danish, Dutch, English, Finnish,
French, German, Greek, Hungarian, Italian, Norwegian, Portuguese, Romanian, Russian,
Spanish, Swedish, Tamil and Turkish.

### Limits and edge cases

- Maximum input: **200,000 characters** per run.
- Stemming is language-specific. The wrong language still returns output, but the stems are
  not meaningful.
- Stems are **not lemmas** and may not be dictionary words: `studies → studi` is expected.
- The tokenizer treats Unicode letters and digits as words and keeps apostrophes inside
  contractions.
- Use **Minimum word length** to keep short abbreviations such as `AI`, `API` or product
  codes unchanged.

Also available from the gizza CLI and in chat.

## FAQ

<details>
<summary>Is stemming the same as lemmatization?</summary>

No. Stemming strips suffixes according to language rules and returns an index key, not a
dictionary word. `studies`, `studied` and `studying` all become `studi` in English. A
lemmatizer would try to return the dictionary lemma `study`, which usually requires a
larger language model or dictionary.

</details>

<details>
<summary>Which language should I choose for mixed-language text?</summary>

Choose the dominant language, or split the text first and run each language separately.
Snowball algorithms are language-specific: German suffix rules applied to Spanish text, or
English rules applied to Turkish text, can produce misleading stems even though the tool
will still run.

</details>

<details>
<summary>Why did capitalization change?</summary>

By default, words are lowercased before stemming because Snowball algorithms are defined
for lowercase input. This makes `Running` and `running` collapse to the same stem. Turn off
**Lowercase before stemming** only when case distinctions are part of the token you need to
preserve.

</details>

<details>
<summary>What output should I use for search indexing?</summary>

Use **JSON groups + stats** if a downstream program needs counts and source forms, or
**Unique stems** if you only need the vocabulary. Use **Stemmed text** when you want to
feed a normalized text stream into another simple text tool while keeping punctuation and
line breaks in place.

</details>

<details>
<summary>Will it handle a full book or a production corpus?</summary>

It is intended for pasted snippets, keyword lists and small batches, not full-corpus ETL.
The per-run cap is 200,000 characters so the browser and chat WebAssembly sandbox stay
responsive. For larger corpora, split the text into chunks or run a dedicated indexing
pipeline.

</details>

## Related tools

- [Extract Action Items from Meeting Notes](https://gizza.ai/tools/action-item-extractor/): Extract action items, owners, and decisions from meeting notes or daily notes with deterministic rules. Markdown checklist or JSON, private in-browser.
- [Add Line Numbers](https://gizza.ai/tools/add-line-numbers/): Add line numbers to every line of text online, like nl or cat -n — custom start, step, separator, and alignment. Free and private, runs in your browser.
- [ANSI Log Renderer](https://gizza.ai/tools/ansi-log-renderer/): Paste ANSI-colored terminal output or CI logs and render them as HTML, or strip escape codes to plain text. Handles 16-color, 256-color, and truecolor SGR codes.
- [API response diff](https://gizza.ai/tools/api-response-diff/): Compare two JSON API responses and see only the meaningful changes: ignore request ids, timestamps and UUIDs, match arrays by key or as sets, export a JSON Patch.
- [Rust AST Diff](https://gizza.ai/tools/ast-diff/): Compare two Rust source snippets structurally. The tool parses both files, canonicalizes their ASTs, and ignores formatting, whitespace, and comments.
