# The cannibalization Ahrefs can't see

> Lexical tools compare words. But two pages compete by MEANING — even with no shared words. How we catch semantic cannibalization with embeddings: dup-scan…

_Source: https://seomatrix.ai/blog/semantic-cannibalization/ · Updated: 2026-06-26_

---

In short: classic anti-duplication tools compare **words**. But two pages can compete by **meaning** with no shared words (paraphrase), or one page can cover another's topic so deeply that it **pulls away** its citations. We catch this with embeddings.

## Where lexical goes blind

Shingles and word overlap find verbatim duplicates well. But:

- **Paraphrase** — same meaning, different words → lexical similarity ≈ 0, yet the competition for one intent is real.
- **Topical shadow** — page A targets query X, but its body covers topic Y so well that it starts competing with page B (the one built for Y) for Y's relevance.

Neither is visible to a tool that looks at string overlap.

## What we built — three semantic audits

All three measure closeness in **vector** space (provider-agnostic: Voyage / OpenAI / local embeddings; vectors are cached). You can check this free with the [How AI sees your page](/tools/ai-view/).

- **`dup-scan --semantic`** — page pairs with high cosine the lexical pass missed (paraphrase → MERGE/301).
- **`entity-shadow`** — latent cannibalization: A "shadows" B.
- **`link-equity --semantic`** — **siteRadius** (spread around the site centroid), semantic off-topic outliers, and **semantic-gap orphans** (a page far in meaning from all others).

## How entity-shadow works

What matters here isn't "similarity in general" but **direction**. For each page we embed its **PRIMARY** (target_keyword + title) and its **BODY** separately. Page **A shadows B** when:

1. `cosine(A.body, B.primary)` is high (A's body covers B's topic);
2. `cosine(A.primary, B.primary)` is low (A claims a different topic);
3. the **gap** between them is ≥ a threshold.

The gap is the signal: a long body vs a sharp keyword embeds to a moderate cosine, so absolute similarity doesn't discriminate — but the body-vs-keyword difference does.

> **Calibrated on real corpora** — The thresholds aren't eyeballed: on a live corpus (photography, 86 articles) cross-similarity topped out around 0.77, so we switched to gap-driven thresholds (cross ≥ 0.45, primary < 0.65, gap ≥ 0.10) → ~4 sensible pairs, ~5% noise.

## How it differs from a normal dup scan

- **dup-scan (lexical)** → verbatim / near-verbatim duplicates.
- **dup-scan --semantic** → paraphrase.
- **entity-shadow** → A claims topic X but steals topic Y's citations from B (not a duplicate at all).
- **cocoon intent-cannibalization** → two spokes split an intent by metadata.

## What to do with it

- Duplicate/paraphrase → merge (301) into the strongest version.
- Shadow → **differentiate**: narrow A's body to its topic X, and give Y's coverage to page B (and link to it).

## In short

- Lexical catches verbatim; meaning and "shadow" — no.
- Embeddings catch paraphrase (`dup-scan --semantic`) and latent cannibalization (`entity-shadow`).
- entity-shadow looks at the body-vs-keyword gap, not absolute similarity.
- Fix: duplicate → merge; shadow → differentiate.

## Sources

- seo·matrix's own semantic audits (`dup-scan --semantic`, `entity-shadow`, `link-equity --semantic`), calibrated on live corpora.
- Why meaning beats words for AI retrieval: answers are assembled from passages in embedding space — *US v. Google* (2025) on FastSearch/RankEmbed, and our [SEO vs GEO](/blog/seo-vs-geo-2026/) breakdown.

## FAQ

### How is semantic cannibalization different from the usual kind?

Lexical tools compare words. But two pages can compete by meaning even with no shared words — that's only visible in embedding space, not via keyword overlap.

### How do you detect it?

With three embedding-based audits: dup-scan (near-duplicates), entity-shadow (a page shadowing another's target entity) and siteRadius (how widely the site's topics spread around its center).

### What do you do with the pairs found?

Depending on the type — merge, clearly differentiate, or interlink. The report groups findings by action.

