Community코딩 & 개발github.com

블로그 콘텐츠 잠식 - 키워드 중복 감지

여러 블로그 게시물이 동일한 검색 키워드를 놓고 경쟁하는 것을 감지합니다. 로컬 전용 분석(기본값)과 DataForSEO API를 사용한 SERP 수준 데이터 분석의 두 가지 모드를 지원합니다.

블로그 콘텐츠 잠식 - 키워드 중복 감지란 무엇인가요?

이 스킬은 블로그 콘텐츠 잠식(Keyword Cannibalization) 문제를 식별하고 해결하기 위한 것입니다. 로컬 모드에서는 파일 내용 분석(Glob, Grep, Read)을 통해 게시물 간 키워드 중복을 무료로 감지합니다. API 모드에서는 DataForSEO의 Page Intersection 및 Ranked Keywords API를 호출하여 실제 검색 결과 페이지(SERP) 데이터(검색량, 순위, CPC)를 기반으로 심각도를 계산합니다. Claude Code, Cursor, Codex 등 AI 에이전트와 함께 사용하도록 설계되었으며, 최종적으로 표 형식의 요약 보고서와 병합(MERGE), 차별화(DIFFERENTIATE), 표준 URL 설정(CANONICAL), 조치 불필요(NO ACTION) 등 구체적인 권장 사항을 제공합니다.

지원 대상✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/AgriciDaniel/claude-blog/tree/main/skills/blog-cannibalization

Installed? Explore more 코딩 & 개발 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

블로그 콘텐츠 잠식 - 키워드 중복 감지은(는) 무엇을 하나요?

여러 블로그 게시물이 동일한 검색 키워드를 놓고 경쟁하는 것을 감지합니다. 두 가지 모드: 로컬 전용 분석(기본값) 및 DataForSEO API를 사용한 SERP 수준 데이터 분석.

두 가지 모드

모드플래그비용데이터 소스
로컬(기본값)무료Grep/Read를 통한 파일 내용 분석
API--api호출당 ~$0.01DataForSEO Page Intersection + Ranked Keywords

로컬 모드는 API 키 없이 작동합니다. API 모드는 DataForSEO 자격 증명을 환경 변수로 설정해야 합니다: DATAFORSEO_LOGIN 및 DATAFORSEO_PASSWORD.

로컬 모드 워크플로우

1단계: 블로그 파일 스캔

