Keyword Gap Analyser
Compare keyword lists to find gap opportunities with content matching.
#about
Set difference to identify competitor keywords you are missing.
TF-IDF vectorisation (sklearn, English stopwords, 10k max features) with cosine similarity for content matching.
Similarity threshold 0.1.
Lowercase normalisation.
Exact match prioritisation over semantic matches.
Streamlit app
- Platform
- Browser-based (no installation required)
- Input
- Your keyword export (CSV/Excel)Competitor keyword export (same format)Optional: Content data with URL, text, H1 columns
- Output
- Gap keywords with volume, competitor URLs, best-matching page URL, match type, and H1 tag.
- Category
- Keyword Research
Use cases
- Finding competitor keywords you are missing
- Identifying content opportunities
- Matching gaps to existing pages for optimisation
- Competitive analysis for content strategy
#features
- Set difference gap identification
- TF-IDF + cosine similarity content matching
- Exact match prioritisation
- Minimum search volume filtering
- H1 heading relevance in matches
#how-to-use
- Upload your keyword data
- Upload competitor keyword data
- Optionally add content for page matching
- Map columns and set volume filter
- Review gaps with match type (exact/semantic)
#faq
- Does it need any API keys or make any web requests?
- No. The whole analysis runs offline on the files you upload: your keyword export, the competitor's export (from Ahrefs, SEMrush or similar), and an optional content file. Nothing is crawled or fetched.
- Why are near-identical keywords showing up as gaps?
- The gap calculation is an exact set difference after lowercasing, with no stemming or fuzzy matching. 'llc formation' and 'llc formations' are treated as different keywords, so plural and word-order variants of terms you already rank for will appear as gaps. Expect to skim the output for these rather than treating every row as a genuine miss.
- What should the optional content file contain?
- One row per page with a URL column and a column holding the page text, plus optionally an H1 column; a Screaming Frog crawl with a content extraction works well. The tool lowercases the text, indexes words longer than two characters, and builds a TF-IDF matrix (English stopwords, 10,000 max features) from it.
- What is the difference between an exact and a semantic match?
- An exact match means the gap keyword appears verbatim as a substring of a page's content, with an H1 relevance score of 1.0 if it also appears in the H1. A semantic match is a TF-IDF cosine similarity above 0.1 when no exact match exists on that page. Exact matches always outrank semantic ones, and only the single best match is written to the best_match_url column even though up to three are computed.
- My competitor file has the same keyword on several rows. Which one is used?
- Only the first matching row: its volume and URL are taken and the rest are ignored. If your export has one row per keyword per URL, pre-aggregate it (for example keep the top-ranking row) so the volume and competitor_url columns reflect the row you care about.
/contact
Want me to run this for you? I run this tool as a managed service, or build something custom around your data. You get the insights without touching the code.