Lee Foot

Keyword Topic Classifier

Classify keywords into hierarchical themes and subthemes using AI.

Launch the app → View the source

#about

Hierarchical theme/subtheme classification with a 0-1 confidence score per subtheme (copied to each keyword row in that subtheme).

Claude models: Sonnet 4.5, Sonnet 4, Haiku 4.5.

GPT models: gpt-4o-mini, gpt-4o, gpt-4.1.

OpenAI uses structured JSON schema validation.

Batch processing (10-50 keywords, default 30) with 1-second delays.

Streamlit appRequires an API key

Platform
Browser-based (no installation required)
Input
Anthropic or OpenAI API keyKeywords: comma/newline separated or CSV/ExcelOptional: grouping column for page-level analysis
Output
Keywords with theme, subtheme, and subtheme-level confidence (0-1). Expandable theme groups. CSV/Excel export.

Use cases

  • Content strategy planning
  • Topic clustering for pillar pages
  • Organising keyword research exports
  • Identifying content gaps by theme

#features

  • Claude Sonnet/Haiku and GPT-4o model options
  • Hierarchical theme + subtheme classification
  • 0-1 confidence scores assigned per subtheme
  • Configurable batch size (10-50, default 30)
  • Strict JSON schema enforcement on the OpenAI path
  • Optional URL/page grouping column

#how-to-use

  1. Select AI provider and model
  2. Configure batch size (higher = faster)
  3. Paste keywords or upload file
  4. Optionally group by URL column
  5. Review expandable theme sections with confidence

#faq

Why are my theme names inconsistent across the output?
Each batch is classified in a completely independent API call with no shared taxonomy, so the model may call the same topic 'Comparison' in one batch and 'Comparisons' in another. This is the main limitation for large lists: expect to normalise theme and subtheme names afterwards, or keep related keywords in the same batch by sorting your input first.
Why did my one-per-line keyword list get mangled in the Single Batch tab?
The Single Batch tab splits on commas if the input contains any comma at all, even when your keywords are one per line. A single keyword containing a comma flips the whole parse to comma mode. Remove commas from your list, or use the Bulk Classification tab where keywords come from a file column instead.
Some keywords are missing from the results. Why?
In bulk mode a failed batch is silently skipped: the tool moves on to the next batch without surfacing the error, so those keywords simply never appear in the output. There is also no check that the model returned every keyword it was sent. Always reconcile the output row count against your input before using the results.
Is the confidence score per keyword?
It is reported per subtheme, so every keyword in the same subtheme carries an identical score. It is also self-reported by the model rather than a calibrated probability, so use it for triage only.
How do the Claude and OpenAI paths differ in reliability?
The OpenAI path uses a strict JSON schema, so responses are structurally guaranteed. The Claude path relies on prompt instructions plus stripping of markdown code fences, so malformed JSON is possible and surfaces as a batch error. Both run batches with a 1 second delay between calls.
Does the bulk mode deduplicate my keywords?
Only when no grouping column is selected, in which case duplicates are removed before batching. If you group by a URL or page column, duplicates within and across groups are kept and each is classified (and billed) separately.

/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.