Glob을 사용하여 대상 디렉토리에서 모든 콘텐츠 파일을 찾습니다:

  • 패턴: **/*.md, **/*.mdx, **/*.html
  • node_modules/, .git/, drafts/ 디렉토리는 건너뜁니다

2단계: 기본 키워드 추출

각 파일에 대해 다음에서 키워드 신호를 읽고 추출합니다:

  • 제목 태그 또는 H1 제목 (가장 높은 가중치)
  • H2 제목 (중간 가중치)
  • 첫 번째 문단 (보조 신호)
  • 메타 설명 (frontmatter에 있는 경우)

기본 키워드 추출 방법:

  1. 제목과 H1을 1-gram, 2-gram 및 3-gram 구문으로 토큰화
  2. 제목 + H2 + 첫 번째 문단에서 각 구문의 빈도수로 점수 계산
  3. 가장 높은 점수를 받은 2-3단어 구문을 기본 키워드로 선택
  4. H2 제목에서 보조 키워드 기록

3단계: 유사성 기준 클러스터링

다음 일치 규칙(우선순위 순)을 사용하여 게시물을 그룹화합니다:

  1. 정확히 일치 - 2개 이상의 게시물에서 동일한 기본 키워드
  2. 어간 일치 - 동일한 어근 단어 (예: "최적화" vs "최적화하다")
  3. 의미적 중복 - Claude가 두 키워드가 동일한 검색 의도를 대상으로 한다고 판단 (예: "최고의 CRM 소프트웨어" vs "2026년 최고의 CRM 도구")
  4. 부분 집합 일치 - 하나의 키워드가 다른 키워드를 포함 (예: "이메일 마케팅" vs "스타트업을 위한 이메일 마케팅")

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
}

비용: 호출당 ~$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 분석 단계

  1. 사용자(또는 사이트맵)로부터 게시된 모든 URL 수집
  2. 각 URL에 대해 Ranked Keywords 실행하여 키워드 프로필 구축
  3. 키워드 클러스터를 공유하는 URL 쌍에 대해 Page Intersection 실행
  4. 아래 공식을 사용하여 심각도 계산
  5. 검색량 및 순위 데이터가 포함된 강화된 보고서 출력

심각도 점수 계산

중복 신호를 기반으로 한 네 가지 심각도 수준:

수준기준조치 시급성
심각동일한 정확 키워드, 두 페이지 모두 상위 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 키워드
  • 중간: 기본 키워드 의미적 중복
  • 낮음: 부분 집합 일치만 있거나 보조 키워드 공유

출력 형식

요약 테이블

| 게시물 A | 게시물 B | 공유 키워드 | 심각도 | 권장 사항 |
|--------|--------|-----------------|----------|----------------|
| /best-crm-tools | /top-crm-software | best crm, crm tools, crm software | 심각 | 병합(MERGE) |
| /email-tips | /email-marketing-guide | email marketing | 높음 | 차별화(DIFFERENTIATE) |
| /seo-basics | /seo-for-beginners | seo basics, beginner seo | 심각 | 표준 URL(CANONICAL) |
| /react-hooks | /react-state-mgmt | react, state | 낮음 | 조치 불필요(NO ACTION) |

클러스터별 상세 정보

플래그가 지정된 각 클러스터에 대해 다음을 제공:

  • 두 게시물의 제목과 URL
  • 중복 키워드의 전체 목록 (API 모드인 경우 검색량 포함)
  • 어떤 게시물이 더 강력한지 (더 포괄적이고 구조가 좋은지)
  • 근거가 포함된 구체적인 권장 사항

권장 사항

각 콘텐츠 잠식 클러스터에 대해 네 가지 가능한 조치:

병합(MERGE)

두 페이지가 모두 내용이 부족하거나 동일한 의도를 유사한 깊이로 다루는 경우.

  • 두 게시물의 가장 좋은 콘텐츠를 하나의 포괄적인 게시물로 결합
  • 약한 URL을 병합된 게시물로 301 리디렉션
  • 두 URL을 가리키는 모든 내부 링크 유지

차별화(DIFFERENTIATE)

페이지가 다른 의도를 제공하지만 키워드 타겟팅이 중복되는 경우.

  • 약한 게시물의 기본 키워드를 관련 롱테일 키워드로 변경
  • 제목, H1 및 메타 설명을 업데이트하여 새로운 초점 반영
  • 두 게시물 사이에 내부 링크를 추가하여 주제가 다름을 표시

표준 URL(CANONICAL)

한 게시물이 명확히 권위적이고 다른 게시물이 덜 중요한 복제본인 경우.

  • 약한 페이지에 권위 페이지를 가리키는 rel="canonical" 추가
  • 약한 페이지가 고유한 가치를 추가하지 않으면 noindexing 고려
  • 약한 페이지에서 권위 페이지로 링크

조치 불필요(NO ACTION)

의도가 표면적인 키워드 유사성에도 불구하고 실제로 다른 경우.

  • 향후 감사를 위한 근거 문서화
  • 순위 변동이 있는지 분기별로 순위 모니터링
  • 게시물 중 하나의 순위가 떨어지면 재평가

오류 처리

  • 블로그 파일 없음: 디렉토리에 .md, .mdx 또는 .html 파일이 없는 경우 "[디렉토리]에 블로그 파일이 없습니다"라고 보고하고 경로 확인을 제안
  • DataForSEO 자격 증명 누락: API 모드에서 자격 증명이 구성되지 않은 경우 자동으로 로컬 모드로 전환하고 사용자에게 알림
  • API 속도 제한: DataForSEO에는 분당 속도 제한이 있습니다. 429 응답을 받으면 대기했다가 한 번 재시도합니다. 문제가 지속되면 나머지 URL에 대해 로컬 모드로 전환
  • WebFetch 실패: 소스 URL에 도달할 수 없으면 건너뛰고 보고서에 "확인 불가 - 소스를 사용할 수 없음"이라고 표시
  • 단일 게시물 디렉토리: 블로그 게시물이 하나만 있는 경우 "콘텐츠 잠식 분석에는 최소 2개의 게시물이 필요합니다"라고 보고하고 정상 종료

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

관련 스킬