Generate n-grams from any text
Sliding-window over words or characters. Optional unique counts. Useful for NLP and feature extraction.
the quick 1 quick brown 1 brown fox 1 fox jumps 1 jumps over 1 over the 1 the lazy 1 lazy dog 1
How to generate n-grams
Slides a window of size n over the tokens (words or characters), emitting every contiguous run.
- 01
Paste text
Any string. Long docs work fine.
Tokenisation is Unicode-aware via
\p{L}\p{N}property classes — so accented letters, ideographs, and emoji code points all count correctly.textUTF-8Unicodecode pointsliveinput · textraw · UTF-8the quick brown fox…
loaded · UTF-8UTF-8 · ready - 02
Pick n + unit
n = 2 + words = bigrams. n = 3 + chars = trigrams of letters.
Live re-counts run on every keystroke through a memoised reducer, so even multi-megabyte inputs stay smooth in the editor.
modelivememoisedoptionssnappyn · options2 words · livebigrams
options applied · livelive - 03
With counts
Toggle to deduplicate and sort by frequency.
Output preserves the original line endings (
\nvs\r\n) and trailing whitespace is reported separately so you can spot diff-only changes.countline endingswhitespacediff-cleanreproducibleagg · countedfreq · readythe quick 1 quick brown 1
counted · livecounted - 04
Copy as TSV
Tab-separated 'gram\\tcount' — paste into a spreadsheet.
Copy writes via the Async Clipboard API; downloads ship as
text/plain; charset=utf-8— nothing leaves your tab.exportclipboardtext/plainblobclient-side✓ · copiedtsv · done✓ Copied
shipped · ready to shipsuccess
Text-processing fundamentals worth knowing
Tokenise with Unicode classes
Use \p{L}\p{N} with the u flag so accents, ideographs, and emoji count properly.
Normalise line endings
Convert \r\n to \n before diffing or hashing — Windows-vs-Unix endings produce phantom changes.
Mind invisible characters
Zero-width joiners, BOMs, and non-breaking spaces look identical to ASCII space. Strip them before comparison or storage.
Stream don’t slurp
For multi-megabyte text, iterate line-by-line rather than loading everything to memory — keeps the tab responsive.
Choose collation deliberately
Default JS sort is code-point order, not human alphabetical. Use Intl.Collator for locale-aware sorting.
Re-run after normalisation
NFC vs NFD changes byte length but not visible glyphs. String.prototype.normalize() before counts and comparisons.
When to extract n-grams
NLP, ML, linguistics, fuzzy matching.
Tokenization research
Inspect what bigrams a model would see. Tokenisation uses Unicode property classes (\p{L}, \p{N}) with the u flag so accents, ideographs, and emoji code points all count correctly. Surrogate-pair-aware counts mean 🚀 weighs 1, not 2.
Unicode-correctSpell-check features
Character trigrams power fuzzy match. Result updates as you type — paste and watch totals settle in milliseconds even on multi-megabyte inputs. Heavy work runs through a memoised reducer so the editor never janks.
diff-cleanLanguage ID
Character n-gram distributions detect language. Output normalises line endings to LF for clean diffs across platforms. Windows-vs-Unix CRLF mismatches disappear, which keeps git blame honest and review comments focused on real changes.
instant countsPhrase extraction
Word bigrams/trigrams surface common phrases. Code-point counts are stable across NFC/NFD normalisation. Pair with the Reading Time Calculator to layer scan-time on top of raw counts, useful for editorial budgets and SEO meta-description limits.
platform-awareEducation
Teach the basics of Markov chains. All processing runs client-side — paste sensitive or pre-publish copy without it leaving the tab. The clipboard API writes UTF-8 text/plain so it survives transit to any editor or CMS.
code-point-accurateAnti-plagiarism
Shared trigrams hint at copy-paste. Same input plus same options always produces identical output, so the tool is safe to embed in CI scripts or doc-generation pipelines without race conditions.
losslessFrequently asked questions
Something missing?
Tell us what you need. We ship the top requests every two weeks.