← All posts

The cannibalization Ahrefs can't see

· 3 min read · By Mikhail Kuzmitskii

productsemanticscannibalization

View as Markdown ↗

The cannibalization Ahrefs can't see

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.

  • dup-scan --semantic — page pairs with high cosine the lexical pass missed (paraphrase → MERGE/301).
  • entity-shadow — latent cannibalization: A “shadows” B.
  • link-equity --semanticsiteRadius (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.

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

Was this helpful?
Launch SEO/GEO with seo·matrix → or a request without Telegram →

Comments

Comments are moderated.