쇼핑몰 후기 분석, Aside로 수집부터 해석까지 한 번에: 코드로 먼저 세고 LLM이 읽었어요

소개

예전에는 후기 분석 한 번에 쇼핑몰마다 크롤러를 따로 짜고, 파이썬과 손으로 집계하고, 숫자 표를 보며 제가 직접 해석했어요. 단계마다 도구가 달라서 길고 끊어진 과정이었어요.

이번에는 Aside 하나로 수집 → 코드로 가공·정리 → LLM이 읽고 해석까지 한 번에 이어 갔어요. 이때 지킨 원칙은 하나예요. 후기 분석은 코드 영역에서 먼저 세고 정리한 뒤, LLM 영역에서 읽고 해석한다. 브라우저·코드·LLM이 한 작업 안에 있어서 이 전체 과정을 일괄로 가져갈 수 있었고, 그게 Aside가 이 업무에 유용한 이유였어요.

다룬 범위는 쇼핑몰 3곳, 제품 9종(상품 페이지 12개), 후기 8,291건이에요. 본문 전체를 분석한 것은 경쟁 일반 패치 후기 4,690건이고, 자석패치는 별점과 본문 표본을 썼어요.

이런 분들께 도움돼요

  • 쇼핑몰마다 크롤러를 따로 만들어 후기를 모아 온 분, 또는 그 과정이 엄두가 안 났던 분

  • 후기 키워드를 손으로 세고 골라 왔는데, 놓치는 말이 있을까 불안한 분

  • 집계와 원문 해석을 함께 자동화하고 싶은 분

  • 예전에 만든 파이썬 노트북·엑셀 틀을 에이전트 스킬로 옮기고 싶은 분

문제 상황

자석 패치 계열 신제품을 기획하고 있어요(브랜드·사양·구성·가격은 이 글에서 비공개). 홈쇼핑에서 잘 팔리는 경쟁 제품들의 후기를 분석해 "고객이 실제로 무엇에 만족하고 무엇에 실망하는지"를 알아야 했어요.

예전 제 방식은 이랬어요.

  1. 쇼핑몰마다 크롤러를 따로 만든다. 제 PC에는 채널 6곳용 수집 코드 11개(selenium + BeautifulSoup)가 남아 있어요. 같은 쇼핑몰인데 상품별로 노트북을 따로 만든 것도 있어요. 사이트 화면이 바뀌면 코드도 다시 고쳐야 했어요.

  2. 노트북으로 쪼갠다. 직접 만든 노트북(형태소 분석기 kiwipiepy)으로 문장을 단어로 나눠요.

  3. 손으로 세고 고른다. 나온 단어를 세고, 중요한 키워드를 직접 골라요.

  4. 엑셀로 집계한다. 키워드마다 SEARCH 수식으로 평점을 모아요.

  5. 해석은 내가 한다. 숫자를 보고 원문을 다시 찾아 읽으며 의미를 붙여요.

이 방식에는 늘 세 가지 한계가 있었어요.

  • 쇼핑몰마다 수집이 새 프로젝트였어요.

  • 사람이 고른 키워드 밖은 안 보였어요. 사전에 없는 말은 아무리 많이 나와도 집계되지 않았어요.

  • 숫자 뒤의 이유는 제 눈과 시간에 달려 있었어요. "트러블이 안 생겨요" 같은 칭찬이 불만 키워드에 섞여도, 수백 문장을 다 읽어 볼 수는 없었어요.

쇼핑몰마다 다른 문, 다른 열쇠. 그리고 손으로 세던 집계

처음 Aside에 건넨 요청이에요.

이 상세페이지에 약 4700건의 리뷰가 있어.
이 리뷰를 크롤링해서 엑셀로 만든 뒤, 분석해보고 싶어.
단 크롤링 과정에서 서버에 문제가 되면 안되겠지?
무조건 가져오지말고, 문제가 되지 않는 방법을 먼저 궁리한 뒤, 해보면 좋겠어

진행 방법

