Keyword Density Checker

Count word and phrase frequency in text or HTML, with Korean, Japanese and Chinese word segmentation, stop words and a keyword placement checklist.

Runs in your browser

Density is a signal, not a target — Google has never published an ideal figure. Korean, Japanese and Chinese are counted by word, not by spaces.

Density is a signal, not a target. Google has never published an ideal figure — the placement checklist below matters more than any percentage.

Comma separated. Prefix a word with “-” to take it out of the built-in list (e.g. -the for “The Verge”).

Stop words are only hidden from the table. They stay in the word count, so no density changes when you toggle this.

What to look at

Share links carry the options and the target keywords, never the text itself.

What keyword density actually measures

Keyword density is one division: how many times a word appears, divided by how many words the text has. Nine mentions in a 318-word page is 2.83%. That is the whole formula, and it is why the number is easy to compute and hard to interpret.

For phrases the division is ambiguous, and tools quietly disagree. If a two-word phrase appears once in nine words, is that 1/8 (one of the eight possible two-word slots, 12.5%) or 2/9 (the two words it occupies, 22.2%)? This tool shows the second figure by default because it matches what people expect from the single-word number, and shows the first in the tooltip. When your figure differs from another tool, this is usually why.

Two more choices change the result: whether stop words stay in the denominator, and whether phrases may cross a sentence boundary. Here stop words always stay in the denominator — hiding them from the table never changes a density — and phrases never cross a full stop, because "copy. SEO" is not a phrase anyone wrote.

Is there an ideal keyword density?

No. Google has never published a target density, and no version of its documentation contains one. The "1–2% is ideal" figure that circulates in SEO advice has no source — it is a rule of thumb copied from tool to tool since the early 2000s, when search engines really did weight raw term frequency.

What Google's spam policies do describe is keyword stuffing: filling a page with repeated words or number lists, blocks of text listing cities a business is not in, or the same phrase repeated so that it reads unnaturally. The test in the policy is readability, not a percentage. A page can be at 6% and read perfectly if the topic genuinely requires the word, and a page can be at 1% and read like spam.

A frequently quoted "KeywordStuffingScore" from the 2024 leak of internal API documentation is an unofficial observation of a field name, not a published threshold. Treating it as a target would be inventing precision that does not exist.

  • Use the number the way this page suggests: as a prompt to reread the paragraphs where a word clusters, not as a dial to tune.

What to check instead of density

Placement beats frequency. A keyword mentioned three times — once in the title, once in the H1 and once in the opening paragraph — is a clearer signal than the same keyword mentioned fifteen times in the middle of a page. The target keyword panel above checks the placements that actually matter.

  • Title: the strongest single placement, and the line searchers read in the result. Put the keyword in the first half, where truncation cannot reach it.
  • H1: should agree with the title. Google often uses the H1 when it decides to rewrite a title link, so a mismatch is a risk in both directions.
  • First 100 words: readers decide there, and a snippet is often assembled from the opening when the meta description does not answer the query.
  • Subheadings, image alt text and the URL slug: worth one natural mention each. Alt text describes the image first; a keyword that does not describe the image belongs somewhere else.
  • Internal link anchors from other pages: the one placement that is not on this page at all, and often the most neglected.

N-grams: why phrases overlap

An n-gram is a window of n consecutive words slid one word at a time. In "new york city", the two-word windows are "new york" and "york city" — both counted once. That overlap is standard and intentional: the tool cannot know which pairing is the meaningful phrase, so it reports both and lets you read.

Two-word and three-word tables are usually more useful than the single-word table, because that is where topics live. A page about "keyword density" will show that phrase in the 2-gram table even if "keyword" and "density" separately look unremarkable, and a competitor's page often reveals its angle in its top 3-grams.

Windows never cross a sentence boundary here, so the last word of one sentence never pairs with the first word of the next. That makes the counts slightly lower than tools that ignore punctuation, and it makes them mean something.

Stop words: when to remove them and when not to

Stop words are the words that carry structure rather than topic: the, and, of, is in English; 이, 그, 것, 수, 있다 in Korean. They dominate any frequency table — "the" is usually the most common word in an English page by a wide margin — so hiding them makes the table readable. That is all the toggle does here: it hides rows. Densities are computed against the full word count either way, so a number never changes when you flip it.

Do not hide them when the stop word is part of what you are measuring. Brand names and titles are the usual case: "The Verge", "It's Nice That", "이것이 코딩테스트다". Add such words to the custom list in reverse — remove them from the stop words — or read the phrase tables, where a phrase is hidden only if every word in it is a stop word.

  • Korean stop word lists are shorter and blunter than English ones because Korean carries structure in particles attached to words rather than in separate words. That is what the particle option addresses, and it is a different problem from stop words.

Counting words in Korean, Japanese and Chinese

