Free Word Frequency Counter
Count how often each word appears in your text. Visualise top words, export to CSV, and filter stop words.
Load .txt, .md, .csv, .docx or .pdf. Files are read on your device.
Common uses
- Analyse Keyword Density for SEOCheck how often your target keywords appear in an article and optimise keyword density.
- Analyse Word Repetition in Academic WritingIdentify overused words in essays, theses, and research papers to improve vocabulary variety.
- Analyse Frequency in Text CorporaUnderstand word distribution across speeches, books, datasets, and other large bodies of text.
- Analyse Competitor Content StrategyPaste a competitor's article or landing page to see what keywords and topics they emphasise.
- Check Text Readability and VocabularyIdentify whether your writing uses varied vocabulary or relies too heavily on repeated phrases.
How It Works
Word frequency analysis runs entirely in your browser using a hand-written tokenizer and a JavaScript Map — no library, no server. Text is parsed, counted, and ranked locally the moment you type or paste it.
- 1Unicode-aware tokenizationThe tool lowercases your text, then extracts tokens with the Unicode property regex \p{L}\p{M} — which correctly handles accented letters and non-Latin scripts. For CJK text (Chinese, Japanese, Korean), it switches to the browser's built-in Intl.Segmenter API with granularity: 'word' to split characters that have no spaces between them.
- 2Stop-word and length filteringOptional filtering strips common function words (the, a, is, and equivalents in Spanish, French, German, Italian, and Portuguese) using a hardcoded Set matched to your site locale. A minimum-length slider removes tokens shorter than your chosen threshold before counting begins.
- 3Map-based frequency counting and n-gram modeTokens are tallied in a JavaScript Map — chosen specifically so reserved property names like 'constructor' can't collide with counted words. In bigram or trigram mode, the tokenizer slides a window across the raw token stream and joins adjacent words into phrases before counting.
- 4Ranked results and CSV exportResults are sorted by count descending and displayed as a ranked bar chart. The export builds a plain-text CSV blob in memory using the browser's Blob API and triggers a download — nothing is sent to a server at any point.
Guide
Worked example
Press "Try a sample" above the empty "Text to analyse" box. It loads a 186-character paragraph about a fox and a dog, and the stats show 37 "Total words", 18 "Unique words" and 186 "Characters". On the "Words" tab the table headed "Top 18 words" ranks fox first with 4 uses (16.0%), then dog with 3 (12.0%), then quick and lazy with 2 each (8.0%). Fillers such as "the" and "a" are missing because "Exclude stop words" is ticked, which is why the note under the table says "Percentages are shares of the 25 items counted after filters." Set "Min count" to 2 and only those four rows remain. Then press "2-word phrases": with "Min count" still at 2, "lazy dog" and "the fox" remain, 2 uses each (5.6%), and the note now counts 36 items.
Which settings to use, and the limits
- Load a document or paste text. The "Load a text file" button opens .txt, .md, .csv, .log, .docx and .pdf files and replaces what is in the box. The page says "Files are read on your device." and the file is not uploaded; the first PDF or Word file only loads a reader component from this site. A PDF is read for its text layer, up to its first 400 pages, so a scanned PDF with no text fails. A .docx is read as plain text. While it works, the button says "Reading file…".
- Switch between words and phrases. The tabs "Words", "2-word phrases" and "3-word phrases" change what is counted. Phrases are built from the raw word stream, so "Exclude stop words" and "Min length" are greyed out and not applied, and a phrase can run across a full stop or line break: the sample gives "lazy dog the". "Min count", "Sort" and "Show top" still work. A word on your ignore list removes every phrase that contains it.
- Pick the stop-word language. Stop words are removed by default, using the list for "Page language", shown as "Page language (English)" on this page. The English list has 99 words. Seventeen lists are built in: English, Spanish, French, German, Italian, Portuguese, Turkish, Russian, Ukrainian, Persian, Arabic, Japanese, Polish, Dutch, Indonesian, Vietnamese and Hindi. For German text, choose German in the "Stop-word language" menu, or German filler words stay in the table. "(none)" turns the filter off. Add your own words in "Also ignore these words", separated by commas, semicolons, spaces or new lines.
- Tune the table with Min length, Min count and Show top. "Min length" runs from 1 to 5 chars and starts at 2 chars, so single letters are dropped; 4 chars would also drop "fox", "dog" and "ran" in the sample. "Min count" offers 1, 2, 3, 5 and 10, and "Show top" offers 10, 20, 50 and 100. "Sort" is "By count" or "Alphabetical". "Filter results…" narrows the rows to words containing what you type. The unique-word total and the percentages are worked out before "Min count" and "Show top", so those settings never change them.
- Decide what counts as a word. Words are runs of letters, digits and hyphens, so "well-known" is one word. "Keep apostrophes inside words (don't = 1 word)" is ticked by default; untick it and "don't" becomes "don" and "t". "Count numbers" is ticked by default; untick it to drop tokens made only of digits, such as 2024, while keeping "3D". "Case-sensitive" is off, so "Fox" and "fox" are one word; tick it and they separate, though stop words are still matched in any case. Chinese, Japanese, Korean, Thai, Lao, Khmer and Burmese text is split with the browser's word segmenter where it has one.
- Export the full list, not only the visible rows. "Export CSV" saves word-frequency.csv with the columns Word, Count and Percent for every row that passes your filters and "Min count", even if "Show top" hides it, and it opens in Excel with the right encoding. A word starting with =, + or @ gets a leading apostrophe so a spreadsheet does not run it as a formula. "Copy top 18" and "Copy all 18" copy tab-separated rows to paste into a sheet. "Chart (PNG)" saves word-frequency.png, a bar chart of up to 25 of the rows shown.
Common problems and how to fix them
- It says "Could not read that file. Please choose a text, Word (.docx) or PDF file that contains selectable text."
- One message covers four cases: the file holds no readable text (a scanned PDF or blank document), it is a binary file, the PDF reader failed, or the Word reader failed on a damaged .docx. A PDF that needs a password to open cannot be read, because there is no password box. Older phone browsers, including Samsung Internet, get a compatibility version of the PDF reader. If a PDF still fails, copy its text and paste it into the box.
- It says "report.doc is a DOC file, which this tool can't open." (with your own file name and format).
- The start of the file was recognised, and its type is not one this tool takes. Old Word .doc files, spreadsheets, presentations and images are refused this way before anything is read. Open the file in Word or another editor and save it as .docx, PDF or plain text, then load it again. A link such as "Try … instead." may appear beside the message when another tool on this site opens that type.
- "Total words" says 37, but the note under the table says "Percentages are shares of the 25 items counted after filters."
- "Total words" counts every word in the text. The percentages use only the items left after "Exclude stop words", "Min length" and "Also ignore these words" have been applied (25 of the 37 in the sample), before "Min count" and "Show top". On the phrase tabs the basis is the number of phrases, 36 for the 37-word sample. To count everything, untick "Exclude stop words" and set "Min length" to 1.
- A common word such as "the", or a short word such as "fox", is missing from the table.
- Three filters hide words. "Exclude stop words" is ticked by default and removes the list for the chosen language, which includes "the", "and", "with" and "not". "Min length" starts at 2 chars, and a higher setting hides short words. Words typed into "Also ignore these words" are removed too. Untick the stop-word box, set "Min length" to 1 and "Min count" to 1 to see every word, and pick the right stop-word language for non-English text.
- It says "No results match your filter."
- The "Filter results…" box shows only words that contain what you typed, in any case, and it searches the whole list, not only the visible rows. The message means no word contains that text, so clear the box or check the spelling; "fox" also finds "foxes". If no table appears at all while "Total words" is above zero, the options have removed every word: lower "Min count" or untick "Exclude stop words".
How it compares
A plain word counter gives totals for words and characters; this tool ranks how often each distinct word or short phrase occurs. It counts exact forms, so "dog" and "dogs" or "fox" and "foxes" are separate rows, because it does not reduce words to their stems. The stop-word lists are short fixed lists for 17 languages, not a full dictionary, so read the top rows before drawing conclusions. It works on one text at a time, counts phrases of up to 3 words, and shows at most 100 rows on screen, although the exports hold every row. For large collections of texts, a spreadsheet pivot table or a text-analysis program does more. In exchange, nothing needs installing and your file is read on your device.
Related Tools
Character Counter
Count characters, words, sentences, letters, digits, and special characters. Check against Twitter, Instagram, and other platform limits.
Word Counter
Count words, characters, sentences, and paragraphs. Estimate reading time.
Arabic Word Counter
Count words, characters, sentences and reading time in Arabic text — with full tashkeel (diacritic) and kashida handling and a right-to-left editor.