사용한 도구

  • Aside 브라우저 — 상세페이지·후기 읽기, 한 페이지씩 천천히 수집

  • Aside 에이전트(LLM) — 스크립트 실행, 원문을 읽고 해석

  • kiwipiepy 0.24 — 한국어 형태소 분석 (제 노트북과 같은 분석기)

  • openpyxl + Microsoft Excel — 엑셀 생성, 수식 재계산 검증

  • 사용자 스킬 shopping-review-analysis — 이번에 직접 만든 후기 분석 스킬

전체 흐름: 브라우저 → 코드 → LLM

Aside에서는 세 영역이 한 작업 안에 있어요.

  • 브라우저 영역 — 가져오기: 크롤러를 미리 짜지 않고, 그 자리에서 후기가 불러와지는 방식을 읽어 수집해요.

  • 코드 영역 — 세고 정리하기: 형태소 분리, 부정어 처리, 단어별 점수, 키워드별 평점 집계. 4,690건을 빠짐없이, 같은 기준으로 세요.

  • LLM 영역 — 읽고 해석하기: 코드가 점수로 짚어 준 단어의 원문을 읽고, 칭찬과 불만을 가르고, 불만의 맥락을 문장으로 정리해요.

순서는 꼭 코드 영역이 먼저, LLM 영역이 나중이에요. 코드가 전부 세고 읽을 곳을 좁혀 줘야 LLM이 그 문장을 집중해서 읽을 수 있고, LLM이 해석으로 기준을 바꾸면 다시 코드가 정확히 셀 수 있어요. 예전에는 이 왕복을 제가 손으로 했는데, 이번에는 에이전트가 한 작업 안에서 오갔어요.

실제 흐름은 이래요.

  1. 상세페이지 주소를 줌 → 2. 사이트 규칙 확인과 수집 방식 제안 → [사람] 진행 결정 → 3. 천천히 수집 → 4. 형태소 점수표 → 5. 키워드 사전 초안 → [사람] 검토 → 6. 키워드 수식 엑셀 → 7. 원문을 읽고 해석·보고

가져오기 → 쪼개기 → 점수 매기기 → 해석이 한 물길로. 사람은 정해진 수문에서 확인해요

1. 브라우저 영역: 크롤러 없이, 안전하게 가져왔어요

Aside가 바로 수집하지 않고 먼저 사이트 규칙(robots.txt)과 이용약관, 후기가 불러와지는 방식을 확인했어요. 일반 수집기를 허용하지 않는다고 적힌 곳도 있어서, Aside가 위험과 선택지를 정리해 보여 줬고 진행 여부는 제가 판단했어요. 그리고 아래 안전장치를 걸었어요.

  • 제 브라우저에서 사람이 "다음"을 누르는 것과 같은 요청만, 로그인 없이

  • 한 번에 한 페이지, 페이지 사이 4~8초 쉬기, 동시 요청 없음

  • 오류나 응답 지연이 이어지면 자동 중단

  • 이미지 파일은 받지 않고, 작성자 ID는 사이트가 가린 값 그대로

쇼핑몰 3곳의 후기 로딩 방식이 모두 달랐지만(숨은 목록 요청, 스크롤 추가 로딩, 페이지 번호 버튼) 크롤러를 따로 짜지 않았어요. 정렬 순서가 흔들리거나 옵션 주소가 달라 막힐 때도 에이전트가 원인을 찾아 바로 고쳤어요. 469번 요청으로 4,690건 전부를 받았고, 화면에 표시된 후기 수와 정확히 일치했어요.

의료기기 상품은 일부 쇼핑몰이 후기 본문을 아예 보여주지 않았어요("관련 법규에 의거 별점만 제공"). 의료기기는 사용자 체험담을 광고에 쓸 수 없기 때문이에요(의료기기법 시행규칙 별표 7 제8호). 이런 곳은 별점만 받고 다른 채널의 본문을 썼어요.

2. 코드 영역 ①: 제 엑셀 틀을 그대로 재현했어요

예전 분석 엑셀을 보여주자 Aside가 구조를 읽고 같은 틀로 만들었어요. 핵심 로직은 "키워드별로 평점을 모으는 것"이고, 시트 하나가 세 층으로 되어 있어요.

  1. 사전(1~9행): 키워드 35개 열마다 포함어 5칸·제외어 3칸

  2. 판정(23행~): 후기 한 줄마다 "포함어가 있고 제외어가 없으면 → 그 후기의 평점을 적는다". 4,690행 × 35열, 약 16만 개 수식

  3. 집계(10~20행): 평점별 건수·언급률·평균평점, 그리고 불만률(그 키워드를 언급한 후기 중 3점 이하 비율)과 불만배수(전체 불만률 대비 몇 배)

