blog-cannibalization
ブログ記事の見出しやタイトルからキーワードを抽出し、意味が似たものをグループ化して、同じ検索意図で競合している記事を検出し、記事の統合や差別化を提案する、キーワードカニバリゼーション(キーワード重複)を解消するSkill。
📜 元の英語説明(参考)
Detect keyword cannibalization across blog posts by extracting primary keywords from titles and headings, clustering semantically similar targets, and flagging posts competing for the same search intent. Supports local-only mode (grep-based) and DataForSEO API mode (Page Intersection endpoint at ~$0.01/call). Outputs severity-scored report with merge or differentiate recommendations. Use when user says "cannibalization", "keyword overlap", "competing pages", "duplicate keywords", "cannibalize".
🇯🇵 日本人クリエイター向け解説
ブログ記事の見出しやタイトルからキーワードを抽出し、意味が似たものをグループ化して、同じ検索意図で競合している記事を検出し、記事の統合や差別化を提案する、キーワードカニバリゼーション(キーワード重複)を解消するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o blog-cannibalization.zip https://jpskill.com/download/10515.zip && unzip -o blog-cannibalization.zip && rm blog-cannibalization.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/10515.zip -OutFile "$d\blog-cannibalization.zip"; Expand-Archive "$d\blog-cannibalization.zip" -DestinationPath $d -Force; ri "$d\blog-cannibalization.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
blog-cannibalization.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
blog-cannibalizationフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
ブログカニバリゼーション - キーワード重複検出
複数のブログ記事が同じ検索キーワードで競合している場合を検出します。2つのモードがあります。 ローカルのみの分析(デフォルト)と、SERPレベルのデータのためのDataForSEO APIモードです。
2つのモード
| モード | フラグ | コスト | データソース |
|---|---|---|---|
| ローカル | (デフォルト) | 無料 | Grep/Readによるファイルコンテンツ分析 |
| API | --api |
約$0.01/コール | DataForSEO Page Intersection + Ranked Keywords |
ローカルモードはAPIキーなしで動作します。APIモードでは、DataForSEOの認証情報を環境変数 DATAFORSEO_LOGIN および DATAFORSEO_PASSWORD として設定する必要があります。
ローカルモードのワークフロー
ステップ1: ブログファイルをスキャン
Globを使用して、ターゲットディレクトリ内のすべてのコンテンツファイルを検索します。
- パターン:
**/*.md,**/*.mdx,**/*.html node_modules/,.git/,drafts/内のファイルはスキップ
ステップ2: 主要キーワードを抽出
各ファイルについて、キーワードシグナルを以下から読み取り、抽出します。
- Title tag または H1見出し (最も高い重み)
- H2見出し (中程度の重み)
- 最初の段落 (補助的なシグナル)
- Meta description (frontmatterに存在する場合)
主要キーワードの抽出方法:
- titleとH1を1-gram、2-gram、3-gramのフレーズにトークン化します
- title + H2 + 最初の段落全体での頻度によって各フレーズをスコアリングします
- 最もスコアの高い2〜3語のフレーズを主要キーワードとして選択します
- H2見出しから二次キーワードを記録します
ステップ3: 類似性によるクラスタリング
次のマッチングルール(優先順位順)を使用して、投稿をクラスタにグループ化します。
- 完全一致 - 2つ以上の投稿で同一の主要キーワード
- 語幹一致 - 同じ語根の単語(例: "optimize" vs "optimization")
- セマンティックな重複 - Claudeが2つのキーワードが同じ検索意図をターゲットにしていると判断した場合(例: "best CRM software" vs "top CRM tools 2026")
- 部分集合一致 - あるキーワードが別のキーワードを含んでいる場合(例: "email marketing" vs "email marketing for startups")
ステップ4: スコアリングとフラグ付け
2つ以上の投稿を含む各クラスタについて、重大度を評価し、推奨事項を生成します。
ステップ5: レポートを出力
結果の表とクラスタごとの推奨事項を表示します。
APIモードのワークフロー (DataForSEO)
--api フラグが必要です。WebFetchを使用してDataForSEOのエンドポイントを呼び出します。
使用されるエンドポイント
Page Intersection - 複数のURLがランク付けされているキーワードを検索します。
POST https://api.dataforseo.com/v3/dataforseo_labs/google/page_intersection/live
Authorization: Basic <base64(login:password)>
{
"pages": {
"1": "https://example.com/post-a",
"2": "https://example.com/post-b"
},
"language_code": "en",
"location_code": 2840
}
コスト: 1回の呼び出しあたり約$0.01。位置、ボリューム、CPCを含む重複するキーワードを返します。
Ranked Keywords - 単一のURLがランク付けされているすべてのキーワードを取得します。
POST https://api.dataforseo.com/v3/dataforseo_labs/google/ranked_keywords/live
{
"target": "https://example.com/post-a",
"language_code": "en",
"location_code": 2840
}
API分析の手順
- ユーザー(またはサイトマップ)から公開されているすべてのURLを収集します
- 各URLに対してRanked Keywordsを実行して、キーワードプロファイルを構築します
- キーワードクラスタを共有するURLペアに対してPage Intersectionを実行します
- 以下の式を使用して重大度を計算します
- 検索ボリュームとポジションデータを含む、エンリッチされたレポートを出力します
重大度スコアリング
重複シグナルに基づく4つの重大度レベル:
| レベル | 基準 | アクションの緊急度 |
|---|---|---|
| クリティカル | 同じ完全一致キーワード、両方のページが上位20位以内 | 直ちに |
| 高 | 同じキーワードクラスタ、一方のページが他方よりも上位にランク付けされている | 今週 |
| 中 | 部分的なSERPの重複がある関連キーワード | 今月 |
| 低 | セマンティックな類似性があるが、異なる確認済みの意図 | 監視 |
重大度計算式 (APIモード)
severity_score = overlap_count x avg_search_volume x (1 / position_gap)
ここで:
overlap_count= 共有ランキングキーワードの数avg_search_volume= 共有キーワードの平均月間ボリュームposition_gap= 平均ランキングポジションの絶対差 (最小1)
スコアが高いほど、カニバリゼーションの問題がより緊急であることを示します。
重大度ヒューリスティック (ローカルモード)
SERPデータがない場合は、簡略化されたスコアリングを使用します。
- クリティカル: 投稿間で主要キーワードが完全に一致
- 高: 主要キーワードで語幹が一致、または3つ以上の共有H2キーワード
- 中: 主要キーワードでセマンティックな重複
- 低: 部分集合一致のみ、または共有二次キーワード
出力形式
サマリーテーブル
| Post A | Post B | Shared Keywords | Severity | Recommendation |
|--------|--------|-----------------|----------|----------------|
| /best-crm-tools | /top-crm-software | best crm, crm tools, crm software | Critical | MERGE |
| /email-tips | /email-marketing-guide | email marketing | High | DIFFERENTIATE |
| /seo-basics | /seo-for-beginners | seo basics, beginner seo | Critical | CANONICAL |
| /react-hooks | /react-state-mgmt | react, state | Low | NO ACTION |
クラスタごとの詳細
フラグが立てられた各クラスタについて、以下を提供します。
- 両方の投稿のタイトルとURL
- 重複するキーワードの完全なリスト(APIモードの場合はボリューム付き)
- どちらの投稿がより強力か(より包括的で、より構造化されているか)
- 根拠に基づいた具体的な推奨事項
推奨事項
カニバリゼーションクラスタごとに可能な4つのアクション:
MERGE
両方のページが内容が薄いか、同様の深さで同じ意図をカバーしている場合。
- 両方からの最高のコンテンツを1つの包括的な投稿に結合します
- より弱いURLをマージされた投稿に301リダイレクトします
- いずれかのURLを指すすべての内部リンクを保持します
DIFFERENTIATE
ページが異なる意図を提供しているが、キーワードターゲティングが重複している場合。
- より弱い投稿の主要キーワードを関連するロングテールにシフトします
- 新しいフォーカスを反映するように、タイトル、H1、およびmeta descriptionを更新します
- 2つの投稿間に内部リンクを追加して、異なるトピックを示す
CANONICAL
一方の投稿が明らかに権威であり、もう一方がそれほど重要でない重複である場合。
- より弱いページに、権威のあるページを指す
rel="canonical"を追加します - より弱いページが一意の値を追加しない場合は、noindexを検討してください
- より弱いページから権威のあるページにリンクします
NO ACTION
意図が本物である場合
(原文がここで切り詰められています)
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Blog Cannibalization - Keyword Overlap Detection
Detect when multiple blog posts compete for the same search keywords. Two modes: local-only analysis (default) and DataForSEO API mode for SERP-level data.
Two Modes
| Mode | Flag | Cost | Data Source |
|---|---|---|---|
| Local | (default) | Free | File content analysis via Grep/Read |
| API | --api |
~$0.01/call | DataForSEO Page Intersection + Ranked Keywords |
Local mode works without any API keys. API mode requires DataForSEO credentials
set as environment variables: DATAFORSEO_LOGIN and DATAFORSEO_PASSWORD.
Local Mode Workflow
Step 1: Scan Blog Files
Use Glob to find all content files in the target directory:
- Patterns:
**/*.md,**/*.mdx,**/*.html - Skip files in
node_modules/,.git/,drafts/
Step 2: Extract Primary Keywords
For each file, read and extract keyword signals from:
- Title tag or H1 heading (highest weight)
- H2 headings (medium weight)
- First paragraph (supporting signal)
- Meta description if present in frontmatter
Primary keyword extraction method:
- Tokenize title and H1 into 1-gram, 2-gram, and 3-gram phrases
- Score each phrase by frequency across title + H2s + first paragraph
- Select the top-scoring 2-3 word phrase as the primary keyword
- Record secondary keywords from H2 headings
Step 3: Cluster by Similarity
Group posts into clusters using these matching rules (in priority order):
- Exact match - identical primary keyword across 2+ posts
- Stem match - same root word (e.g., "optimize" vs "optimization")
- Semantic overlap - Claude determines that two keywords target the same search intent (e.g., "best CRM software" vs "top CRM tools 2026")
- Subset match - one keyword contains another (e.g., "email marketing" vs "email marketing for startups")
Step 4: Score and Flag
For each cluster with 2+ posts, assess severity and generate a recommendation.
Step 5: Output Report
Display the results table and per-cluster recommendations.
API Mode Workflow (DataForSEO)
Requires the --api flag. Uses WebFetch to call DataForSEO endpoints.
Endpoints Used
Page Intersection - find keywords where multiple URLs rank:
POST https://api.dataforseo.com/v3/dataforseo_labs/google/page_intersection/live
Authorization: Basic <base64(login:password)>
{
"pages": {
"1": "https://example.com/post-a",
"2": "https://example.com/post-b"
},
"language_code": "en",
"location_code": 2840
}
Cost: ~$0.01 per call. Returns overlapping keywords with position, volume, CPC.
Ranked Keywords - get all keywords a single URL ranks for:
POST https://api.dataforseo.com/v3/dataforseo_labs/google/ranked_keywords/live
{
"target": "https://example.com/post-a",
"language_code": "en",
"location_code": 2840
}
API Analysis Steps
- Collect all published URLs from the user (or sitemap)
- Run Ranked Keywords for each URL to build keyword profiles
- Run Page Intersection for URL pairs that share keyword clusters
- Calculate severity using the formula below
- Output enriched report with search volume and position data
Severity Scoring
Four severity levels based on overlap signals:
| Level | Criteria | Action Urgency |
|---|---|---|
| Critical | Same exact keyword, both pages in top 20 | Immediate |
| High | Same keyword cluster, one page outranks the other | This week |
| Medium | Related keywords with partial SERP overlap | This month |
| Low | Semantic similarity but different confirmed intents | Monitor |
Severity Formula (API Mode)
severity_score = overlap_count x avg_search_volume x (1 / position_gap)
Where:
overlap_count= number of shared ranking keywordsavg_search_volume= mean monthly volume of shared keywordsposition_gap= absolute difference in average ranking position (min 1)
Higher score = more urgent cannibalization problem.
Severity Heuristic (Local Mode)
Without SERP data, use a simplified scoring:
- Critical: Exact primary keyword match between posts
- High: Stem match on primary keyword, or 3+ shared H2 keywords
- Medium: Semantic overlap on primary keyword
- Low: Subset match only, or shared secondary keywords
Output Format
Summary Table
| Post A | Post B | Shared Keywords | Severity | Recommendation |
|--------|--------|-----------------|----------|----------------|
| /best-crm-tools | /top-crm-software | best crm, crm tools, crm software | Critical | MERGE |
| /email-tips | /email-marketing-guide | email marketing | High | DIFFERENTIATE |
| /seo-basics | /seo-for-beginners | seo basics, beginner seo | Critical | CANONICAL |
| /react-hooks | /react-state-mgmt | react, state | Low | NO ACTION |
Per-Cluster Detail
For each flagged cluster, provide:
- Both post titles and URLs
- Full list of overlapping keywords (with volume if API mode)
- Which post is stronger (more comprehensive, better structured)
- Specific recommendation with rationale
Recommendations
Four possible actions for each cannibalization cluster:
MERGE
When both pages are thin or cover the same intent with similar depth.
- Combine the best content from both into one comprehensive post
- 301 redirect the weaker URL to the merged post
- Preserve all internal links pointing to either URL
DIFFERENTIATE
When pages serve different intents but keyword targeting overlaps.
- Shift the primary keyword of the weaker post to a related long-tail
- Update the title, H1, and meta description to reflect the new focus
- Add internal links between the two posts to signal distinct topics
CANONICAL
When one post is clearly the authority and the other is a lesser duplicate.
- Add
rel="canonical"on the weaker page pointing to the authority - Consider noindexing the weaker page if it adds no unique value
- Link from the weaker page to the authority page
NO ACTION
When intent is genuinely different despite surface-level keyword similarity.
- Document the reasoning for future audits
- Monitor rankings quarterly for any position changes
- Re-evaluate if either post drops in rankings
Error Handling
- No blog files found: If the directory contains no .md, .mdx, or .html files, report "No blog files found in [directory]" and suggest checking the path
- DataForSEO credentials missing: In API mode, if credentials are not configured, fall back to local mode automatically and notify the user
- API rate limits: DataForSEO has per-minute rate limits. If a 429 response is received, wait and retry once. If it persists, switch to local mode for remaining URLs
- WebFetch failures: If a source URL is unreachable, skip it and note "Unable to verify - source unavailable" in the report
- Single-post directory: If only one blog post exists, report "Cannibalization analysis requires at least 2 posts" and exit gracefully