← 업무 목록

작업로그.md

작업 로그 — 상시 레퍼런스 개선 (t_b4a69d98)

작업자: 김서연 (퍼포먼스팀) / 2026-09-17


A. 분류 정확도 개선

왜 바꿨나

대표님 지적 그대로다. 단백질저당 85건이 한 덩어리라 단백질 광고와 저당 광고가

섞여 있고, 식품 134건 안에도 단백질 신호가 40건 더 있었다. 카테고리 필터를 눌러도

원하는 레퍼런스가 안 나오는 구조였다.

먼저 원본 데이터를 직접 세어봤다:

  • 513건 중 236건(46%)이 본문 텍스트 15자 미만instagram.com, {{product.name}},
  • smartstore.naver.com 같은 도메인·템플릿 잔재뿐이다.

  • 본문만으로는 절반이 판정 불가. 그렇다고 수집 키워드만 믿으면 키워드 검색으로
  • 긁혀 들어온 무관 브랜드가 그대로 통과한다.

    무엇을 만들었나

    새 파일 dashboard/refs_classify.py — pull_refs.py와 pull_refs_new.py가 공유하는 분류기.

    분류 로직을 두 스크립트에 복붙하면 나중에 반드시 어긋나서 분리했다.

    판정 규칙:

    1. 신호를 강/약으로 분리한다.

    - 강신호 = 페이지명 + 본문 텍스트 (실제 그 광고가 말하는 내용)

    - 약신호 = 수집 키워드 (검색어일 뿐, 그 제품이라는 보장 없음)

    2. 강신호가 있으면 강신호로 판정. 없을 때만 키워드로 폴백.

    한쪽만 강신호로 잡히고 다른 쪽이 키워드에 있으면 보강(예: 본문 "고단백" + 키워드 "저당" → 단백질+저당).

    3. 결과: 단백질 / 저당 / 단백질+저당 / 식품 4분할.

    뷰티·건강기능식품은 원본 유지 (재분류 대상 아님).

    신뢰도 등급(conf)을 같이 붙였다.

    키워드로만 판정했는데 본문에 확인 근거가 전혀 없으면 low.

    "광고 라이브러리 키워드 검색에 걸렸다"는 사실만 있고 실제 그 제품인지 확인이 안 된 건이다.

    대시보드는 low를 기본 목록에서 빼고 접이식 섹션으로 따로 보여준다 — 52건이 여기 들어갔다.

    추측으로 카테고리를 확정하지 않으려고 만든 등급이다.

    무관 브랜드 필터.

    페이지명·본문에 패션/잡화 신호(가디건, fashion, jewel, 가구, 쇼핑몰 등)가 있고

    식품·뷰티·건기식 신호가 하나도 없으면 excluded=True.

    중요: 지우지 않았다. 지시대로 excluded 플래그만 붙이고 JSON에는 전부 남겼다.

    대시보드 ①레퍼런스 탭 하단에 무관 브랜드로 제외 표시된 광고 8건 (오검출 검수용 — 지운 것 아님)

    접이식 목록으로 전부 노출한다. 페이지명·제외 사유·본문 발췌·원본 링크가 다 들어있어

    대표님이 오검출을 바로 확인하실 수 있다.

    실행 결과 (실측)

    레퍼런스 513건 / 이미지 신규복사 0장 / 주차 18회
      카테고리: {'건강기능식품': 125, '단백질': 88, '식품': 84,
                 '저당': 38, '뷰티': 168, '단백질+저당': 2}
      제외표시(excluded): 8건
    

    기존 단백질저당 85 / 식품 134단백질 88 / 저당 38 / 단백질+저당 2 / 식품 84.

    단백질 88건은 기존 85건 덩어리에서 나온 게 아니라 식품 안에 묻혀 있던 것까지 끌어올린 수치다.

    제외 표시된 8건 전량 (직접 확인):

    원카테고리페이지본문사유
    식품sso_urj[24SS🤍][기획]클레버 베이직 라운드 가디건 (10 color)가디건
    식품sso_urj(동일, 변형)가디건
    식품Jewelzz Fashion MarketJewelzz Fashion Marketfashion, jewel
    식품My fashion blog Coyunjewelzz.shopfashion, jewel
    식품My fashion blog CoyunMy fashion blog Coyunfashion
    식품My fashion blog Coyun(동일, 변형)fashion
    식품나산가구나산가구가구
    뷰티쇼핑몰후기{{product.name}}쇼핑몰

    대표님이 지목하신 Jewelzz Fashion Market, My fashion blog Coyun 둘 다 잡혔다.

    전부 키워드 오트밀로 긁혀 들어온 건이었다.

    오검출 후보 1건 지적해둔다: 쇼핑몰후기(뷰티)는 본문이 {{product.name}} 템플릿 잔재라

    판정 근거가 없는데 페이지명의 "쇼핑몰"만 걸렸다. 실제 화장품 광고일 수 있다. 확인 필요.

    기존 동작 안 깨졌는지

    pull_refs.pybuild.py 전체 파이프라인 실행해서 확인했다. 정상 생성.

    build.pycat == "단백질저당" 하드코딩으로 '우리 카테고리'를 세고 있어서

    4분할 후 0이 되는 버그가 있었다. ("단백질","저당","단백질+저당","단백질저당")으로 고쳤다.

    cats 필터 버튼도 excluded 건을 제외한 카테고리만 뽑도록 수정.


    B. 신규 소재 트랙 신설

    왜 별도 트랙인가

    기존 수집기는 start_date < 오늘-90일을 통과한 광고만 남긴다. 구조상 신규 소재가 들어올 수 없다.

    "오래 살아남음 = 검증됨"은 뼈대 레퍼런스로는 맞는 기준이지만,

    "지금 뭐가 도는가"는 정의상 못 잡는다. 필터 조건이 정반대라 같은 스크립트로 못 한다.

    무엇을 만들었나

    dashboard/pull_refs_new.py — 30일 이내 시작 광고 전용 수집기.

  • 저장 경로 완전 분리: data/ad_library_new/ads_new30_YYYYMMDD.json.
  • 기존 data/ad_library/ 는 읽지도 쓰지도 않는다. 3개월+ 트랙 건드리지 않았다.

  • 파서(extract_start_date, extract_text 등)는 기존 scrape_meta_ads.py에서
  • 소스 파싱으로 함수부만 뽑아 재사용. Apify 필드명 추출 로직을 복붙하면 어긋나서 그렇게 했다.

    (모듈 통째 import는 안 된다 — import 시점에 토큰 체크가 돌아 죽는다)

  • 키워드는 우리 소구 직결 12개로 좁혔다: 저당·무설탕·제로슈가·고단백·단백질간식·프로틴바·
  • 프로틴쿠키·단백질쉐이크·단백질빵·다이어트간식·식단관리·저칼로리.

    뷰티·건기식은 이 트랙에서 뺐다. 목적이 '우리 카테고리 후킹 추적'이고 예산이 주 $5다.

  • --budget 옵션으로 상한. 누적 비용이 넘으면 남은 키워드를 건너뛴다.
  • --dry-run: API 호출 없이 저장분만 재정리 (후킹 추출 로직 고칠 때 재수집 비용 0).
  • 후킹 추출

    수집 광고의 첫 문장을 뽑아 유형 분류한다. 여기서 한 번 실패하고 고쳤다:

    1차 시도 — 후킹 209건 추출 성공으로 나왔는데, 실제로 열어보니

    wishier.com, idea-nutrition.com, brand.naver.com 같은 도메인만 있는 게 대부분이었다.

    숫자만 보고 성공했다고 보고했으면 거짓 보고가 될 뻔했다.

    수정 — 도메인만 있는 줄, {{ }} 템플릿 잔재, 본문이 페이지명과 동일한 건,

    한글이 하나도 없는 건을 전부 제외. 209건 → 106건 (고유 문구 59개).

    숫자는 줄었지만 이게 실제 문구다.

    유형 분류: 질문형 / 수치제시형 / 부정형 / 긴급·희소형 / 대화체·밈 / 단순선언형.

    실행 결과 (실측, 실제 API 호출)

    전체 수집 559건 → 30일 이내 263건 → 중복제거 244건
    카테고리: 단백질 106 / 식품 70 / 저당 58 / 단백질+저당 10
    후킹 추출: 106건 / 고유 문구 59개
    비용: $0.79  (상한 $4 설정, 예산 주 $5 이내)
    

    트랙 신설이 값을 하는지 확인: 신규 트랙 광고주 100개 중

    86개는 3개월+ 트랙에 없던 브랜드다 (교집합 14개). 다른 모집단을 실제로 잡고 있다.

    먼저 --quick(키워드당 5건, $0.0)으로 파이프라인부터 검증하고 본 수집을 돌렸다.


    C. 후킹·밈 리포트

    ~/Hermes/소재기획/20260917/후킹_밈_리포트.md

    문장 구조 6유형 분류 + 유형별 실제 사례 전량 + 브랜드별 집행 패턴 +

    플로에 적용 가능/불가 구분 + 확인 불가 항목 명시.

    가장 중요한 부분만 여기 옮긴다:

    이번 수집 최다 빈도 문구는 차용 금지 대상이다.

    【내과 원장도 경악】 식후 혈당 뚝! / 【식후 혈당이 뚝?!】 대한가정의학회 전문의 인증 천연 보약

    계열이 21회로 압도적 1위인데, 이건 유행이 아니다.

    집행 계정이 Clarizoclar04, Radiizoradi963 같은 무작위 영문+숫자 페이지명이다.

    단기 운영 후 폐기하는 소각형 계정 패턴이고, 일반식품이 혈당·질병 효능을 말한 건

    식품표시광고법 위반이다. 플로에는 절대 쓰면 안 된다.

    빈도 순으로만 리포트했으면 이걸 1순위 추천으로 올릴 뻔했다.

    적용 1순위: 고단백 22g 단백질 쉐이크 당류 ZERO (식단 천재) 식의 양면 수치 제시.

    플로에 패키지 앞면에 단백질/당류 수치가 이미 인쇄돼 있어 그대로 헤드로 올릴 수 있고,

    저당·고단백이라는 우리 카테고리 본질과 정확히 맞는다.

    밈은 확인되지 않았다. 고유 문구 59개 중 대화체·밈 3개(5%)뿐이고 그나마 구어체에 가깝다.

    영상·이미지 내부 자막은 이번 수집 범위 밖이라 거기 밈이 있을 수 있으나

    이 방법으로는 확인 불가. "밈이 유행이다"라고 쓰지 않았다.


    변경·추가 파일

    파일상태
    dashboard/refs_classify.py신규 — 공용 분류기
    dashboard/pull_refs.py수정 — 분류기 연결, excluded/conf/tags 필드 추가
    dashboard/pull_refs_new.py신규 — 30일 이내 수집기
    dashboard/build.py수정 — 4분할 카테고리 대응, 제외·저신뢰 검수 섹션 2개 추가
    dashboard/refs_new.json신규 산출물
    data/ad_library_new/ads_new30_20260917.json신규 산출물 (기존 폴더와 분리)
    소재기획/20260917/후킹_밈_리포트.md신규
    data/ad_library/ads_3mplus_*.json무변경

    광고 계정은 읽기만 했다. 생성·수정·on/off 일절 없음.


    다음 회차 운영

    주 1회 python3 pull_refs_new.py (약 $0.8) + pull_refs.py + build.py.

    1회차라 비교 대상이 없다. 2주 뒤 생존 문구를 봐야 비로소 초기 검증 신호가 나온다.