사전 칸 하나만 고쳐도 16만 개 판정과 집계가 전부 다시 계산돼요.

실제 키워드분석 시트. ① 키워드 사전 ② 후기마다 평점을 적는 판정 ③ 불만률·불만배수. 평균평점은 비슷해 보여도 "모르겠" 54.1%(×3.50)와 "근육통" 7.0%(×0.45)처럼 차이가 또렷해요

=IF( AND( SUMPRODUCT(ISNUMBER(SEARCH(E$2:E$6, $A23)) * (E$2:E$6<>"")) > 0,     ← 포함어 중 하나라도 있고
          SUMPRODUCT(ISNUMBER(SEARCH(E$7:E$9, $A23)) * (E$7:E$9<>"")) = 0 ),   ← 제외어는 하나도 없으면
     $B23, "" )                                                                  ← 그 후기의 평점, 아니면 빈칸

불만률   = COUNTIF(E$23:E$20000, "<=3") / E15
불만배수 = E19 / $B$19      (전체 불만률 15.5%)

엑셀로 직접 재계산한 값과 파이썬 계산을 비교해 키워드 35개 모두 일치하는 것도 확인했어요.

3. 코드 영역 ②: 단어를 "세지" 않고 "점수"를 매겼어요

Aside가 제 노트북을 읽고 도구 모음을 정리해 줬을 때, 제가 말했어요.

후기를 다양한 각도로 분석하기 위한 툴들을 모아봤다..고 하면 될 것 같고,
형태소 나눈 것으로 점수 평가하는게 가장 임팩트 있는 것 같아.

그래서 키워드를 사람이 고르기 전에, 코드가 모든 단어에 점수를 먼저 매기게 했어요.

  1. 형태소 분리 — 명사 + 뒤 동사를 붙여 "배송빠르다", "냄새없다" 같은 의도 단위를 만들어요.

  2. 부정어 결합 — 안·못·별로 + 동사, "~지 않다"를 "안떨어지다"처럼 붙여요. "트러블없다"는 만족 신호, "접착력약하다"는 불만 신호로 갈려요.

  3. 불만연관도 — 불만 후기 중 그 단어가 나온 비율과 만족 후기 중 나온 비율을 비교해 log2로 바꾼 값이에요. 0보다 크면 불만 쪽, 작으면 만족 쪽이에요.

  4. 사람은 사전 검토 — Aside가 같은 뜻 묶기·잡음 빼기를 한 초안을 만들면 제가 고쳐요.

4. LLM 영역: 코드가 짚어 준 원문을 읽고 해석했어요

점수표는 "어떤 단어가 불만과 함께 나오는지"까지만 알려줘요. 여기서부터가 LLM의 일이에요.

  1. 불만연관도가 높게 뜬 단어를 고른다

  2. 그 단어가 들어간 원문 문장을 모아 읽는다

  3. 같은 단어 안에서 칭찬인지 불만인지 가른다

  4. 불만의 맥락을 한 문장으로 정리하고, 필요하면 바뀐 기준으로 코드가 다시 센다

이렇게 읽혔어요(퍼센트는 그 단어를 언급한 후기 중 3점 이하 비율).

  • "말리다" (50%) → "끝이 말리면서 잘 떨어짐", "자고 일어나면 침대에 말려 있어요" → 떨어짐 불만 중 일부는 패치 끝이 말리는 것에서 시작돼요

  • "약국" (54%) → "그냥 약국에서 일반 파스 사서 쓰세요" → 저평점 후기의 비교 대상으로 약국 파스가 자주 나와요

  • "호스트"·"설명" (54%·45%) → "쇼호스트 설명처럼 효과는 못 느끼겠어요" → 일부 불만은 방송에서 생긴 기대에서 출발해요

  • "비싸다" (41%) → "인터넷에서 반값에 살 수 있는 걸 몰랐어요" → 채널 간 가격 차이에 대한 불만이 섞여 있어요

  • "트러블" → 코드가 센 키워드 집계는 196건·27%였는데, LLM이 원문을 읽어 보니 "트러블이 안 생겨요" 같은 칭찬 문장이 25건 섞여 있었어요. 피부 반응을 직접 말한 표현(가렵다·빨갛다·발진 등)으로 기준을 다시 잡아 코드가 다시 세니 147건·34%였어요

  • 자석패치 저평점 본문 14건 → LLM이 한 건씩 읽어 5건이 "자석은 본품에만 있고 나머지는 리필 테이프"라는 구성 불만이라는 것을 찾아냈어요. 키워드 사전에는 없던 불만이에요

