Keyword and Text Analyzer
Text statistics (characters, words, sentences) and how many times each keyword appears — exact and partial occurrences. Everything is computed in your browser.
Text statistics
Characters with spaces:
Characters without spaces:
Words in text:
Sentences:
Results by keyword
| Keyword | Exact occurrences | Partial occurrences |
|---|
What the analyzer does
The analyzer counts the characters, words and sentences in a text and shows how many times each keyword from your list appears in it. Use it to check an SEO text before publishing: does it include every keyword from the brief, and is any repeated too often? You can also check a copywriter's text against the page's keyword set or check its length.
How to use
You can copy keywords straight from a spreadsheet column: each cell becomes a separate line. The tool trims spaces at the start and end of each line and skips empty lines. A phrase of several words takes one line and counts as one keyword.
A check takes three steps:
- Paste the text into the “Text to analyze” field.
- Enter words or phrases in the “Keywords (one per line)” field.
- Click “Analyze”.
The statistics and the table appear below the button. After changing the text or keywords, click “Analyze” again: the result does not update by itself.
How to read the results
The result has two blocks. “Text statistics” describes the text as a whole, and “Results by keyword” shows each keyword separately. Keywords are matched regardless of case, so “Repair” and “repair” are the same to the tool.
Text statistics
“Characters with spaces” counts every character, line breaks included. “Characters without spaces” drops all spaces, tabs and line breaks. “Words in text” counts fragments between spaces, so a standalone dash also counts as a word.
“Sentences” is the number of groups of ., ! and ?. Three dots in a row give one sentence, while dots in abbreviations or in a number like 2.5 add extra ones. A last sentence with no punctuation at the end is not counted.
Results by keyword
The table has two number columns. Rows are sorted by exact occurrences, and by partial occurrences when those are equal.
- Exact occurrences: the keyword stands as a separate word or phrase. There is no letter, digit or
_right before or after it, so the keyword “repair” matches “repair” but not “repairs”. - Partial occurrences: the keyword is found anywhere, including inside a longer word. Exact matches are included here too, so this number is never lower than the exact one.
A space in a phrase matches any number of spaces or a line break in the text. The row colour sums up both numbers.
A green row means there are exact occurrences. Yellow means the keyword appears only inside other words, like “repair” in “repairs”. Red means the keyword is not in the text.
Word boundaries here also work for Cyrillic and other scripts. The standard word boundary \b in JavaScript knows only Latin letters, digits and _, so it fails on Ukrainian text. Instead, the analyzer checks the neighbouring characters with the Unicode classes \p{L} (any letter) and \p{N} (any digit).
Limits
All counting happens in your browser, and the text and keywords are not sent anywhere. The analyzer matches letters and knows no grammar. If a word changes its stem, as in “mouse” and “mice”, there is not even a partial match. It does not account for synonyms either.
The tool does not show keyword density as a percentage. You can work it out yourself: divide the number of occurrences by “Words in text” and multiply by 100. Chasing a high density makes little sense, because Google's spam policies name filling a page with keywords to manipulate rankings (keyword stuffing) as a violation.
Sources
The word-matching rules follow the JavaScript documentation. The note on keyword stuffing comes from Google.
- MDN: Word boundary assertion: which characters
\btreats as word characters. - MDN: Unicode character class escape: how
\p{…}classes work. - Google Search Central: Spam policies, keyword stuffing: what Google means by it.