NLP-Powered Keyword Extraction

Extract high-value keyword candidates from any HTML page using Readability parsing, POS tagging, and frequency analysis.

Get Started

Features

📝

Article Extraction

Mozilla Readability strips boilerplate (nav, ads, sidebars) to isolate the main article content for accurate analysis.

✍

NLP POS Tagging

compromise identifies nouns, proper nouns, and noun phrases. Multi-word phrases like "search engine optimization" are detected automatically.

📈

Frequency Ranking

Candidates scored against a 50,000-word English frequency corpus. Uncommon terms rank higher as stronger SEO targets.

⚡

Content-Aware Caching

Results cached by domain + content MD5. Same content returns instantly from cache, regardless of when it was last fetched.

🔌

WordPress Integration

Companion plugin auto-extracts keywords on publish and assigns them as taxonomy terms for internal linking and SEO.

🛠

REST API

Simple POST endpoint accepts raw HTML and returns structured keyword candidates with stats. Integrate with any CMS or pipeline.

How It Works

1

Submit HTML

POST raw HTML to the extraction endpoint, optionally with the source URL for domain-based caching.

2

Parse & Extract

Readability isolates article text. compromise tokenizes and tags parts of speech. Stopwords and short terms are filtered out.

3

Rank & Deduplicate

Terms scored by inverse frequency (rare = better SEO target). Duplicates merged by lowercase root form.

4

Return Candidates

Structured JSON response with each candidate's term, rank, phrase status, and extraction stats.

API Reference

Single-endpoint extraction — send HTML, receive keywords.

POST /api/extract
Content-Type: application/json

{
  "html": "<html>...</html>",
  "url": "https://dealer.example.com/specials"
}

Response:
{
  "title": "Summer Service Specials",
  "candidates": [
    { "term": "oil change", "rank": 12400, "isPhrase": true },
    { "term": "brake inspection", "rank": 28000, "isPhrase": true }
  ],
  "stats": { "raw": 145, "filtered": 38, "candidates": 12 },
  "cached": false
}