숫자 표만 볼 때는 "말리다 50%"가 무슨 뜻인지 알 수 없어요. 코드가 먼저 짚어 주고, LLM이 원문을 읽고 나서야 기획에 쓸 수 있는 문장이 됐어요. 저는 그 해석이 맞는지 판단하는 데 시간을 썼어요.

5. 이 전 과정을 스킬로 묶었어요

스터디의 8칸 틀로 정리했어요.

  1. 스킬 이름: shopping-review-analysis

  2. 사용할 때: 상품 후기 분석·수집·경쟁 제품 비교 / 사용하지 않을 때: 외부 게시·발송만 원할 때

  3. 필요한 입력: 상세페이지 주소 또는 후기 파일(csv·xlsx·json), 저장할 업무 폴더

  4. 작업 순서: 수집 가능 여부 확인 → 천천히 수집 → 형태소 점수표 → 키워드 사전 초안 → 사람 검토 → 키워드 수식 엑셀 → 원문을 읽고 해석·보고

  5. 출력: 형태소 점수표 엑셀, 키워드 분석 엑셀

  6. 정보가 부족할 때: 수집이 제한된 사이트면 사실과 위험을 보여 주고 묻고 멈춤, 본문 비공개면 다른 채널 제안

  7. 하지 말 것: 로그인 수집, 동시 요청, 의료기기 후기의 광고 활용, 근거 없는 수치

  8. 사람이 확인할 곳: 수집 진행 여부, 키워드 사전 초안 / 다시 시작할 곳: 정규화된 후기 JSON부터

shopping-review-analysis/
├─ SKILL.md                  작업 순서와 규칙
├─ scripts/
│  ├─ review_morph.py        형태소 점수표 (제 노트북 로직 + 부정어 처리)
│  └─ keyword_workbook.py    제 엑셀 틀 자동 생성
├─ references/
│  ├─ sites.md               쇼핑몰별 수집 요령과 함정
│  └─ rules.md               사전 작성 요령, 실제 오탐 사례, 의료기기 광고 규정
└─ assets/
   ├─ normalize_ko_review.txt  공통 표기 정규화 (냄세→냄새, 업어요→없어요)
   └─ normalize_patch.txt      패치 전용 (붙혀→붙여, 부치고→붙이고)

같은 로직으로 제가 주피터에서 직접 돌릴 수 있는 노트북 ver0.3도 만들었어요. 같은 후기로 스킬을 다시 돌리니 키워드 35개 값이 이전 결과와 모두 일치했어요.

사용한 프롬프트 전문

파이썬 코드 포함, 지금 후기 분석 프로세스를 스킬로 만들까? 반복해서 사용 많이 할텐데..
1)아까 알려줬던 파이썬코드는 쓸모 없어? 2)형태소분석 라이브러리는 더 업데이트된 버전 없어?
좋아. 이제부터는 전체 일괄로 진행해줘

핵심 코드 (형태소 분리 + 부정어 결합 + 불만연관도)

NEG = {'안', '못', '별로', '전혀', '덜'}