Splitting on spaces works for English and fails for CJK. Chinese and Japanese have no spaces between words at all, and Korean has spaces but attaches particles to the word: 검색을, 검색이, 검색은 are one concept in three forms. Tools that split on whitespace either report one giant "word" for a Chinese sentence or three separate entries for the same Korean noun.

This tool uses Intl.Segmenter, the word-segmentation API built into browsers, so Chinese and Japanese sentences are split into words with no library and no upload. Korean is segmented too, but the result depends on the browser's ICU version — some builds separate the particle, some do not. Rather than pretend otherwise, the tool counts by eojeol (the space-separated unit) and says so above the table.

The optional particle stripping cuts one trailing particle from each eojeol: the two-character forms 에서, 으로, 에게, 까지, 부터 first, then the one-character forms 은, 는, 이, 가, 을, 를, 의, 에, 와, 과, 도, 만. It refuses to cut when the stem would be a single character, and it runs once. It is a heuristic, not a morphological analyser: 있다 and 보다 end like particles and are left alone. Turn it on to merge 검색을 / 검색이 / 검색은 into 검색; turn it off when you care about the exact surface forms.

  • Density percentages mean something different in CJK: one Hangul syllable or one kanji carries more meaning than one Latin letter, so a Korean page of 600 syllables is comparable to an English page of 300 words. The reading-time estimate on this page follows that: characters per minute for CJK, words per minute for Latin.

Getting the body text out of an HTML page

Counting a whole HTML file counts your navigation, your footer, your cookie banner and your script tags. On a typical site that is 200 to 400 words of boilerplate repeated on every page, and it will move every density figure — often enough to make the real topic of the page look diluted.

The HTML tab here removes script, style, noscript, template, svg, iframe and canvas content, then removes nav, header, footer, aside and form. If the page has a <main> element it counts only that, otherwise the first <article>, otherwise the body. The tool tells you which one it used, so you can tell whether the page's markup was helpful or not.

  • A page that has no main, no article and a nav-heavy layout will still overcount. Wrapping your content in <main> fixes it for this tool, for screen readers, and for reader modes at the same time.
  • If you are comparing your page with a competitor's, extract both the same way. Comparing your clean body text with someone else's full page HTML produces numbers that mean nothing.

Keyword stuffing: what actually gets penalised

Google's spam policies name keyword stuffing directly and give examples: lists of phone numbers with no added value, blocks of text listing cities and regions a page is trying to rank for, and the same words or phrases repeated so often that the text reads unnaturally. The judgement is about the reading experience, and it applies to text hidden from users just as much as to visible text.

Modern search engines do not need repetition to understand a topic; they work with related terms, entities and the structure of the page. Repeating an exact phrase fifteen times mostly signals that the writer was optimising for a 2005 algorithm. Synonyms, related questions and concrete detail do the job that repetition used to attempt.

  • Hidden text is a separate and more serious problem: white text on a white background, text behind an image, text moved off-screen with CSS, and font-size: 0. All of it is explicitly listed under spam policies, and none of it is worth the risk.
  • The practical check is the one this page ends with: read the paragraphs where a keyword clusters. If a human reader would notice the repetition, so will the ranking systems — and so will the reader, who leaves.

How to use

  1. Paste your text, or paste a page's HTML into the HTML tab.
  2. The language is detected automatically; change it if needed — it switches both tokenisation and the stop word list.
  3. Check frequency and density on the 1-, 2- and 3-word tabs.
  4. Add up to five target keywords to see whether they appear in the title, H1, first 100 words and alt text.
  5. Copy or download the table as CSV if you need it.

FAQ

Why does my number differ from another keyword density tool?

Because the denominators differ. Four choices split the tools apart: whether a phrase density is counted by words or by slots, whether stop words are removed from the total, whether a phrase may cross a sentence boundary, and whether navigation and footer text are excluded from an HTML page. This tool states all four on screen and shows both phrase definitions side by side.

Should I aim for a specific percentage?

No. There is no target figure to hit — Google has never published one. Treat the table as a map of where words cluster: the action it suggests is "reread that paragraph", never "adjust the number".

Does “strip particles” work like a Korean morphological analyser?

No. It is a rule-based heuristic that cuts one trailing particle from an eojeol, once, and refuses to cut when the stem would be a single character. Words that merely end like a particle — 있다, 보다 — are left alone. If you need accurate morphology, use a dedicated analyser.

Is my text uploaded anywhere?

No. This tool makes no network request at all. The text is kept in this browser’s localStorage so it survives a refresh, and “Clear” deletes it immediately. A shared link carries the options and the target keywords, never the text.

Can I compare two pages?

Not in this version. Check each text on its own, download both tables as CSV and compare them in a spreadsheet — that is more flexible than a fixed side-by-side view right now. To compare two drafts sentence by sentence, use the text diff tool instead.

Related tools

More SEO & Web tools: SEO & Web

Send feedback

Found a bug or have an idea? Tell us — it helps make the tools better.

Only needed if you would like a reply.

Page: /seo/keyword-density-checker/