음악 위키 편 두 번째 · 에이전트 하네스 시리즈 중 하나입니다.
⚠ 먼저 밝혀둡니다. 이 글은 "커버곡을 자동 판별했다"는 글이 아닙니다. 자동 판별이 틀린 실측에서 출발해, 규칙이 추정한 것과 조회로 확인한 것을 서로 다른 파일에 담고, 확인된 사실이 추정을 마지막에 덮어쓰게 만든 기록입니다. 그리고 귀속이라는 것이 원곡/커버 두 칸으로는 안 담긴다는 것을 실제 사례로 보입니다. 수치는 귀속 대장 파일에서 왔습니다.
1. 시작은 "제목에 표기가 없는 커버"였습니다
음악 위키에서 곡의 귀속 — 이 곡이 이 아티스트의 원곡인가, 남의 곡을 부른 것인가 — 은 페이지의 뼈대 정보입니다. 처음에는 제목 규약으로 추정했습니다. 제목에 커버 표기가 있으면 커버, 없으면 원곡. 대부분의 채널이 규약을 지키니 대체로 맞습니다.
그런데 실측에서 뒤집혔습니다. 최유리의 잘 지내자, 우리는 짙은의 원곡을 부른 커버인데 제목에 아무 표기가 없어 규칙이 원곡으로 판정했습니다. 이것이 웹 조회 중 우연히 드러났고, 그 순간 규칙의 판정 전체가 의심 대상이 됐습니다. 표기 없는 커버가 하나 있다면 더 있을 수 있고, 규칙은 그것을 영원히 못 잡습니다.
채널마다 규약이 다르다는 것도 확인됐습니다. 대시 규약이 반대인 채널이 있었고, 공연명을 원곡자 자리로 읽은 오류도 있었습니다. 규칙은 채널 수만큼 예외를 만납니다.
2. 그래서 이번에 정한 질문 하나
"규칙을 더 정교하게"가 아니었습니다. 질문은 이것이었습니다. 추정과 사실이 한 파일에 섞이면 무엇이 무너지는가. 섞이면 셋이 무너집니다. 어느 값이 확인된 것인지 알 수 없게 되고, 파이프라인을 다시 돌리면 확인된 값이 추정으로 되덮이고, "이 파일에 없으면 커버가 아니다"라는 거짓 추론이 생깁니다. 그래서 답은 분리였습니다 — 규칙의 추정은 파이프라인 안에, 조회로 확인한 사실은 별도 대장에.
3. 사용한 개념과 도구 — 추정 위에 사실을 덮는 순서
밖에서 보면 이 시스템에 들어오는 것은 영상 제목·설명란과 웹 조회 결과이고, 나가는 것은 곡마다 귀속·근거 등급이 달린 카탈로그입니다. 순서가 이 설계의 전부입니다 — 규칙이 먼저 전 곡을 추정하고, 검증 대장이 마지막에 그 위를 덮어씁니다.
추정 영상 제목·설명란 → 제목 규약 파싱 → 귀속 추정값 → 규약이 맞는 채널인가
조회 의 심 항목 → 웹 조회로 확인 → 대장에 기재 → 출처가 확인됐는가
덮기 추정값+대장 → 대장이 추정을 덮어씀 → 최종 귀속 → 등급이 달렸는가
잔여 덮이지 않은 곡 → 확인필요 표시 유지 → 사람 확인 대기 → 공백이 정직한가값마다 근거 등급이 붙습니다. 조회로 확인한 것은 web_verified, 제목·설명란에 명시가 있는 것은 explicit_credit, 그 외는 규약 추정입니다. web_verified는 사람이 직접 본 것(human_observed)보다 낮고 단순 선언(declared)보다 높은 자리로, 낮춰 부르지도 올려 부르지도 않기로 대장 머리에 적었습니다.
4. 실제로 만든 것 — 기능 세 개와, 그 기능이 막는 실패
① 추정과 사실을 딴 파일로 갈랐다 — 확인된 귀속과 추정이 구별 불가로 섞이는 것을 막는다
규칙 파서의 추정은 카탈로그에만 존재하고, 웹 조회로 확인한 귀속은 별도의 원곡 귀속 대장에만 적습니다. 대장의 각 항목에는 영상 식별자, 귀속, 원곡자, 작곡자, 그리고 왜 그렇게 판정했는지의 메모가 붙습니다. 파일이 다르면 출처가 섞일 길이 없고, 대장이 비어 있다는 것이 "커버가 없다"는 뜻이 아니라는 경고도 대장 머리에 명시했습니다.
② 대장이 파이프라인의 마지막에 덮어쓰게 했다 — 재실행이 교정을 지우는 것을 막는다
파이프라인은 언제든 다시 돌 수 있습니다. 교정을 카탈로그에 손으로 고쳐 넣으면 다음 실행이 그것을 추정값으로 되덮습니다. 그래서 덮어쓰기를 파이프라인의 마지막 단계로 넣었습니다 — 매 실행마다 규칙이 먼저 추정하고, 대장이 그 위를 덮습니다. 교정이 실행 횟수와 무관하게 살아남고, 확인이 끝난 곡의 확인필요 표시도 함께 지 워집니다. 사실이 추정을 이기는 순서를 코드가 아니라 실행 순서가 보장합니다.
③ 귀속 어휘를 두 칸에서 네 칸으로 넓혔다 — 작곡자 본인의 연주가 커버로 적히는 것을 막는다
원곡/커버 두 칸으로 시작했다가 실제 사례에서 깨졌습니다. 사랑은 하니까는 최유리가 작사·작곡·프로듀싱해 홍이삭이 발표한 곡이고, 그것을 최유리가 부른 영상입니다. 커버로 적으면 귀속이 뒤집힙니다 — 자기 곡을 자기가 부른 것이기 때문입니다. 그래서 "타인이 발표한 자작곡의 본인 연주"를 별도 어휘로 두었습니다. 밤양갱은 원곡 가수(비비)와 작곡자(장기하)를 다른 칸에 적어야 했고, 메들리는 원곡이 여럿이라 또 다른 어휘가 필요했습니다. 어휘가 모자라면 정확한 사실이 틀린 칸에 적힙니다.
5. 지금까지 관찰된 결과 (실측 · 명령을 같이 적습니다)
귀속 대장의 계수입니다. 항목 수는 대장 파일의 식별자 줄 계수로 확인했습니다 (wc -l 계열 패턴 계수).
잘 지내자, 우리)밤양갱 등)읽는 방향이 중요한 값이 하나 있습니다. 권진아 카탈로그의 original 73건은 검증된 원곡 73곡이 아니라 추정의 기본값입니다. 무표기 커버 실증이 1건 존재하는 이상, 표기 없는 커버가 이 73건 안에 더 있을 수 있습니다. 대장에 담긴 14건만 사실이고 나머지는 추정 — 이 비대칭을 페이지에도 그대로 적었습니다.
6. 따라 해보고 싶으시면 — 가장 작은 형태부터
규칙 추정과 확인된 사실이 섞이는 모든 데이터 작업의 최소 형태는 이렇습니다.
- 추정을 만드는 규칙과 확인된 사실을 같은 파일에 두지 마십시오. 사실 파일에는 항목마다 확인 방법과 메모를 남깁니다.
- 사실 파일이 파이프라인의 마지막에 추정을 덮어쓰게 하십시오. 중간에 손으로 고치면 다음 실행이 지웁니다.
- 분류 어휘는 실제 사례가 깨뜨릴 때마다 넓히십시오. 두 칸으로 시작해도 되지만, 안 맞는 사례를 억지로 기존 칸에 넣는 순간 데이터가 거짓말을 시작합니다.
7. 판정은 네 가지로 나누십시오 (두 가지로는 부족합니다)
귀속을 "원곡/커버"로만 보면, 자작곡의 본인 연주가 커버로 뒤집혀 적힙니다.
PASS 웹 조회로 확인돼 대장에 있다 (14건이 여기 · web_verified)
PASS_WITH_NOTE 제목·설명란 명시 근거 — 채널 기입을 믿는 범위 한정 (explicit_credit)
HOLD 규약 추정뿐 — 확인필요 표시로 사람 확인 대기 (unknown 항목들)
FAIL 규칙 판정이 조회로 뒤집힘 (`잘 지내자, 우리`의 original 판정이 여기)8. 한계와 대가 (얻은 것 옆에 잃은 것)
분리와 덮어쓰기로 정확성을 얻은 대신 분명히 잃은 것이 있습니다.
대장은 사람 손이 드는 파일입니다. 웹 조회와 기재가 곡 단위 수작업이라, 14건을 넘어 수백 곡으로 가려면 이 속도가 병목입니다. 규칙은 수천 건을 몇 초에 훑지만 대장은 하루 몇십 건이 한계입니다 — 정확성의 값을 시간으로 치르는 구조입니다.
web_verified는 웹을 믿는 만큼만 강합니다. 조회 출처가 틀리면 대장도 틀립니다. 사람이 음원 크레딧을 직접 확인한 등급(human_observed)보다 한 단계 낮은 이유이고, 그래서 등급을 올려 부르지 않기로 했습니다.
"규칙을 정교화해 전부 자동으로 잡는" 설계를 버렸습니다. 채널별 규약 예외를 규칙에 계속 추가하는 길도 있었지만, 무표기 커버는 규칙이 원리적으로 못 잡습니다 — 제목에 신호가 없는데 제목 규칙이 무엇을 읽겠습니까. 규칙 정교화에 쓸 시간을 대장 기재에 쓰는 쪽을 택했고, 그 대가로 규칙 파서는 지금도 무표기 커버를 원곡으로 추정합니다. 덮어쓰기가 있어 최종 산출물에서만 교정될 뿐입니다.
커버 전수 확인은 미실행입니다. 대장 14건은 의심 항목을 조회한 결과이지 전 곡을 훑은 결과가 아닙니다. 그러니 "귀속이 정확하다"가 아니라 "확인된 것과 추정을 구별해 적었다"까지만 말할 수 있습니다.
9. 결론 — 가져가실 규칙 세 개
첫째, 추정과 사실은 파일부터 가르십시오. 한 파일에 섞이는 순간 어느 값이 확인된 것인지 아무도 모르게 되고, 재실행이 교정을 지웁니다. 분리는 형식이 아니라 생존 장치입니다.
둘째, 사실이 추정을 이기는 순서를 실행 구조에 박으십시오. "확인된 값은 건드리지 말자"는 다짐은 재실행 한 번에 무너집니다. 대장이 마지막에 덮어쓰는 구조는 다짐 없이도 매번 같은 결과를 냅니다.
셋째, 분류 어휘는 실측이 정합니다. 원곡/커버 두 칸은 책상에서 보면 완전해 보이지만, 자작곡의 타인 발표라는 실제 사례 하나가 그것을 깨뜨렸습니다. 어휘가 모자라면 가장 정확히 아는 사실조차 틀리게 적힙니다.
10. 참고
확인된 사실이 자동 추정을 마지막에 덮어쓰는 구조는 데이터 파이프라인에서 수동 교정 레이어(override layer)를 두는 관행의 작은 형태입니다. 값마다 근거 등급 (web_verified·explicit_credit·추정)을 달아 구별하는 것은 데이터 계보(provenance) 기록의 축소판이고, 이 시리즈의 출처 추적 편과 같은 원리 — 주 장에는 등급이 있는 근거가 달린다 — 를 귀속이라는 한 필드에 적용한 것입니다.