def analyze(text, kiwi, norm_pairs=(), typos='basic'):
    for a, b in norm_pairs:                      # 표기 정규화 (붙혀→붙여 등)
        text = text.replace(a, b)
    toks = kiwi.tokenize(text, typos=typos)
    words, neg = [], False
    for t in toks:
        tag, f = t.tag, t.form
        if tag == 'MAG' and f in NEG:            # 안·못·별로 → 다음 동사에 붙임
            neg = True
            continue
        if tag in ('NNG', 'NNP', 'XR') and len(f) > 1:
            words.append([f, 'N']); neg = False
        elif tag.startswith('VV') or tag.startswith('VA'):
            w = f + '다'
            words.append(['안' + w if neg else w, 'V']); neg = False
        elif tag == 'VX' and f in ('않', '못하'):  # "떨어지지 않다" → "안떨어지다"
            for i in range(len(words) - 1, -1, -1):
                if words[i][1] == 'V':
                    if not words[i][0].startswith('안'):
                        words[i][0] = '안' + words[i][0]
                    break
    singles = {w for w, k in words if not (k == 'V' and w in STOP_V)}   # STOP_V: 하다·되다 등 뜻 없는 동사
    pairs = {words[i - 1][0] + w for i, (w, k) in enumerate(words)
             if k == 'V' and i > 0 and words[i - 1][1] == 'N'}   # 효과없다, 냄새없다
    return singles, pairs

# 불만연관도 = log2( 불만 후기 중 언급 비율 / 만족 후기 중 언급 비율 ), 0.5 보정
assoc = math.log2(((low_cnt + .5) / (n_low + 1)) / ((high_cnt + .5) / (n_high + 1)))

결과와 배운 점

기존 방식 vs Aside 방식

  • 수집: 쇼핑몰마다 크롤러 개발 → 상세페이지 주소만으로 쇼핑몰 3곳·제품 9종·후기 8,291건 (규칙 확인·저속·중단 장치 포함)

  • 가공: 노트북 실행 + 손으로 세기 → 형태소 점수표와 키워드 엑셀 자동 생성

  • 키워드 선정: 직접 고르기 → 코드가 먼저 제시한 초안을 검토

  • 해석: 숫자 표를 보고 제 눈으로 짐작 → LLM이 코드가 짚어 준 원문을 읽고 맥락을 문장으로 정리, 저는 판단

  • 연결: 단계마다 도구를 바꾸고 제가 손으로 이음 → Aside 한 작업 안에서 일괄 진행

  • 재사용: 채널마다 코드 수정 → 스킬로 같은 흐름을 다시 돌림

분석에서 새로 보인 것

  • 피부 트러블: 키워드 집계 196건·27% → 원문 확인 후 기준을 바로잡아 다시 센 147건·34%. 칭찬 문장에 묻혀 있던 불만의 비중이 드러났어요.

  • 떨어짐의 맥락: 끝이 말림("말리다" 50%), 더위와 땀("덥다" 50%·"여름" 36%), 작은 크기("사이즈작다" 30%).

  • 키워드 사전에 없던 불만: 자석패치 저평점 본문 14건 중 5건이 리필 구성 불만.

  • 불만이 유난히 적은 후기 묶음: 피로(피곤·뻐근·결리다·뭉치다)를 언급한 후기 81건은 3점 이하 1.2%, 활동(운동·여행·골프·테니스) 155건은 3.9%, 질환(관절염·디스크·오십견 등) 67건은 14.9%, 전체 15.5%.

  • 자석 세기(가우스): 자석패치 8개 상품에서 가우스와 3점 이하 비율 사이에 뚜렷한 관계는 보이지 않았어요(상관계수 0.1 안팎, 상품 수가 적어 관찰 수준). "가우스"라는 말은 고가우스 경쟁 6종의 만족 후기 166건 중 22건에 나왔고, 불만 후기 78건에는 나오지 않았어요.

뒤집어 보니 색이 달랐던 카드들. 칭찬에 섞여 있던 불만이 제 몫만큼 드러났어요

결론: 전 과정을 한 번에 이어 갈 수 있어서 Aside가 유용했어요

후기 분석은 "가져오기 → 세고 정리하기 → 읽고 해석하기"가 끊기지 않아야 하는 일이에요. 그리고 분석은 반드시 코드 영역에서 먼저 가공·정리한 뒤 LLM 영역에서 해석해야 해요. 코드가 빠짐없이 세어 읽을 곳을 짚어 주고, LLM이 그 문장을 읽어 의미를 붙이고, 바뀐 기준은 다시 코드가 세요.

Aside는 브라우저·코드 실행·LLM이 한 작업 안에 있어서, 이 전체 과정을 사람이 단계마다 옮겨 주지 않아도 일괄로 가져갈 수 있었어요. 크롤러를 짜던 시간, 손으로 세던 시간, 원문을 찾아 헤매던 시간이 빠지고, 저는 진행 결정과 사전 검토, 해석 판단에만 집중했어요.

시행착오

  • "베스트순으로 넘기면 다 받겠지" → 순서가 바뀌어 중복·누락이 생겼어요. 정렬을 최신순으로 고정해야 해요.

  • "부정문은 제외어로 막으면 되겠지" → 제외어는 문장 단위라 칭찬과 불만이 같이 빠져요. 형태소 단계에서 부정어를 붙여야 해결돼요.

  • "키워드 불만률이 높으면 그게 약점이겠지" → 같은 단어에 칭찬과 불만이 섞여 있었어요. LLM이 원문을 읽고 코드가 다시 센 뒤에야 약점의 크기가 보였어요.

꿀팁

  1. Aside에 잘 맞는 스킬은 "브라우저로 가져오고 → 코드로 세고 → LLM이 해석하는" 일이에요. 셋이 이어져야 하는 일일수록 차이가 커요.

  2. 분석 순서는 코드 영역 먼저, LLM 영역 나중. 셀 수 있는 건 코드가 먼저 세게 하고, LLM에게는 코드가 짚어 준 원문을 읽게 하세요.

  3. 수집 요청에 "서버에 문제가 되지 않는 방법을 먼저 궁리해줘"를 붙이면, 규칙 확인·간격·중단 조건부터 설계해 줘요.

  4. 후기 분석은 평균 평점보다 3점 이하 비율을 보세요. 후기 대부분이 5점이라 평균 차이는 작아요.

  5. 신호 단어가 뜨면 LLM에게 "이 단어가 들어간 원문을 읽고, 칭찬과 불만을 가르고, 불만 맥락을 한 문장으로 정리해줘"라고 맡기세요.

  6. 의료기기 후기는 내부 기획 자료로만 쓰세요. 체험담 광고는 금지예요.

다른 업무에 적용한다면

  • 경쟁 상품 가격·구성 비교, 상세페이지 비교, 홈쇼핑 편성 정리처럼 "브라우저로 모으고 → 코드로 세고 → LLM이 해석하는" 일에 같은 구조를 쓸 수 있을 것 같아요. 아직 해 보지는 않았어요.

  • 상품문의·고객센터 문의·반품 사유 같은 텍스트에도 같은 순서를 적용할 수 있을 것 같아요.

도움이 필요한 부분

  • 후기 본문이 비공개인 의료기기 상품의 고객 목소리를 다른 방법으로 모으는 좋은 방법이 있을까요?

  • 형태소 점수표의 최소 언급 기준(표본이 작을 때)을 어떻게 잡으시나요?

앞으로의 계획

  • 같은 스킬로 경쟁 제품을 추가해 제품 간 비교를 쌓아 가요.

  • 이 스킬을 정기 실행(루틴)으로 돌려 새 후기가 쌓일 때마다 신호 단어와 해석을 갱신해 보려 해요.

확인이 필요한 부분

  • [확인 필요] 가우스를 강조하는 표현이 의료기기 과대광고에 해당하는지는 광고심의 판단이 필요해요

  • [확인 필요] 다른 카테고리(식품·화장품)에서의 정확도는 아직 검증하지 않았어요

도움 받은 글 (옵션)

  • GPTERS 24기 에이전트하네스 3주차 자료 (지피터스의 지아코모(안재흥) 스터디장)

  • kiwipiepy (한국어 형태소 분석기): https://github.com/bab2min/kiwipiepy

  • 의료기기법 시행규칙 별표 7 (금지되는 광고의 범위), 국가법령정보센터

  • 사례글 작성: GPTERS24-GIACOMO-WRITE-POST 스킬 (원 출처: 닿님 write-post, MIT)

3
2개의 답글
지피터스 뉴스레터

이번 주 AI, 딱 쓸 것만

매주 월요일 오후,
읽고 바로 써먹을 AI 소식만