merge: feature/supporters-autobuild + feature/ai-sentiment-rubric 를 Product 1.0 한 줄기로 합침

Product 1.0 범위는 진단 + 서포터즈 초안(haewon 결정).

브랜치 확인 결과 핸드오버 §1 의 미확인 항목 두 건은 이미 해결 상태였다.
리드 CTA(DiscoveryLeadModal·discovery_leads 마이그레이션)와 AEO/GEO v2 기준표는
셋 다 main 에 있고 blob 이 동일하다. feature/discovery-url-cta 는 main 대비
ahead 0 / behind 22 인 낡은 포인터라 머지 대상에서 뺐다.

supporters/ 정본은 메인 쪽(뷰 수작업 샘플)으로 정했다(haewon 결정).
겹친 22개 파일 중 실제로 다른 것은 9개였고 전부 메인 쪽을 취했다.
layout-baseline.json 은 Base.astro 가 내는 언어 전환 링크 모양(a.lang-switch)과
짝이라 같은 쪽으로 가져왔다.

Productize 쪽에만 있던 두 가지를 정본으로 옮겼다.
- GA4 태그: site.json 의 ga4MeasurementId 가 G-형식일 때만 삽입한다.
  값이 없으면 스크립트가 아예 나가지 않는다. 키 이벤트 이름은
  data/ai_channels.json 의 conversion_events 와 맞춘다.
- 영문 법적 고지: 지원 관계·부작용 고지는 의료법 56조 대상이라 임의 번역하지 않는다.
  i18n.ts 에 병원 승인 없는 영문 번역이 들어 있어 푸터에서 쓰지 않도록 했다.
  site.json 의 sponsorNoticeEn · factSheet 의 sideEffectNoticeEn 이 채워지기 전까지
  영문 화면은 한국어 원문과 확인 대기 표기를 함께 낸다.

검증: astro build 32페이지, 게이트 41/41 통과, check.mjs 오류 0건
(경고 23건은 기존 건으로 site.sponsorNotice 미설정 18건과 원고 수치 한정 5건),
루트 tsc --noEmit 0 에러. GA4 는 임시 측정 ID 로 삽입·미삽입 양쪽을 확인하고 원복했다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Haewon Kam 2026-09-11 14:34:47 +09:00
commit f01bc6cafc
40 changed files with 5411 additions and 302 deletions

View File

@ -0,0 +1,65 @@
# AI 답변 감성 판정 기준표 v0.1
작성 2026-09-08 · 상태: 초안, haewon 보정 대기 · 적용 스크립트 `scripts/sentiment_qb.py`
## 1. 무엇을 재는가
질문 뱅크(120문항)를 답변엔진에 물어 받은 답변 안에서 **대상 병원이 어떤 어조로 언급되는지**를 판정한다. 브랜드 범용 도구(FrostAI 등)의 "감성 점수"에 대응하는 지표지만, 병원은 부정 신호의 대부분이 규제·사건 보도이므로 그 항목을 따로 센다.
측정 원칙은 질문 뱅크와 같다. 소비자 UI 자동 조회는 하지 않고 공식 API 답변만 쓴다. 답변 원문은 저장하되 리포트에는 근거 문장 한 줄만 인용한다.
## 2. 판정 단위와 값
답변 1건 = 판정 1건. 판정기는 아래 JSON을 낸다.
| 필드 | 값 | 설명 |
|---|---|---|
| mentioned | true / false | 대상 병원(별칭 포함)이 답변에 나오는가. 추출기의 `view_mentioned`와 교차 확인 |
| sentiment | positive / neutral / negative / mixed / not_mentioned | 병원에 대한 어조. 언급이 없으면 not_mentioned |
| aspects | 배열 | 아래 §3 측면 태그 중 해당하는 것 |
| negative_type | none / regulatory / safety / service / price / reputation / other | 부정이면 어떤 종류인가 |
| evidence | 문장 1개 | 판정 근거가 된 답변 원문 문장 (요약 금지, 그대로 인용) |
| recommendation | recommended / listed / cautioned / not_applicable | 병원을 추천했는가, 목록에 나열만 했는가, 주의를 붙였는가 |
| confidence | 0~1 | 판정기 자신감 |
### 어조 판정 규칙
- **positive**: 병원의 강점을 서술하거나 추천 근거로 든다. 예: "안전 시스템이 갖춰진 병원", "가슴성형 전문으로 평가받는다".
- **neutral**: 사실 나열, 목록 포함, 위치·진료과목 안내처럼 평가 없는 언급.
- **negative**: 부정 사실을 서술하거나 주의를 권한다. 예: "공정위 시정명령을 받았다", "후기 광고 논란이 있었다", "부작용 사례가 보고됐다".
- **mixed**: 긍정과 부정이 한 답변에 함께 있다. 점수 계산에서는 negative 쪽으로 센다(보수적).
- 다른 병원에 대한 평가는 세지 않는다. 대상 병원 문장만 본다.
- "확인이 필요하다", "직접 상담을 권한다" 같은 일반 주의 문구는 negative가 아니라 neutral이다. 병원 고유의 문제를 지목할 때만 negative다.
## 3. 측면 태그
| 태그 | 포함 |
|---|---|
| doctors | 의료진, 전문의, 경력, 원장 |
| safety | 안전 시스템, 마취, 부작용, 사고, 회복 관리 |
| price | 가격, 비용, 견적, 할인 |
| reviews | 후기, 평판, 만족도, 리뷰 수 |
| regulatory | 공정위, 시정명령, 의료법 위반, 광고 제재, 소송 |
| procedure | 시술·수술 종류, 장비, 기술, 전문 분야 |
| access | 위치, 예약, 외국어 응대, 편의 |
| media | 방송 출연, 언론 보도, 수상 |
## 4. 점수
- **감성 점수(0~100)** = (positive × 100 + neutral × 50 + mixed × 25 + negative × 0) ÷ 언급된 답변 수. Frost의 감성 점수와 같은 척도로 비교할 수 있게 했다.
- **부정 비율** = negative + mixed ÷ 언급된 답변 수.
- **규제 언급률** = negative_type이 regulatory인 답변 ÷ 언급된 답변 수. 병원 전용 보조 지표.
- **추천율** = recommendation이 recommended인 답변 ÷ 언급된 답변 수.
- 엔진별로 따로 내고, 브랜드 질문(A·B)과 논브랜드 질문을 분리한다. 논브랜드에서 언급되며 긍정인 것이 가장 가치 있는 신호다.
## 5. 보정 절차 (공신력)
1. 판정 결과에서 30건을 무작위로 뽑아 `*_calibration.xlsx`에 담는다. 판정기 값은 숨기고 haewon이 sentiment와 negative_type을 직접 적는다.
2. 일치율을 계산한다. sentiment 일치 80% 이상이면 기준표를 확정한다. 미만이면 불일치 사례를 §2 규칙에 예시로 추가하고 다시 돌린다.
3. 확정 후에는 같은 기준표·같은 모델로만 월간 실행한다. 모델을 바꾸면 보정을 다시 한다.
## 6. haewon이 정할 것
- **부정의 범위**: "후기 광고 논란"처럼 사실이지만 병원에 불리한 언급을 negative로 볼지, 규제 사실 서술은 neutral로 볼지. 초안은 negative다.
- **mixed 처리**: 점수에서 25점으로 셀지, 제외할지. 초안은 25점.
- **다른 병원 추천 문맥**: 대상 병원이 언급되지 않고 경쟁 병원만 추천된 답변을 별도 지표(경쟁 노출)로 셀지.

View File

@ -0,0 +1,180 @@
# AI 답변 감성 판정 기준표 v0.3
작성 2026-09-08 · 개정 2026-09-09 · 상태: 1차 보정 반영, 2차 보정 대기 · 적용 스크립트 `scripts/sentiment_qb.py`
v0.1 대비 바뀐 것은 둘이다.
1. **어조 규칙 R1~R5** (§2). 1차 보정에서 haewon 라벨 29건 대비 일치율이 75%로 기준선 80%에 미달해, 불일치 7건에서 뽑았다.
2. **결정론적 언급 탐지기** (§2-1). 상호가 URL 안에만 있거나 "리뷰"의 "뷰"를 병원 언급으로 세던 오탐을 없앴다.
R4-a와 R6은 시험 투입했다가 되돌렸다. 이유는 §5에 있다.
## 1. 무엇을 재는가
질문 뱅크(120문항)를 답변엔진에 물어 받은 답변 안에서 **대상 병원이 어떤 어조로 언급되는지**를 판정한다. 브랜드 범용 도구(FrostAI 등)의 "감성 점수"에 대응하는 지표지만, 병원은 부정 신호의 대부분이 규제·사건 보도이므로 그 항목을 따로 센다.
측정 원칙은 질문 뱅크와 같다. 소비자 UI 자동 조회는 하지 않고 공식 API 답변만 쓴다. 답변 원문은 저장하되 리포트에는 근거 문장 한 줄만 인용한다.
## 2-1. 언급 탐지 (v0.3 추가)
`sentiment` 를 매기기 전에 대상 병원이 답변에 실제로 나오는지를 **정규식으로 먼저 판정한다**(`mention_kind()`). 판정기가 언급이라고 해도 탐지기가 없다고 하면 `not_mentioned` 로 덮어쓴다. 언급 수가 모든 비율의 분모라서, 여기가 틀리면 점수 전체가 틀린다.
| 값 | 조건 |
|---|---|
| strong | 정식 상호가 답변 본문에 있다. 한글은 음절 사이 공백을 허용한다("뷰 성형외과"도 잡는다). 영문 정식 명칭·도메인도 포함한다 |
| weak | 정식 상호 없이 영문 약칭만 있다(예: 병원 목록 안의 "View") |
| none | 위 어느 것도 없다 |
두 가지를 반드시 처리한다.
- **URL을 먼저 지운다.** `news.nate.com/view/...`, `clinic/view.do`, `?bmode=view` 의 "view"를 병원 언급으로 세면 안 된다. 1차 판정에서 C-13·C-14·E-06 세 건이 이 오탐이었다.
- **다른 낱말의 일부인 약칭을 뺀다.** "리뷰"의 "뷰"가 대표적이다. G-04(openai)는 "리뷰 사이트에서도"만 있고 병원 언급이 없는데 언급으로 세고 있었다.
이 수정으로 언급 수가 84에서 83으로 바뀌었다.
## 2. 판정 단위와 값
답변 1건 = 판정 1건. 판정기는 아래 JSON을 낸다.
| 필드 | 값 | 설명 |
|---|---|---|
| mentioned | true / false | 대상 병원(별칭 포함)이 답변에 나오는가. 추출기의 `view_mentioned`와 교차 확인 |
| sentiment | positive / neutral / negative / mixed / not_mentioned | 병원에 대한 어조. 언급이 없으면 not_mentioned |
| aspects | 배열 | 아래 §3 측면 태그 중 해당하는 것 |
| negative_type | none / regulatory / safety / service / price / reputation / other | 부정이면 어떤 종류인가 |
| evidence | 문장 1개 | 판정 근거가 된 답변 원문 문장 (요약 금지, 그대로 인용) |
| recommendation | recommended / listed / cautioned / not_applicable | 병원을 추천했는가, 목록에 나열만 했는가, 주의를 붙였는가 |
| confidence | 0~1 | 판정기 자신감 |
### 어조 판정 규칙
- **positive**: 병원의 강점을 서술하거나 추천 근거로 든다. 예: "안전 시스템이 갖춰진 병원", "가슴성형 전문으로 평가받는다".
- **neutral**: 사실 나열, 목록 포함, 위치·진료과목 안내처럼 평가 없는 언급.
- **negative**: 부정 사실을 서술하거나 주의를 권한다. 예: "공정위 시정명령을 받았다", "후기 광고 논란이 있었다", "부작용 사례가 보고됐다".
- **mixed**: 긍정과 부정이 한 답변에 함께 있다. 점수 계산에서는 negative 쪽으로 센다(보수적).
- 다른 병원에 대한 평가는 세지 않는다. 대상 병원 문장만 본다.
- "확인이 필요하다", "직접 상담을 권한다" 같은 일반 주의 문구는 negative가 아니라 neutral이다. 병원 고유의 문제를 지목할 때만 negative다.
### 우선순위 규칙 (v0.2 추가, 1차 보정에서 도출)
아래 규칙은 위 어조 정의보다 우선한다. 괄호 안은 근거가 된 보정 사례다.
**R1. 결론 단락이 개별 항목보다 우선한다.** 답변에 종합 평가·결론 단락이 있으면 그 단락의 어조로 판정한다. 본문에 나열된 개별 항목의 어조로 판정하지 않는다.
- A-01(perplexity): 본문에 강남언니 평점 9.4~9.5가 있으나 결론이 "후기 기반 평판은 좋은 편이지만 추가 확인이 필요"라는 확인 권고다. → **neutral** (mixed 아님)
- D4-01(openai): 본문에 "모두에게 동일한 설명을 하는 듯한 인상"이라는 후기 지적 한 줄이 있으나 종합 평이 "안전성과 전문성을 갖춘 병원으로 평가받고 있습니다"다. → **positive** (mixed 아님)
- D2-01(perplexity): 결론이 "수술 결과의 일관된 객관성까지 판단하긴 어렵고, 커뮤니티에는 부정적 의견도 일부 보입니다"다. → **negative** (mixed 아님)
**R2. mixed는 긍정과 부정이 대등하게 병존할 때만 쓴다.** 부정 성분이 문장 하나의 부수 언급이면 mixed로 세지 않는다. 긍정과 부정이 각각 독립된 근거로 서술되고 결론이 어느 쪽으로도 기울지 않을 때만 mixed다.
**R3. "후기 수가 많다", "인지도가 있다"는 규모 서술이며 긍정 평가가 아니다.** 이 서술만 있고 병원 고유의 문제 지목이 함께 있으면 mixed가 아니라 negative다. (D2-01)
**R4. 평가 축이 있는 목록에 포함되면 positive다.** 질문이 조건이나 우수성을 묻고(평점이 높은 곳, 마취과 전문의가 상주하는 곳, 잘하는 곳) 그 목록에 대상 병원이 들어가면 positive다. 조건 없는 단순 나열(위치·진료과목 안내, 지역 병원 열거)만 neutral이다.
- C-12(openai): "강남언니에서 평점 높은 성형외과" 목록에 뷰성형외과가 포함됐다. → **positive**
- C-08(openai): "마취과 전문의가 상주하는 강남 성형외과" 목록에 포함되고 "마취과 전문의 365일 상주", "3D-CT, 체계적 사후 관리"가 함께 서술됐다. → **positive**
**R5. 강점·역량 서술은 출처가 병원 홍보라도 positive로 센다.** 답변이 "환자의 안전과 만족을 최우선", "최신 기술과 장비"처럼 강점을 서술하면, 그 서술이 병원 광고를 인용한 것이라도 답변의 어조는 positive다.
- A-02(openai): "환자의 안전과 만족을 최우선으로 하며, 최신 기술과 장비를 사용하여 서비스를 제공한다고 광고합니다" → **positive**
**R6. (경계 사례, 미확정) 사실 조회 질문의 항목 나열은 neutral이다.** 질문이 "무슨 수술을 주로 하나", "어디에 있나"처럼 사실을 묻고 답변이 진료 항목 카탈로그이면, 개별 항목에 붙은 수식어("풍부한 임상 경험")는 긍정으로 세지 않는다.
- A-03(openai): 진료 분야 나열이고 항목마다 홍보성 수식이 붙어 있다. haewon은 **neutral**, 판정기는 positive였다.
- **주의**: R6과 R5의 경계가 규칙으로 깔끔히 갈리지 않는다. A-02(positive)와 A-03(neutral) 모두 답변에 병원 홍보 문구가 인용돼 있는데 라벨이 갈렸다. 2차 보정에서 haewon이 이 경계를 확정해야 한다(§6).
## 3. 측면 태그
| 태그 | 포함 |
|---|---|
| doctors | 의료진, 전문의, 경력, 원장 |
| safety | 안전 시스템, 마취, 부작용, 사고, 회복 관리 |
| price | 가격, 비용, 견적, 할인 |
| reviews | 후기, 평판, 만족도, 리뷰 수 |
| regulatory | 공정위, 시정명령, 의료법 위반, 광고 제재, 소송 |
| procedure | 시술·수술 종류, 장비, 기술, 전문 분야 |
| access | 위치, 예약, 외국어 응대, 편의 |
| media | 방송 출연, 언론 보도, 수상 |
## 4. 점수
- **감성 점수(0~100)** = (positive × 100 + neutral × 50 + mixed × 25 + negative × 0) ÷ 언급된 답변 수. Frost의 감성 점수와 같은 척도로 비교할 수 있게 했다.
- **부정 비율** = negative + mixed ÷ 언급된 답변 수.
- **규제 언급률** = negative_type이 regulatory인 답변 ÷ 언급된 답변 수. 병원 전용 보조 지표.
- **추천율** = recommendation이 recommended인 답변 ÷ 언급된 답변 수.
- 엔진별로 따로 내고, 브랜드 질문(A·B)과 논브랜드 질문을 분리한다. 논브랜드에서 언급되며 긍정인 것이 가장 가치 있는 신호다.
## 5. 보정 절차 (공신력)
1. 판정 결과에서 30건을 무작위로 뽑아 `*_calibration.xlsx`에 담는다. 판정기 값은 숨기고 haewon이 sentiment와 negative_type을 직접 적는다.
2. 일치율을 계산한다. sentiment 일치 80% 이상이면 기준표를 확정한다. 미만이면 불일치 사례를 §2 규칙에 예시로 추가하고 다시 돌린다.
3. 확정 후에는 같은 기준표·같은 모델로만 월간 실행한다. 모델을 바꾸면 보정을 다시 한다.
### 1차 보정 결과 (2026-09-09)
| 항목 | 값 |
|---|---|
| 대상 | 뷰성형외과 240건 판정분에서 무작위 30건 |
| haewon 라벨 | 29건 (G-08 openai 1건은 판단 보류로 공란) |
| sentiment 일치 | **22/29 = 75%** (기준선 80% 미달) |
| negative_type 일치 | **측정 불가** (haewon G열 미기입, negative 라벨 2건 포함) |
불일치 7건의 갈래는 셋이다. 판정기가 mixed를 남발한 것 3건(A-01·D4-01·D2-01), 평가 축이 있는 목록 포함과 강점 서술을 중립으로 낮춘 것 3건(A-02·C-12·C-08), 항목 나열의 수식어를 긍정으로 올린 것 1건(A-03).
### 이 보정의 한계
규칙 R1~R6은 위 30건의 불일치에서 뽑았다. 같은 30건으로 다시 재면 일치율이 오르는 것은 당연하므로, 재판정 후의 일치율을 기준표 확정 근거로 쓰지 않는다. **확정하려면 새로 뽑은 30건으로 2차 보정을 해야 한다.** 1차 보정에 쓴 30건은 2차 표본에서 제외한다.
negative_type은 라벨이 없어 이번에 재지 못했다. 2차 보정에서는 negative·mixed 라벨에 종류를 반드시 함께 적는다.
### 재판정 결과 (2026-09-09, R1~R5 적용)
240건을 gpt-4.1로 다시 판정했다. 실제 비용 $0.79(입력 324,627 · 출력 17,723 토큰).
| sentiment | v0.1 | v0.2 | 증감 |
|---|---|---|---|
| positive | 14 | 20 | +6 |
| neutral | 57 | 58 | +1 |
| mixed | 10 | **0** | -10 |
| negative | 3 | 6 | +3 |
| not_mentioned | 156 | 156 | 0 |
**감성 점수 53.6 → 58.3** (언급 84건, 변동 없음). 리포트 `Viewclinic_QB_Sentiment.md` 를 v0.2로 다시 만들었다.
haewon 라벨 29건 대비 일치율은 75% → 93%(27/29)다. 앞서 적은 대로 **이 값은 확정 근거가 아니다.** 규칙을 이 표본의 불일치에서 뽑았기 때문이다.
### R4-a·R6 시험 투입과 철회 (같은 날)
R4 과적용(C-12 perplexity)과 A-03을 고치려고 규칙 두 개를 더 넣고 240건을 다시 판정했다. 결과는 나빠졌다.
| 회차 | 규칙 | haewon 라벨 대비 (참고값) |
|---|---|---|
| v0.1 | 기본 정의만 | 75% (22/29) |
| v0.2 | R1~R5 | 93% (27/29) |
| v0.3 시험 | R1~R5 + R4-a + R6 | **89% (26/29)** |
- **R4-a**(목록에 있어도 결론에서 대상 병원이 빠지면 positive 아님)는 C-12 perplexity를 고쳤으나 **C-12 openai를 반대로 틀었다.**
- **R6**(결론 없는 카탈로그는 neutral)은 목표한 A-03을 고치지 못했고 **A-02 perplexity를 새로 틀었다.**
규칙을 하나 더할 때마다 하나 고치고 하나 깨진다. n=29에서 75%·93%·89%는 표준오차(약 ±6%p) 안이다. **규칙은 R1~R5에서 멈춘다.** R4-a와 R6은 철회했고, 남은 불일치 2건(C-12 perplexity, A-03)은 사람 판단의 경계로 보고 2차 보정에서 새 표본으로 다시 본다.
시험분은 폐기했고, 최종 데이터는 v0.2 판정(R1~R5 프롬프트)에 §2-1 탐지기를 다시 적용해 만들었다. 탐지기는 결정론적 후처리라 API 재호출이 필요 없다. 이 회차의 총 API 비용은 $1.70이다(v0.2 $0.79 + R4-a·R6 시험 $0.91).
### 최종 수치 (v0.3)
| 항목 | v0.1 | v0.3 |
|---|---|---|
| 언급 | 84 | **83** |
| 감성 점수 | 53.6 | **58.4** |
| positive / neutral / mixed / negative | 14 / 57 / 10 / 3 | 20 / 57 / 0 / 6 |
| 약한 언급 | 3(오탐 포함) | **1**(G-08 openai) |
약한 언급 1건을 빼면 언급 82건 · 감성 점수 57.9다. 리포트에 두 값을 함께 적었다.
**mixed가 240건 전체에서 0건이다.** haewon 라벨에도 mixed가 없었으므로 방향은 맞지만, R2가 과하게 좁혔을 수 있다. 2차 보정 표본에 mixed 후보가 하나도 없으면 판정값 자체를 없앨지 정한다.
## 6. haewon이 정할 것
- **부정의 범위**: "후기 광고 논란"처럼 사실이지만 병원에 불리한 언급을 negative로 볼지, 규제 사실 서술은 neutral로 볼지. 초안은 negative다.
- **mixed 처리**: 점수에서 25점으로 셀지, 제외할지. 초안은 25점. 1차 보정에서 haewon 라벨에 mixed가 한 건도 없었다(29건 중 0건). R2로 mixed 조건을 좁혔으므로 재판정 후 mixed 건수를 보고 25점 유지 여부를 정한다.
- **다른 병원 추천 문맥**: 대상 병원이 언급되지 않고 경쟁 병원만 추천된 답변을 별도 지표(경쟁 노출)로 셀지.
- **R5와 R6의 경계** (v0.2 추가): 병원 홍보 문구가 인용된 답변에서 A-02는 positive, A-03은 neutral로 갈렸다. 질문 성격으로 가를지(평가 요청 대 사실 조회), 답변에 종합 서술이 있는지로 가를지 확정이 필요하다.
- **약한 언급 처리**: §2-1 탐지기로 오탐을 걷어내니 진짜 약한 언급은 **1건**(G-08 openai)뿐이다. "View", "Wooa", "Wish PS" 가 병원 목록으로 나열된 영어권 커뮤니티 인용이다. 현재는 **언급으로 세고 표시**해 두었고, 리포트에 제외 점수(57.9)를 함께 적는다. 1건이라 어느 쪽으로 정해도 점수는 0.5점 움직인다. haewon 확정 필요.
- **mixed 값 유지 여부**: R2 적용 후 240건 중 mixed가 0건이다. 판정값에서 mixed를 빼고 positive/neutral/negative 셋으로 갈지 정한다.
- **R4-a·R6 재시도 여부**: 이번에 철회했다(§5). 2차 보정 표본에서 같은 유형이 반복되면 그때 다시 본다.

View File

@ -0,0 +1,102 @@
# 다음 세션 핸드오버 · 2026-09-12 · INFINITH AI Discovery Product 빌드
작성 2026-09-11 · 작성자 Claude (haewon 세션) · 상태: 초안(haewon 검토 전)
하위 문서: 서포터즈 사이트 빌드 절차 `~/orca/workspaces/INFINITH/Productize/docs/NEXT_SESSION_2026-09-12_PRODUCT_BUILD.md`, 자동 빌드 상세 `…/NEXT_SESSION_SUPPORTERS_AUTOBUILD_v3.md`, 자동 채점 `docs/AI_DISCOVERY_BUILD2_HANDOVER.md`, 회고 `docs/INFINITH_AI_Discovery_Retrospective_2026-09-08.md`.
## 0. 세션 시작 시 붙여 넣을 프롬프트
```
INFINITH AI Discovery Product 빌드 세션. 제품은 "병원 URL 하나 → AI 답변 준비도 진단(AEO/GEO v2) → 서포터즈 사이트 자동 빌드(글·영상·뉴스룸·회복 일정 플래너·오시는 길) → 병원 확인·재빌드 → 측정(질문뱅크·감성·GA4·크롤러 로그)" 파이프라인이다.
코드 위치: 프런트·스크립트·문서는 메인 체크아웃 ~/Claude/Agentic Marketing/INFINITH (브랜치 feature/ai-sentiment-rubric, 프로덕션 main → infinith-demo.vercel.app),
워커·템플릿·큐는 워크트리 ~/orca/workspaces/INFINITH/Productize (브랜치 feature/supporters-autobuild), 랜딩 리드 CTA 는 브랜치 feature/discovery-url-cta(미머지).
먼저 docs/NEXT_SESSION_2026-09-12_AI_DISCOVERY_PRODUCT.md 를 읽고, §1 표의 "확인" 칸을 git log·Supabase 로 실제 확인한 뒤, §5 결정 대기의 답을 받고 §4 순서대로 진행한다.
원칙: 근거 없는 사실은 생성하지 않는다("확인 대기"). 사람 게이트(의학 검토·게시 승인·이미지 육안·채널 확인·구조 기준선)는 자동화하지 않는다. 언급률·점수는 "스키마를 넣으면 인용된다"고 약속하지 않는다(정직성 규약).
고객 화면에 운영자 어휘 금지. 존댓말, 엠대시 금지(커밋 메시지 포함), 은유 금지, 흰 배경 위 연보라 텍스트 금지(인디고 #1D0024). INFINITH 리포트 PDF 는 PPTX 덱(infinith-deck 스킬)으로 만든 뒤 변환한다.
클라이언트 격리: INFINITH 문서·코드에 다른 서비스 이름을 쓰지 않는다. 산출 전 grep.
```
## 1. 제품 여정과 현재 상태
| 단계 | 고객이 보는 것 | 구현 | 위치 | 상태 |
|---|---|---|---|---|
| 1 진입 | `/discovery` 랜딩, "URL 입력으로 시작" | `DiscoveryLandingPage.tsx`, `DiscoveryLeadModal` → Supabase `discovery_leads` | 메인, 브랜치 feature/discovery-url-cta | 프리뷰만. **미머지, 마이그레이션 `20260831_discovery_leads.sql` 적용 여부 확인** |
| 2 진단 | `/discovery/:id` 리포트 (AEO 100 + GEO 100, v2 기준표), 덱·PDF | `scripts/audit_aeo_geo.py`(auto 22항목) → `src/data/discovery_<id>.ts``DiscoveryReportPage.tsx`; `scripts/build_discovery_report.ts` → HTML/PDF; 덱 빌더 `docs/reports/<clinic>/01_readiness_report/build_*_deck*.py` | 메인 + Productize(v2 기준표 `src/data/aeoGeoRubricV2.ts`, `src/lib/discoveryScoreV2.ts`) | 반자동. 결과가 소스 파일 커밋 방식이라 병원마다 코드 배포가 필요하다. **v2 기준표가 main(프로덕션)에 머지됐는지 확인** |
| 3 서포터즈 사이트 | `supporters-<clinic>.vercel.app` 미리보기(noindex): 글·영상·뉴스룸·방문 안내(지도·길찾기)·회복 일정 플래너 `/plan`·`/en/plan` | 워커 `workers/supporters-build/run.mjs` 15단계(evidence→…→tourism→recovery→planner→…→deploy), 템플릿 `templates/supporters-astro`, 게이트 `scripts/gate/rules.mjs` | Productize | 동작. 뷰(수작업 샘플 `view-supporters-sample`)·원진·오라클 3곳 배포. 병원당 약 $0.6, 30분 |
| 4 병원 확인 | `/supporters/:id` 또는 리포트 안 `ClinicInputsPanel`: 채널 확인, 의료진, 검토·승인, 자유 답변 | Supabase `supporter_builds`·`supporter_inputs`, `apply_inputs.mjs`, 재빌드 `run.mjs --from data --from-supabase --build-id` | 메인(UI) + Productize(반영) | 동작하되 **재빌드 자동 트리거 없음**(supporter_inputs insert → 큐 연결 필요) |
| 5 운영 | 큐 → 빌드 → 미리보기 링크 | `poll.mjs` + Mac launchd 5분 폴러, `supporter_builds` 큐 | Productize | 파일럿 수준. Mac 이 켜져 있어야 돈다. 실제 랜딩 신청 1건이 큐 → 완주까지 간 적 없음 |
| 6 측정 | 질문뱅크 언급률(2엔진), 감성, GA4 AI 유입, AI 크롤러 히트, 공식 vs 서포터즈 재채점 | `scripts/run_question_bank_openai.py`·`merge_qb_results.py`·`sentiment_qb.py`·`ga4_ai_traffic.py`, `data/ai_channels.json`, 리포트 Integrity 절 "측정 가능 범위" | 메인(QB·감성) + Productize(GA4) | 스크립트 단위. 리포트 카드 자동 갱신 없음. GA4 는 GCP 계정 대기 |
| 7 계약·가격 | 상담 기반 계약 | 가격 문서 `docs/INFINITH_가격정책_사업부보고서_v1.1.docx`(2026-04, 이전 제품 INSIGHT/INTELLIGENCE 티어), AI Discovery 가격 제안은 `docs/INFINITH_vs_FrostAI_비교_및_가격제안_2026-09-08.html` | 메인 | **AI Discovery 전용 티어 미확정** |
2026-09-10~11 추가: 회복 일정 플래너(설계 v0.2 §13, 관광공사 데이터 합침), 오시는 길 지도·길찾기, 전역 언어 전환·영어 홈(뷰), 모바일 헤더. 전부 템플릿·워커에 통합됨.
## 2. 코드·브랜치·배포 지도
| 무엇 | 어디 | 브랜치 | 배포 |
|---|---|---|---|
| 제품 프런트(랜딩·리포트·확인 패널) | 메인 `src/` | main(프로덕션), feature/ai-sentiment-rubric(감성·플래너 작업), feature/discovery-url-cta(리드 CTA) | `infinith-demo.vercel.app` (main 에서 `vercel --prod`, Gitea 자동 트리거 없음) |
| 채점·질문뱅크·감성·리포트 스크립트 | 메인 `scripts/`, `docs/reports/` | feature/ai-sentiment-rubric | 로컬 실행 |
| 워커·템플릿·게이트·GA4 뼈대·v2 기준표 | Productize `workers/`, `supporters/`, `templates/`, `scripts/fetch_medical_tourism.py` | feature/supporters-autobuild | 병원별 `supporters-<clinic>` (워커가 강제 link) |
| 뷰 수작업 샘플 | 메인 `supporters/` | feature/ai-sentiment-rubric | `view-supporters-sample` 수동 |
| Supabase | `supabase/migrations/` (`supporter_builds`, `supporter_builds_queue`, `discovery_leads`) + Edge Functions(기존 리포트 파이프라인) | 메인 | 적용 상태 확인 필요(CLI 토큰 만료 이력) |
| 키 | Productize `.env`(TOUR_API·NAVER·OPENAI·YOUTUBE), 메인 `.env`(진단·QB) | | 회사 계정. 세션 시작 때 `grep -E "^KEY=." .env` 로 값 존재만 확인 |
세 브랜치는 서로 머지되지 않았다. `supporters/` 폴더가 양쪽에 있고 Base.astro 구현이 다르다(메인: i18n.ts 전역 전환·영어 홈; Productize: langswitch·영어 입구 /en/plan). 플래너·지도·헤더 CSS 는 같다.
## 3. 지금 되는 것 / 안 되는 것 (한 줄씩)
되는 것
- 병원 이름·URL 로 채널 발견·근거 수집·자동 채점·리포트 HTML/PDF·덱(뷰·원진·오라클·태하 사례).
- 워커 한 번으로 서포터즈 사이트 초안 발행(글 6~8편, 영상, 뉴스룸, 이미지 규칙, 지도, 플래너, 관광공사 데이터). 게이트 41건 테스트.
- 병원 확인 패널 입력 → 수동 재빌드.
- 질문뱅크 120문항 2엔진 실측, 감성 판정, Before/After 페이지(`scripts/build_before_after.py`).
안 되는 것
- 랜딩 신청 → 큐 → 빌드 → 미리보기 링크 회신이 사람 손 없이 이어지지 않는다(리드 테이블과 큐가 분리, CTA 브랜치 미머지).
- 진단 결과가 코드 파일(`discovery_<id>.ts`)이라 병원마다 프런트 배포가 필요하다. 런타임 데이터(Supabase 또는 JSON 스토리지)로 옮겨야 "URL 입력 → 리포트 링크"가 된다.
- 측정 지표가 리포트 카드에 자동으로 들어가지 않는다(스크립트 산출물을 사람이 옮긴다).
- 워커가 Mac 에 묶여 있다. 규칙표 잠정값·큐레이션 장소·의료진 후보·이미지·채널 12건은 사람 확인 대기.
- AI Discovery 가격·계약 조건 미확정. 랜딩 FAQ 의 해지·환불 항목 삭제 상태.
## 4. Product 빌드 순서 (권장)
1. **브랜치 정리**: `main` 기준으로 feature/supporters-autobuild(워커·템플릿·v2 기준표·GA4) → feature/ai-sentiment-rubric(감성·플래너·지도·설계 v0.2) → feature/discovery-url-cta(리드 CTA) 순으로 머지. 충돌 지점은 `supporters/`(Base.astro 두 구현)와 `src/data/aeoGeoRubric*`·`discoveryScoreV2`. 결정: `supporters/` 는 템플릿(Productize) 구현을 정본으로 하고 뷰 샘플은 워커 폴더로 옮긴다(§5-4).
2. **리드 → 큐 연결**: `discovery_leads` 마이그레이션 적용 → insert 시 `supporter_builds` 큐에 행 생성(DB 트리거 또는 폴러가 leads 도 읽기) → 워커가 evidence 부터 완주 → 미리보기 URL 을 `supporter_builds.preview_url` 에 기록 → 신청자에게 링크 회신(초기에는 수동 메일, `o2oteam@o2o.kr`).
3. **진단 결과 런타임화**: `audit_aeo_geo.py` 출력 JSON 을 Supabase(`discovery_results`) 또는 스토리지에 저장하고 `/discovery/:id` 가 런타임에 읽는다. 기존 `DISCOVERY_RESULTS` 레지스트리는 샘플(뷰) 전용으로 남긴다. 사람 판정(v2Results 4항목)은 확인 패널에서 입력.
4. **재빌드 자동화**: `supporter_inputs` insert → 큐 → `run.mjs --from data --from-supabase`. 색인 허용 빌드(`PUBLIC_INDEXABLE=true`)는 `approvedAt` 있는 글만 낸다는 규칙 유지.
5. **측정 카드**: 질문뱅크·감성·GA4·크롤러 히트 결과를 `discovery_results` 에 붙이고 리포트 Integrity 절과 Before/After 에 자동 표시. 언급률은 신뢰구간과 함께.
6. **운영 이관**: Mac launchd 폴러 → Trigger.dev(또는 동등)로. 키·비용 로그(`status.json` costUsd)·실패 알림.
7. **가격·계약**: AI Discovery 티어(진단만 / 진단+서포터즈 / +측정·관리) 확정, 랜딩 FAQ·계약서·해지 조건. FrostAI 비교 문서의 제안을 출발점으로.
8. **다음 병원**: 톡스앤필·차앤박(피부과), 레지스트리 73곳 중 회귀 병원. 한 화면 비교 산출물은 만들지 않는다.
## 5. haewon 결정 대기
1. **Product 1.0 범위**: (a) 진단 리포트만, (b) 진단 + 서포터즈 사이트 초안, (c) b + 측정·관리 구독. 랜딩 CTA 의 약속 범위가 달라진다.
2. **가격 티어**(§4-7)와 계약 최소 기간·해지 조건(2026-04 문서의 P0 두 항목이 그대로 미결).
3. **뷰 샘플 통일**: 메인 `supporters/` 를 워커 폴더(`~/supporters-builds/viewclinic`)로 옮기고 `view-supporters-sample` 을 워커 배포로 바꿀지. 옮기면 뷰의 영어 홈 `/en` 은 템플릿에 없으므로 템플릿에 영어 홈을 추가할지 함께 결정.
4. **법무**: 외국인환자 유치업 등록 여부(플래너·숙소 링크), 의료광고 사전심의 대상 여부, 지원 관계 고지 문구(sponsorNotice). 이 세 가지는 색인 허용 전환의 전제.
5. **도메인**: 별도 도메인 vs 병원 서브도메인(설계 v0.1 §3 2안). 서포터즈 실명 모집 방식.
6. **워커 호스팅**과 GCP 계정(GA4 서비스 계정).
7. **규칙표 잠정값**: 뷰·원진·오라클 `procedures.json` 의 provisional 값(출국 최소일·입원·실밥)을 병원 확인 뒤 공개할지, 공개 전까지 "병원 확인 전" 배지로 둘지.
8. 서포터즈 빌드 하위 결정(하위 문서 §4)과 오라클 핸드오버 §3 미결은 그대로.
## 6. 함정 (제품 관점)
- **한 Vercel 프로젝트에 두 폴더**: 2026-09-11 Productize/supporters 와 메인 supporters 가 같은 프로젝트에 배포해 `/plan` 이 404 됐다. 지금은 Productize 쪽 연결을 껐다. 배포는 병원 폴더와 메인 supporters 에서만.
- **세 브랜치 분산**: 같은 파일(`supporters/`)이 두 브랜치에서 다르게 진화했다. 머지 전에 "템플릿이 정본"을 정하고 뷰 샘플을 옮긴다.
- **진단 결과가 코드**: `discovery_<id>.ts` 커밋 방식은 병원 수가 늘면 배포 병목이다(§4-3).
- **게이트는 고객 화면 전체를 본다**: 운영 어휘("실측"·"API 집계"·"임베드")가 데이터 값을 타고 화면에 나가면 빌드가 막힌다. 운영 기록은 데이터에만.
- **원문 문장은 걸러야 한다**: 병원 페이지 원문 32문장 중 14건이 홍보문·정형 고지였다. 워커 planner 단계 필터(CARE/NOT_CARE) 없이는 "병원 안내 기준" 배지가 의료광고 위반이 된다.
- **헤드리스 크롬 모바일 캡처**: 창 최소 폭 때문에 400px 직접 캡처가 틀린다. 1280 창 안 390px iframe 하네스로.
- **lint**: 메인 체크아웃은 한때 tsc 가 없어 `npm run lint` 가 가짜 통과였다. 실제 0 에러인지 `npx tsc --noEmit` 로 본다.
- **엠대시·타 서비스 이름**: 커밋 메시지와 문서에서 두 번 잡혔다. 산출 전 엠대시 검색(`grep -cP "\x{2014}"`)과 타 서비스명 격리 grep(전역 CLAUDE.md 의 목록).
## 7. 파일 참조
- 진단: `src/data/aeoGeoRubricV2.ts`, `src/lib/discoveryScoreV2.ts`, `src/pages/DiscoveryReportPage.tsx`, `scripts/audit_aeo_geo.py`, `docs/AEO_GEO_RUBRIC_v2.md`
- 랜딩·리드: `src/pages/DiscoveryLandingPage.tsx`, `src/components/discovery/`, `supabase/migrations/20260831_discovery_leads.sql`
- 확인 패널·큐: `src/components/discovery/ClinicInputsPanel.tsx`, `src/pages/SupportersBuildPage.tsx`, `supabase/migrations/20260907_supporter_builds*.sql`
- 워커·템플릿: Productize `workers/supporters-build/`, `supporters/scripts/`, `templates/supporters-astro/`, 브리프 `supporters/briefs/<clinic>/`
- 플래너·지도: 템플릿 `src/components/Planner.astro`·`VisitMap.astro`, `src/lib/plan.ts`·`tour.ts`, `supporters/scripts/build_planner_data.mjs`, 설계 `docs/INFINITH_Viewclinic_Supporters_Site_Design_v0.2.md` §13
- 측정: `scripts/run_question_bank_openai.py`, `scripts/sentiment_qb.py`, `docs/AI_ANSWER_SENTIMENT_RUBRIC_v0.1.md`, Productize `scripts/ga4_ai_traffic.py`, `data/ai_channels.json`
- 가격·경쟁: `docs/INFINITH_vs_FrostAI_비교_및_가격제안_2026-09-08.html`, `docs/INFINITH_가격정책_사업부보고서_v1.1.docx`
- PRD: `docs/prd/INFINITH_AI-Discovery_PRD_20260828_v02.md`, `docs/prd/INFINITH_Global_Medical_Hub_PRD_v0.1.html`(Productize 에 v0.2), `docs/prd/INFINITH_Dermatology_Supporters_PRD_v0.1.html`

View File

@ -8,7 +8,8 @@ docs/reports/
│ ├── 01_readiness_report/ AI Answer Readiness 진단 덱 (v1.0 정본 · v2_표준캔버스 · v1.1 정정판) + 빌더
│ ├── 02_poc_proposal/ POC 제안서 덱 (정본 · v3 · v3_표준캔버스) + 빌더
│ ├── 03_question_bank/ 질문 뱅크 120문항 · ChatGPT/Perplexity 실측 결과 · TOP50 엑셀
│ └── 04_supporters/ 서포터즈 GEO 개선 계획 · 2단계 콘텐츠 기획 · 서포터즈 vs 공식 AEO 감사 엑셀
│ ├── 04_supporters/ 서포터즈 GEO 개선 계획 · 2단계 콘텐츠 기획 · 서포터즈 vs 공식 AEO 감사 엑셀
│ └── 05_global_en/ 영문 사이트(viewplasticsurgery.com) 외국인 관점 AEO/GEO 진단 (2026-09-10) · 영문 60문항 뱅크 · Perplexity/OpenAI(뉴욕) 실측 · HTML/PDF 보고서 + 빌더
├── taeha/ 태하 AI Answer Readiness 리포트 (html · pdf · pptx) + 빌더
├── ibk/ 기업은행 블로그 AEO/GEO 감사
└── landing/ AI Discovery 랜딩 시안 (픽셀 정답 HTML) · 스크린샷 · 리포트 페이지 HTML 내보내기 스크립트

View File

@ -0,0 +1,81 @@
# AI 답변 감성 판정 결과 · 뷰성형외과
판정 2026-09-09 · 기준표 v0.3(`docs/AI_ANSWER_SENTIMENT_RUBRIC_v0.3.md`) · 모델 gpt-4.1 · 답변 240건
감성 점수 = (positive×100 + neutral×50 + mixed×25 + negative×0) ÷ 언급된 답변 수. 규제 언급률과 추천율은 언급된 답변 기준.
## 1. 엔진별
| 엔진 | 질문군 | 답변 | 언급 | 감성 점수 | 긍정 | 중립 | 혼합 | 부정 | 부정 비율 | 규제 언급률 | 추천율 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| openai | 전체 | 120 | 44 | **64.8** | 16 | 25 | 0 | 3 | 6.8% | 6.8% | 36.4% |
| openai | 브랜드(A·B) | 22 | 22 | **54.5** | 3 | 18 | 0 | 1 | 4.5% | 4.5% | 13.6% |
| openai | 논브랜드 | 98 | 22 | **75.0** | 13 | 7 | 0 | 2 | 9.1% | 9.1% | 59.1% |
| perplexity | 전체 | 120 | 39 | **51.3** | 4 | 32 | 0 | 3 | 7.7% | 2.6% | 10.3% |
| perplexity | 브랜드(A·B) | 22 | 22 | **52.3** | 2 | 19 | 0 | 1 | 4.5% | 4.5% | 9.1% |
| perplexity | 논브랜드 | 98 | 17 | **50.0** | 2 | 13 | 0 | 2 | 11.8% | 0.0% | 11.8% |
전체 합산: 언급 83/240 · 감성 점수 **58.4** · 부정 비율 7.2% · 규제 언급률 4.8% · 추천율 24.1%
약한 언급 1건(G-08(openai))은 정식 상호 없이 영문 약칭만 나온 답변이다. 이를 빼면 언급 82건 · 감성 점수 **57.9**. 포함 여부는 기준표 §6 미결이다.
## 2. 측면 태그 (언급된 답변)
- procedure: 39건
- access: 39건
- reviews: 33건
- doctors: 29건
- safety: 28건
- price: 11건
- media: 8건
- regulatory: 5건
## 3. 부정·혼합 판정 전건 (6건)
| id | 엔진 | 판정 | 종류 | 질문 | 근거 문장 |
|---|---|---|---|---|---|
| A-01 | openai | negative | regulatory | 뷰성형외과 어때? 믿을만한 병원이야? | 그러나 2026년 7월 공정거래위원회의 제재 사례는, 병원 마케팅 방식에 대한 경계가 필요하다는 점을 보여줍니다. |
| C-11 | openai | negative | regulatory | 후기 제일 많은 강남 성형외과 어디야? | 예컨대 ‘뷰성형외과’, '에이비성형외과의원', '디에이성형외과'는 후기를 조건으로 수술비 일부를 할인해 주고 광고처럼 이용한 사례로 지적된 바 있습니다 ([v.daum.net](https://v.daum.net/v/ |
| G-02 | openai | negative | regulatory | 뷰성형외과 부작용 후기나 안 좋은 얘기 있어? | 뷰성형외과가 수술비 할인 등 대가를 제공하고, 이를 '자발적인 후기'로 위장하여 광고한 혐의로 공정거래위원회의 시정명령을 받았습니다. |
| A-12 | perplexity | negative | regulatory | 뷰성형외과 단점이나 주의할 점 있어? | 공정거래위원회가 뷰성형외과를 포함한 강남 성형외과들의 *수술비 할인 등 대가를 받고 작성한 후기를 자발적 후기처럼 보이게 한 행위*를 제재했습니다. |
| D2-01 | perplexity | negative | reputation | 뷰성형외과 눈성형 어때? | 다만 제가 확인한 자료만으로는 **수술 결과의 일관된 객관성**까지 판단하긴 어렵고, 커뮤니티에는 상담 경험에 대한 **부정적 의견도 일부** 보입니다.[6] |
| G-02 | perplexity | negative | reputation | 뷰성형외과 부작용 후기나 안 좋은 얘기 있어? | 네. 검색 결과만 보면 **뷰성형외과에 대한 안 좋은 후기나 부작용 언급은 있습니다**. |
## 4. 논브랜드 질문에서 긍정 언급 (15건, 가장 가치 있는 신호)
| id | 엔진 | 추천 | 질문 | 근거 문장 |
|---|---|---|---|---|
| C-01 | openai | recommended | 강남 성형외과 추천해줘 | The Door Plastic Surgery, View Plastic Surgery 등도 평점 4.8로 높은 평가받고 있습니다 ([gangnambeautyguide.com](https://gangnambeautygu |
| C-02 | openai | recommended | 강남에서 가슴성형 잘하는 병원 어디야? | 뷰성형외과  - 협진 체계, 안전 장비, 1:1 진료 및 사후관리 강조 |
| C-04 | openai | recommended | 코성형 잘하는 강남 병원 추천해줘 | 뷰성형외과 강남 | 협진 시스템, 맞춤 설계, 대학병원급 안전 시스템 |
| C-06 | openai | recommended | 강남 성형외과 톱5 알려줘 | - 평점: 4.8 / 리뷰수: 약 9,167건 ([gangnambeautyguide.com](https://gangnambeautyguide.com/en/clinics/?utm_source=openai))
- 강 |
| C-08 | openai | recommended | 마취과 전문의가 상주하는 강남 성형외과 어디야? | - 안면윤곽, 눈·코·가슴 성형 등을 전문으로 하며, **마취과 전문의가 365일 상주**하고 있다는 점을 강조합니다 ([blog.viewclinic.com](https://blog.viewclinic.com/?ut |
| C-12 | openai | recommended | 강남언니에서 평점 높은 성형외과 알려줘 | **팝성형외과**, **티에스성형외과**, **기린성형외과**, **제이필의원**, **뷰성형외과**, **뭐 등 다양한 병원들이 높은 평점을 보이고 있습니다. |
| D1-01 | openai | recommended | 뷰성형외과 가슴성형 잘해? | 뷰성형외과는 가슴성형 분야에서 경험, 전문성, 안전성, 사후관리 체계를 갖춘 병원으로 평가됩니다. 많은 환자들이 만족스럽다는 후기도 많으며, 개인의 체형·희망·상태에 맞춘 맞춤 상담과 전문적인 진료 흐름이 강점입니다 |
| D2-01 | openai | recommended | 뷰성형외과 눈성형 어때? | 장점:
- 높은 평점(4.7)과 JCI 인증, 다국어 지원으로 의료 신뢰도 높음 ([getcarekorea.com](https://getcarekorea.com/ko/hospitals/view-plastic-surg |
| D4-01 | openai | recommended | 뷰성형외과 안면윤곽 잘하는 곳 맞아? | 전반적으로, 뷰성형외과는 안면윤곽 수술에 있어 안전성과 전문성을 갖춘 병원으로 평가받고 있습니다. 특히 수술 기법과 시스템, 다수의 수상 경력과 방송 노출 경력 등이 신뢰감을 줍니다. |
| E-09 | openai | recommended | 뷰성형외과 안전 시스템 어때? | 이처럼 뷰성형외과는 **환자 안전을 위한 다층적인 시스템과 기준**을 두고 있습니다. |
| G-01 | openai | recommended | 뷰성형외과 실제 후기 어때? | 뷰성형외과는 **높은 만족도와 전문성을 갖춘 대형 병원**으로 평가되며, 특히 자연스럽고 정밀한 결과를 원하는 환자들에게 긍정적인 선택이 될 수 있습니다. 다만, 상담 경험은 대기 시간과 상담 시간의 한계가 있을 수 |
| G-07 | openai | recommended | 뷰성형외과는 뭘로 유명한 병원이야? | 뷰성형외과는 특히 **가슴성형 분야의 압도적인 시술량**, **안전에 대한 철저한 시스템**, **원스톱 프리미엄 케어**, 그리고 **외국인 환자를 위한 의료관광 서비스**로 높은 평판을 자랑합니다. |
| G-08 | openai | recommended | 가슴성형 후기 많은 병원 어디야? | 또한, “View”, “Wooa”, “Wish PS” 등도 리뷰량과 자체 B&A(전후 사진)가 많아 실제 경험 공유가 활발한 곳으로 언급됩니다 ([reddit.com](https://www.reddit.com/r/S |
| C-12 | perplexity | recommended | 강남언니에서 평점 높은 성형외과 알려줘 | **뷰성형외과의원****9.5점**, 후기 수는 검색 결과에 일부만 보입니다.[3] |
| G-07 | perplexity | recommended | 뷰성형외과는 뭘로 유명한 병원이야? | 뷰성형외과는 가슴성형, 안면윤곽, 양악수술, 눈·코성형 등 여러 성형 분야를 고르게 하는 곳으로 알려져 있고, 특히 안전 중심 운영과 무사고 기록을 강조해 유명합니다.[1][11][13] |
## 5. 언급 판정 불일치 (판정기 vs 추출기) 1건
- C-14 openai: 판정기 False / 추출기 True ·
## 6. 측정 가능 범위
- 재는 것: 질문 뱅크 문항에 대한 공식 API 답변 안에서 대상 병원 문장의 어조. 엔진은 ChatGPT(gpt-4o + 웹 검색)·Perplexity(sonar).
- 재지 않는 것: 소비자 화면(chatgpt.com 등)의 실제 답변. 약관상 자동 조회를 하지 않으므로 API 답변과 화면 답변은 다를 수 있다.
- 재지 않는 것: Google AI Overview·네이버 AI 브리핑·Gemini 의 어조. 다음 회차에 엔진을 추가할 때 같은 기준표로 잰다.
- 한계: 판정기는 언어 모델이다. 보정(§7) 전 점수는 참고값이고, 보정 후에도 문항 수(언급 84건)가 적어 ±10점은 우연 범위로 본다.
## 7. 보정
기준표 `v0.3` 로 판정했다. 1차 보정(2026-09-09)에서 haewon 라벨 29건 대비 v0.1 일치율은 75%로 기준선 80%에 미달했고, 불일치 7건에서 규칙 R1~R5를 뽑아 판정기에 반영한 것이 이 회차다.
같은 30건으로 다시 잰 일치율은 규칙을 그 표본에 맞춰 고친 결과이므로 확정 근거가 아니다. 기준표 확정은 새로 뽑은 30건의 2차 보정으로 한다. 자세한 이력과 한계는 `docs/AI_ANSWER_SENTIMENT_RUBRIC_v0.2.md` §5에 있다.

View File

@ -0,0 +1,135 @@
# VIEW Plastic Surgery EN Question Bank results: openai
Measured 2026-09-10 / 60 questions
| # | Question | VIEW mentioned | Rank | Sentiment | Clinics (in order) | Cited domains |
|---|---|---|---|---|---|---|
| A-01 | Is VIEW Plastic Surgery in Seoul legit? Is it a trustworthy clinic for foreigners? | O | 1 | positive | VIEW Plastic Surgery | forum.purseblog.com, gangnamclinicindex.com, medtraveling.com, realself.com, reddit.com, seoulclinics.io |
| A-02 | Tell me about VIEW Plastic Surgery in Gangnam, Korea. What are they known for? | O | 1 | positive | VIEW Plastic Surgery | english.visitkorea.or.kr, medicaltour.gangnam.go.kr, realself.com, reddit.com, viewplasticsurgery.com, youtube.com |
| A-03 | What procedures does VIEW Plastic Surgery Korea specialize in? | O | 1 | positive | VIEW Plastic Surgery | english.visitkorea.or.kr, kmhglobal.com, viewplasticsurgery.com |
| A-04 | Who is Dr. Choi Soon Woo of VIEW Plastic Surgery? Is he board certified? | O | 1 | positive | VIEW Plastic Surgery | khunkim.com, viewplasticsurgery.com |
| A-05 | How many surgeons does VIEW Plastic Surgery have and are they all board-certified plastic surgeons? | O | 1 | positive | VIEW Plastic Surgery | assets.website-files.com, khunkim.com, reddit.com, viewplasticsurgery.com |
| A-06 | Does VIEW Plastic Surgery have English-speaking staff or interpreters? | O | 1 | positive | VIEW Plastic Surgery | assets.website-files.com, docentpro.com, forum.purseblog.com, khunkim.com, viewplasticsurgery.com |
| A-07 | How long has VIEW Plastic Surgery been operating and how big is the clinic? | O | 1 | neutral | VIEW Plastic Surgery | assets.website-files.com, english.visitkorea.or.kr, experts-beauty.com, icloudhospital.com, inflo.kr, viewplasticsurgery.com |
| A-08 | VIEW Plastic Surgery Korea reviews from international patients: what do foreigners say? | O | 1 | positive | VIEW Plastic Surgery, Girin Plastic Surgery, AB Plastic Surgery | inkoreanow.com, kclinichelp.com, patients.community, realself.com, reddit.com, viewplasticsurgery.com |
| B-01 | Where is VIEW Plastic Surgery located and how do I get there from Incheon Airport? | O | 1 | - | VIEW Plastic Surgery | english.seoul.go.kr, incheon.go.kr, ivisitkorea.com, jusofind.kr, origin.viewplasticsurgery.com, reddit.com |
| B-02 | Does VIEW Plastic Surgery offer airport pickup for international patients? | O | 1 | positive | VIEW Plastic Surgery | viewplasticsurgery.com |
| B-03 | What are VIEW Plastic Surgery's opening hours and can I book a consultation online from abroad? | O | 1 | positive | VIEW Plastic Surgery | jp.viewplasticsurgery.com, reddit.com, stmstyle.com, viewplasticsurgery.com |
| B-04 | Can I contact VIEW Plastic Surgery via WhatsApp or LINE for a consultation? | O | 1 | - | VIEW Plastic Surgery | 10mag.com, reddit.com, viewplasticsurgery.com, x.com |
| B-05 | Does VIEW Plastic Surgery provide accommodation or hotel partnerships for foreign patients? | O | 1 | positive | VIEW Plastic Surgery | medicaltour.gangnam.go.kr, reddit.com, viewplasticsurgery.com |
| B-06 | How long should I stay in Seoul after plastic surgery before flying home? | X | - | - | (none) | |
| B-07 | Do I need a medical visa for plastic surgery in Korea as a tourist? | X | - | - | (none) | |
| B-08 | Which Gangnam plastic surgery clinics are closest to Sinnonhyeon Station? | O | 6 | neutral | JUST Plastic Surgery Clinic, 1 mm Plastic Surgery Clinic, 345 Plastic Surgery Clinic, Thank You Plastic Surgery Clinic, BETWEEN Plastic Surgery, VIEW Plastic Surgery, Noonopi Plastic Surgery, IK Plastic Surgery | en.ikplastic.com, eng.btwps.com, medi-spec.com, noonopiclinic.com, reddit.com, rightme.kr |
| C-01 | Best plastic surgery clinic in Seoul for foreigners | X | - | - | JK Plastic Surgery Center, ID Hospital, Banobagi Plastic Surgery, SAERO Plastic Surgery, AB Plastic Surgery, NANA Plastic Surgery Hospital, SNUPS Clinic, JW Plastic Surgery Center | clinicseoul.net, english.visitkorea.or.kr, kclinichelp.com, koreaexperience.com, reddit.com, seoulmedicalinsider.com |
| C-02 | Best breast augmentation clinic in Korea for international patients | X | - | - | SAERO Plastic Surgery, JW Plastic Surgery Center, The Plus Plastic Surgery, AB Plastic Surgery, UNE Plastic Surgery, Global Plastic Surgery, Opera Plastic Surgery, JK Plastic Surgery Centre | clinicrankingkorea.com, kclinichelp.com, medicaldepartures.com, medicaltravelkorea.com, my1health.com, realself.com |
| C-03 | Top facial contouring and V-line surgery clinics in Gangnam | O | 3 | positive | JK Plastic Surgery, Banobagi Plastic Surgery, VIEW Plastic Surgery, BRAUN Plastic Surgery, GIRIN Plastic Surgery, 345 Plastic Surgery, Ipche Plastic Surgery, Made Young Plastic Surgery Clinic | gangnambeautyguide.com, gangnamdrk.com, medtraveling.com, misooda.com, plasticsurgeryko.com, topclinicseoul.com |
| C-04 | Best rhinoplasty surgeon in Seoul for foreigners | O | 7 | positive | AB Plastic Surgery, ONYX Plastic Surgery, WOOA Plastic Surgery & Skin Clinic, Banobagi Plastic Surgery, Girin Plastic Surgery, Onlif Plastic Surgery, Sketch Plastic Surgery, VIEW Plastic Surgery | deesseclinic.com, drsamrizk.com, gangnambeautyguide.com, gangnamwomenshealth.com, kclinichelp.com, koreabeautyclinicrating.com |
| C-05 | Best double jaw surgery clinic in Korea | X | - | - | TJ Plastic Surgery, Sinsang Plastic and Reconstructive Surgery, Brown Eye Medical Clinic, Hannaeve Plastic Surgery, SoonPlus Plastic Surgery, Severance Hospital, Seoul National University Hospital (SNUH), Asan Medical Center | gangnam.dentist, jawsurgerykorea.com, koreaclinicguide.com, plasticsurgeryko.com, us-uk.bookimed.com |
| C-06 | Top 5 plastic surgery clinics in Gangnam, Seoul | O | 5 | positive | 4Ever Plastic Surgery, DA Plastic Surgery, ARC Plastic Surgery, Noselab Clinic, VIEW Plastic Surgery, JW Plastic Surgery, ID Hospital, Lienjang Plastic Surgery | gangnambeautyguide.com, gangnamclinicindex.com, plasticsurgeryko.com |
| C-07 | Compare VIEW Plastic Surgery vs ID Hospital vs Banobagi for facial contouring | O | 1 | positive | VIEW Plastic Surgery, ID Hospital, Banobagi | |
| C-08 | Which Korean plastic surgery clinics use Motiva implants and have the most experience with them? | O | 2 | positive | U&U Plastic Surgery Clinic, VIEW Plastic Surgery, Ryan Plastic Surgery, V Clinic Gangnam, ARC Plastic Surgery Clinic, Verygood Plastic Surgery, NANA Plastic Surgery, Golden Diamant Plastic Surgery | en.nanahospital.com, goldendiamant.com, goodbyeacup.com, realself.com, reddit.com, unupskorea.com |
| C-09 | Safest plastic surgery clinic in Korea with anesthesiologists on staff | X | - | - | AB Plastic Surgery Clinic, JK Plastic Surgery Center, Hannaeve Plastic Surgery Clinic, Faceline Plastic Surgery, Braun Plastic Surgery, Respect Plastic Surgery | braunps.com, hannaeveglobal.com, healthdailysouthkorea.com, icloudhospital.com, jkplastic.com, medicalkorea.or.kr |
| C-10 | Which Seoul plastic surgery clinics are officially recognized for medical tourism by the Korean government? | O | 4 | positive | JK Plastic Surgery Center, HER SHE (HERSHE) Plastic Surgery, Hyundai Aesthetics Plastic Surgery, VIEW Plastic Surgery, HERSHE | data.edmgr.kr, english.visitkorea.or.kr, medical.visitseoul.net, medicalkorea.or.kr, medicaltour.gangnam.go.kr, news.seoul.go.kr |
| C-11 | Best clinic in Korea for double eyelid surgery revision for foreigners | X | - | - | 1MM Plastic Surgery, Etonne Plastic Surgery, Wanna Plastic Surgery, Gangnam Seoyeon Clinic, Symphony Plastic Surgery, Link Plastic Surgery, Motive Plastic Surgery, Ahn Sung Min Plastic Surgery | bookkoreamedical.com, gangnamobgyn.com, gangnamwomenshealth.com, kclinichelp.com, plasticsurgeryko.com, reddit.com |
| C-12 | Large plastic surgery hospitals in Seoul with in-house recovery wards | X | - | - | Banobagi Plastic Surgery Clinic, ID Hospital, JW Plastic Surgery, Dream Medical Group, Grand Plastic Surgery | |
| D-01 | Motiva breast augmentation in Korea: what should I know before booking? | X | - | - | (none) | |
| D-02 | What is Motiva Preserve and which clinics in Korea offer it? | X | - | - | U&U Plastic Surgery Clinic, Ryan Plastic Surgery, Golden Diamant Plastic Surgery, Wooa Medical | goldendiamant.com, goodbyeacup.com, imagepreserve.kr, motiva.health, unupskorea.com, wooamedical.com |
| D-03 | How long is recovery after breast augmentation in Korea before I can fly? | X | - | - | (none) | |
| D-04 | What is the difference between V-line surgery and square jaw reduction? | X | - | - | (none) | |
| D-05 | Double jaw surgery in Korea: recovery timeline and risks for international patients | X | - | - | (none) | |
| D-06 | Incisional vs non-incisional double eyelid surgery in Korea: which is better? | X | - | - | (none) | |
| D-07 | Rhinoplasty in Korea with rib cartilage vs silicone: pros and cons | X | - | - | (none) | |
| D-08 | How is revision rhinoplasty done in Korea and how long do I need to stay? | X | - | - | (none) | |
| D-09 | Facelift in Korea for a 50-year-old: what techniques are used? | X | - | - | (none) | |
| D-10 | Is liposuction in Korea safe and how many days of downtime should I expect? | X | - | - | (none) | |
| D-11 | What does VIEW Plastic Surgery's breast surgery process look like from consultation to aftercare? | O | 1 | positive | VIEW Plastic Surgery | id.viewplasticsurgery.com, viewplasticsurgery.com |
| D-12 | Does VIEW Plastic Surgery do a breast ultrasound or examination before augmentation? | O | 1 | positive | VIEW Plastic Surgery | origin.viewplasticsurgery.com |
| D-13 | Subbrow lift vs upper blepharoplasty: which should I get in Korea? | X | - | - | (none) | |
| D-14 | Mini lift vs full facelift in Korea: cost and recovery | O | 7 | - | SeoulFaceliftClinic, Gangnam.Health, medisou, seoulclinics, Korea Surgeon Hub, Arke Clinic, VIEW Plastic Surgery, arkeplasticsurgery | arkeplasticsurgery.com, gangnam.health, koreaplasticsurgery.org, medisou.com, misooda.com, seoulclinics.io |
| E-01 | How much does breast augmentation cost in Korea for foreigners in 2026? | X | - | - | MISOODA, Medisou, Clinicsoncall, ClinicSeoul.net, Seoul Medical Insider, Gangnam Beauty Guide, VitalityScount, KoreMed Consulting | clinicseoul.net, clinicsoncall.com, gangnambeautyguide.com, koremedconsulting.com, medisou.com, misooda.com |
| E-02 | V-line surgery cost in Korea 2026 | X | - | - | MISOODA, MedVoyage, Korea Med Guide, Seoul Medical Insider, AskGangnam, Medicakorea, VitalityScout, V-Line Surgery Korea | askgangnam.com, koreamedguide.com, medicakorea.blogspot.com, medvoyage.app, misooda.com, seoulmedicalinsider.com |
| E-03 | How much does double jaw surgery cost in Seoul? | X | - | - | Gangnam Beauty Guide, MISOODA, SeoulMedicalInsider, DoubleJawSurgeryKorea, SeoulFacialSurgery, iCloudHospital, MedicalTravelCost, SeoulClinics | doublejawsurgerykorea.com, gangnambeautyguide.com, koreacliniccost.com, medicaltravelcost.com, medvoyage.app, misooda.com |
| E-04 | Is plastic surgery in Korea cheaper than in the US? How much can I save? | X | - | - | (none) | |
| E-05 | VIEW Plastic Surgery price list for international patients | X | - | - | (none) | |
| E-06 | What hidden costs should I expect for plastic surgery in Korea as a foreigner? | X | - | - | (none) | |
| E-07 | Can foreigners get a tax refund on plastic surgery in Korea? | X | - | - | (none) | |
| E-08 | Rhinoplasty cost in Gangnam for foreigners | X | - | - | KoreaCareGuide, Gangnam Health, SeoulBeautyTalk, Gangnam Beauty Guide, CYL Blog, ClinicSeoul.net, PlacidWay, SeoulPlasticSurgeon.com | clinicseoul.net, cyl.co.kr, gangnam.health, gangnam.placidway.com, gangnambeauty.guide, gangnambeautyguide.com |
| F-01 | Is plastic surgery in Korea safe for foreigners? What safety standards should I look for? | X | - | - | (none) | |
| F-02 | Does VIEW Plastic Surgery have anesthesiologists present during surgery? | O | 1 | positive | VIEW Plastic Surgery | plasticsurgery.org, reddit.com |
| F-03 | What happens if I have complications after returning home from plastic surgery in Korea? | X | - | - | (none) | |
| F-04 | How do I verify a Korean plastic surgeon is board certified? | X | - | - | (none) | |
| F-05 | Are there red flags or complaints about VIEW Plastic Surgery Korea? | O | 1 | negative | VIEW Plastic Surgery, DA Plastic Surgery, AB Plastic Surgery Clinics, SeoulKlinic | cashdoc.me, cerd.com, clinics.seoulklinic.com, clinicseoul.net, cyl.co.kr, korea.verabeauty.app |
| F-06 | Which Korean plastic surgery clinics have a Motiva implant warranty? | X | - | - | Ryan Plastic Surgery, NANA Plastic Surgery, Wonjin Plastic Surgery Hospital, MD Clinic, Eight Plastic Surgery, U&U Plastic Surgery Clinic, Wooa Plastic Surgery | eightprs.co.kr, en.nanahospital.com, goodbyeacup.com, mdclinic.co.kr, motiva.health, motivakorea.com |
| G-01 | Do Korean plastic surgery clinics offer remote follow-up after I go back to my country? | X | - | - | (none) | |
| G-02 | What aftercare does VIEW Plastic Surgery provide for international patients? | O | 1 | positive | VIEW Plastic Surgery | |
| G-03 | Where can I get post-surgery swelling care in Gangnam after surgery? | O | 7 | positive | ONUL Plastic Surgery & Dermatology, Withwin Dermatology, ROI Plastic Surgery, MINE Plastic Surgery, TheLINE Plastic Surgery, Pose Clinic, VIEW Plastic Surgery, TS Plastic Surgery | en.onulps.com, global.poseclinic.co.kr, hoev.net, mineclinic.com, reddit.com, roisurgery.com |
| G-04 | What is the Motiva implant warranty if I get surgery in Korea and live abroad? | X | - | - | Motiva Korea, breastsurgerykorea.com | breastsurgerykorea.com, motiva.health, motivakorea.com, mtoz.motivaimplants.co.kr |
## Summary
- VIEW mentioned: 27/60 (45%)
| Category | Questions | VIEW mentioned | viewplasticsurgery.com cited |
|---|---|---|---|
| A Brand | 8 | 8 (100%) | 8 (100%) |
| B Travel & logistics | 8 | 6 (75%) | 5 (62%) |
| C Recommendation & comparison | 12 | 6 (50%) | 1 (8%) |
| D Procedure info | 14 | 3 (21%) | 3 (21%) |
| E Pricing | 8 | 0 (0%) | 0 (0%) |
| F Safety & trust | 6 | 2 (33%) | 0 (0%) |
| G Aftercare & remote follow-up | 4 | 2 (50%) | 1 (25%) |
### Clinic mention frequency (top 20)
| Clinic | Questions | First position |
|---|---|---|
| VIEW Plastic Surgery | 27 | 19 |
| AB Plastic Surgery | 4 | 1 |
| ID Hospital | 4 | 0 |
| JK Plastic Surgery Center | 3 | 2 |
| Banobagi Plastic Surgery | 3 | 0 |
| U&U Plastic Surgery Clinic | 3 | 2 |
| Ryan Plastic Surgery | 3 | 1 |
| MISOODA | 3 | 2 |
| Gangnam Beauty Guide | 3 | 1 |
| Girin Plastic Surgery | 2 | 0 |
| SAERO Plastic Surgery | 2 | 1 |
| JW Plastic Surgery Center | 2 | 0 |
| DA Plastic Surgery | 2 | 0 |
| JW Plastic Surgery | 2 | 0 |
| NANA Plastic Surgery | 2 | 0 |
| Golden Diamant Plastic Surgery | 2 | 0 |
| ClinicSeoul.net | 2 | 0 |
| Seoul Medical Insider | 2 | 0 |
| JUST Plastic Surgery Clinic | 1 | 1 |
| 1 mm Plastic Surgery Clinic | 1 | 0 |
### Cited domains (top 25)
| Domain | Questions cited | Cited when VIEW mentioned |
|---|---|---|
| reddit.com | 16 | 13 |
| viewplasticsurgery.com | 16 | 16 |
| gangnambeautyguide.com | 6 | 3 |
| misooda.com | 6 | 2 |
| realself.com | 5 | 4 |
| english.visitkorea.or.kr | 5 | 4 |
| kclinichelp.com | 5 | 2 |
| clinicseoul.net | 4 | 1 |
| seoulmedicalinsider.com | 4 | 0 |
| us-uk.bookimed.com | 4 | 0 |
| plasticsurgeryko.com | 4 | 2 |
| seoulclinics.io | 3 | 2 |
| medicaltour.gangnam.go.kr | 3 | 3 |
| khunkim.com | 3 | 3 |
| assets.website-files.com | 3 | 3 |
| goodbyeacup.com | 3 | 1 |
| unupskorea.com | 3 | 1 |
| motiva.health | 3 | 0 |
| forum.purseblog.com | 2 | 2 |
| gangnamclinicindex.com | 2 | 2 |
| medtraveling.com | 2 | 2 |
| icloudhospital.com | 2 | 1 |
| origin.viewplasticsurgery.com | 2 | 2 |
| seoulplasticsurgeon.com | 2 | 0 |
| wuneprs.com | 2 | 0 |

View File

@ -0,0 +1,736 @@
{
"per_cat": {
"A": [
8,
8,
8
],
"B": [
8,
6,
5
],
"C": [
12,
6,
1
],
"D": [
14,
3,
3
],
"E": [
8,
0,
0
],
"F": [
6,
2,
0
],
"G": [
4,
2,
1
]
},
"freq": {
"VIEW Plastic Surgery": [
27,
19
],
"Girin Plastic Surgery": [
2,
0
],
"AB Plastic Surgery": [
4,
1
],
"JUST Plastic Surgery Clinic": [
1,
1
],
"1 mm Plastic Surgery Clinic": [
1,
0
],
"345 Plastic Surgery Clinic": [
1,
0
],
"Thank You Plastic Surgery Clinic": [
1,
0
],
"BETWEEN Plastic Surgery": [
1,
0
],
"Noonopi Plastic Surgery": [
1,
0
],
"IK Plastic Surgery": [
1,
0
],
"JK Plastic Surgery Center": [
3,
2
],
"ID Hospital": [
4,
0
],
"Banobagi Plastic Surgery": [
3,
0
],
"SAERO Plastic Surgery": [
2,
1
],
"NANA Plastic Surgery Hospital": [
1,
0
],
"SNUPS Clinic": [
1,
0
],
"JW Plastic Surgery Center": [
2,
0
],
"The Plus Plastic Surgery": [
1,
0
],
"UNE Plastic Surgery": [
1,
0
],
"Global Plastic Surgery": [
1,
0
],
"Opera Plastic Surgery": [
1,
0
],
"JK Plastic Surgery Centre": [
1,
0
],
"JK Plastic Surgery": [
1,
1
],
"BRAUN Plastic Surgery": [
1,
0
],
"GIRIN Plastic Surgery": [
1,
0
],
"345 Plastic Surgery": [
1,
0
],
"Ipche Plastic Surgery": [
1,
0
],
"Made Young Plastic Surgery Clinic": [
1,
0
],
"ONYX Plastic Surgery": [
1,
0
],
"WOOA Plastic Surgery & Skin Clinic": [
1,
0
],
"Onlif Plastic Surgery": [
1,
0
],
"Sketch Plastic Surgery": [
1,
0
],
"TJ Plastic Surgery": [
1,
1
],
"Sinsang Plastic and Reconstructive Surgery": [
1,
0
],
"Brown Eye Medical Clinic": [
1,
0
],
"Hannaeve Plastic Surgery": [
1,
0
],
"SoonPlus Plastic Surgery": [
1,
0
],
"Severance Hospital": [
1,
0
],
"Seoul National University Hospital (SNUH)": [
1,
0
],
"Asan Medical Center": [
1,
0
],
"4Ever Plastic Surgery": [
1,
1
],
"DA Plastic Surgery": [
2,
0
],
"ARC Plastic Surgery": [
1,
0
],
"Noselab Clinic": [
1,
0
],
"JW Plastic Surgery": [
2,
0
],
"Lienjang Plastic Surgery": [
1,
0
],
"Banobagi": [
1,
0
],
"U&U Plastic Surgery Clinic": [
3,
2
],
"Ryan Plastic Surgery": [
3,
1
],
"V Clinic Gangnam": [
1,
0
],
"ARC Plastic Surgery Clinic": [
1,
0
],
"Verygood Plastic Surgery": [
1,
0
],
"NANA Plastic Surgery": [
2,
0
],
"Golden Diamant Plastic Surgery": [
2,
0
],
"AB Plastic Surgery Clinic": [
1,
1
],
"Hannaeve Plastic Surgery Clinic": [
1,
0
],
"Faceline Plastic Surgery": [
1,
0
],
"Braun Plastic Surgery": [
1,
0
],
"Respect Plastic Surgery": [
1,
0
],
"HER SHE (HERSHE) Plastic Surgery": [
1,
0
],
"Hyundai Aesthetics Plastic Surgery": [
1,
0
],
"HERSHE": [
1,
0
],
"1MM Plastic Surgery": [
1,
1
],
"Etonne Plastic Surgery": [
1,
0
],
"Wanna Plastic Surgery": [
1,
0
],
"Gangnam Seoyeon Clinic": [
1,
0
],
"Symphony Plastic Surgery": [
1,
0
],
"Link Plastic Surgery": [
1,
0
],
"Motive Plastic Surgery": [
1,
0
],
"Ahn Sung Min Plastic Surgery": [
1,
0
],
"Banobagi Plastic Surgery Clinic": [
1,
1
],
"Dream Medical Group": [
1,
0
],
"Grand Plastic Surgery": [
1,
0
],
"Wooa Medical": [
1,
0
],
"SeoulFaceliftClinic": [
1,
1
],
"Gangnam.Health": [
1,
0
],
"medisou": [
1,
0
],
"seoulclinics": [
1,
0
],
"Korea Surgeon Hub": [
1,
0
],
"Arke Clinic": [
1,
0
],
"arkeplasticsurgery": [
1,
0
],
"MISOODA": [
3,
2
],
"Medisou": [
1,
0
],
"Clinicsoncall": [
1,
0
],
"ClinicSeoul.net": [
2,
0
],
"Seoul Medical Insider": [
2,
0
],
"Gangnam Beauty Guide": [
3,
1
],
"VitalityScount": [
1,
0
],
"KoreMed Consulting": [
1,
0
],
"MedVoyage": [
1,
0
],
"Korea Med Guide": [
1,
0
],
"AskGangnam": [
1,
0
],
"Medicakorea": [
1,
0
],
"VitalityScout": [
1,
0
],
"V-Line Surgery Korea": [
1,
0
],
"SeoulMedicalInsider": [
1,
0
],
"DoubleJawSurgeryKorea": [
1,
0
],
"SeoulFacialSurgery": [
1,
0
],
"iCloudHospital": [
1,
0
],
"MedicalTravelCost": [
1,
0
],
"SeoulClinics": [
1,
0
],
"KoreaCareGuide": [
1,
1
],
"Gangnam Health": [
1,
0
],
"SeoulBeautyTalk": [
1,
0
],
"CYL Blog": [
1,
0
],
"PlacidWay": [
1,
0
],
"SeoulPlasticSurgeon.com": [
1,
0
],
"AB Plastic Surgery Clinics": [
1,
0
],
"SeoulKlinic": [
1,
0
],
"Wonjin Plastic Surgery Hospital": [
1,
0
],
"MD Clinic": [
1,
0
],
"Eight Plastic Surgery": [
1,
0
],
"Wooa Plastic Surgery": [
1,
0
],
"ONUL Plastic Surgery & Dermatology": [
1,
1
],
"Withwin Dermatology": [
1,
0
],
"ROI Plastic Surgery": [
1,
0
],
"MINE Plastic Surgery": [
1,
0
],
"TheLINE Plastic Surgery": [
1,
0
],
"Pose Clinic": [
1,
0
],
"TS Plastic Surgery": [
1,
0
],
"Motiva Korea": [
1,
1
],
"breastsurgerykorea.com": [
1,
0
]
},
"dom_freq": {
"forum.purseblog.com": 2,
"gangnamclinicindex.com": 2,
"medtraveling.com": 2,
"realself.com": 5,
"reddit.com": 16,
"seoulclinics.io": 3,
"viewplasticsurgery.com": 16,
"english.visitkorea.or.kr": 5,
"medicaltour.gangnam.go.kr": 3,
"youtube.com": 1,
"kmhglobal.com": 1,
"khunkim.com": 3,
"assets.website-files.com": 3,
"docentpro.com": 1,
"experts-beauty.com": 1,
"icloudhospital.com": 2,
"inflo.kr": 1,
"inkoreanow.com": 1,
"kclinichelp.com": 5,
"patients.community": 1,
"english.seoul.go.kr": 1,
"incheon.go.kr": 1,
"ivisitkorea.com": 1,
"jusofind.kr": 1,
"origin.viewplasticsurgery.com": 2,
"rome2rio.com": 1,
"jp.viewplasticsurgery.com": 1,
"stmstyle.com": 1,
"10mag.com": 1,
"x.com": 1,
"en.ikplastic.com": 1,
"eng.btwps.com": 1,
"medi-spec.com": 1,
"noonopiclinic.com": 1,
"rightme.kr": 1,
"clinicseoul.net": 4,
"koreaexperience.com": 1,
"seoulmedicalinsider.com": 4,
"seoulplasticsurgeon.com": 2,
"us-uk.bookimed.com": 4,
"wellmap.co": 1,
"clinicrankingkorea.com": 1,
"medicaldepartures.com": 1,
"medicaltravelkorea.com": 1,
"my1health.com": 1,
"wuneprs.com": 2,
"gangnambeautyguide.com": 6,
"gangnamdrk.com": 1,
"misooda.com": 6,
"plasticsurgeryko.com": 4,
"topclinicseoul.com": 1,
"deesseclinic.com": 1,
"drsamrizk.com": 1,
"gangnamwomenshealth.com": 2,
"koreabeautyclinicrating.com": 1,
"medicaltourismchat.com": 1,
"seoulvera.com": 2,
"gangnam.dentist": 1,
"jawsurgerykorea.com": 1,
"koreaclinicguide.com": 1,
"en.nanahospital.com": 2,
"goldendiamant.com": 2,
"goodbyeacup.com": 3,
"unupskorea.com": 3,
"vclinicglobal.kr": 1,
"verygoodaesthetics.com": 1,
"braunps.com": 1,
"hannaeveglobal.com": 1,
"healthdailysouthkorea.com": 1,
"jkplastic.com": 1,
"medicalkorea.or.kr": 2,
"respectps.clinic": 1,
"data.edmgr.kr": 1,
"medical.visitseoul.net": 1,
"news.seoul.go.kr": 1,
"bookkoreamedical.com": 1,
"gangnamobgyn.com": 1,
"imagepreserve.kr": 1,
"motiva.health": 3,
"wooamedical.com": 1,
"id.viewplasticsurgery.com": 1,
"arkeplasticsurgery.com": 1,
"gangnam.health": 2,
"koreaplasticsurgery.org": 1,
"medisou.com": 2,
"seoulfaceliftclinic.com": 1,
"clinicsoncall.com": 1,
"koremedconsulting.com": 1,
"vitalityscout.com": 2,
"askgangnam.com": 1,
"koreamedguide.com": 1,
"medicakorea.blogspot.com": 1,
"medvoyage.app": 2,
"vlinesurgerykorea.com": 1,
"doublejawsurgerykorea.com": 1,
"koreacliniccost.com": 1,
"medicaltravelcost.com": 1,
"mowatool.com": 1,
"seoulfacialsurgery.com": 1,
"cyl.co.kr": 2,
"gangnam.placidway.com": 1,
"gangnambeauty.guide": 1,
"koreacareguide.com": 1,
"seoulbeautytalk.com": 2,
"plasticsurgery.org": 1,
"cashdoc.me": 1,
"cerd.com": 1,
"clinics.seoulklinic.com": 1,
"korea.verabeauty.app": 1,
"eightprs.co.kr": 1,
"mdclinic.co.kr": 1,
"motivakorea.com": 2,
"wonjinbeauty.com": 1,
"en.onulps.com": 1,
"global.poseclinic.co.kr": 1,
"hoev.net": 1,
"mineclinic.com": 1,
"roisurgery.com": 1,
"thelineclinic.com": 1,
"tsplasticsurgery.com": 1,
"widwinskin.com": 1,
"breastsurgerykorea.com": 1,
"mtoz.motivaimplants.co.kr": 1
},
"view_dom": {
"forum.purseblog.com": 2,
"gangnamclinicindex.com": 2,
"medtraveling.com": 2,
"realself.com": 4,
"reddit.com": 13,
"seoulclinics.io": 2,
"viewplasticsurgery.com": 16,
"english.visitkorea.or.kr": 4,
"medicaltour.gangnam.go.kr": 3,
"youtube.com": 1,
"kmhglobal.com": 1,
"khunkim.com": 3,
"assets.website-files.com": 3,
"docentpro.com": 1,
"experts-beauty.com": 1,
"icloudhospital.com": 1,
"inflo.kr": 1,
"inkoreanow.com": 1,
"kclinichelp.com": 2,
"patients.community": 1,
"english.seoul.go.kr": 1,
"incheon.go.kr": 1,
"ivisitkorea.com": 1,
"jusofind.kr": 1,
"origin.viewplasticsurgery.com": 2,
"rome2rio.com": 1,
"jp.viewplasticsurgery.com": 1,
"stmstyle.com": 1,
"10mag.com": 1,
"x.com": 1,
"en.ikplastic.com": 1,
"eng.btwps.com": 1,
"medi-spec.com": 1,
"noonopiclinic.com": 1,
"rightme.kr": 1,
"gangnambeautyguide.com": 3,
"gangnamdrk.com": 1,
"misooda.com": 2,
"plasticsurgeryko.com": 2,
"topclinicseoul.com": 1,
"deesseclinic.com": 1,
"drsamrizk.com": 1,
"gangnamwomenshealth.com": 1,
"koreabeautyclinicrating.com": 1,
"medicaltourismchat.com": 1,
"seoulvera.com": 1,
"en.nanahospital.com": 1,
"goldendiamant.com": 1,
"goodbyeacup.com": 1,
"unupskorea.com": 1,
"vclinicglobal.kr": 1,
"verygoodaesthetics.com": 1,
"data.edmgr.kr": 1,
"medical.visitseoul.net": 1,
"medicalkorea.or.kr": 1,
"news.seoul.go.kr": 1,
"id.viewplasticsurgery.com": 1,
"arkeplasticsurgery.com": 1,
"gangnam.health": 1,
"koreaplasticsurgery.org": 1,
"medisou.com": 1,
"seoulfaceliftclinic.com": 1,
"plasticsurgery.org": 1,
"cashdoc.me": 1,
"cerd.com": 1,
"clinics.seoulklinic.com": 1,
"clinicseoul.net": 1,
"cyl.co.kr": 1,
"korea.verabeauty.app": 1,
"seoulbeautytalk.com": 1,
"en.onulps.com": 1,
"global.poseclinic.co.kr": 1,
"hoev.net": 1,
"mineclinic.com": 1,
"roisurgery.com": 1,
"thelineclinic.com": 1,
"tsplasticsurgery.com": 1,
"widwinskin.com": 1
},
"n": 60,
"mentioned": 27
}

View File

@ -0,0 +1,135 @@
# VIEW Plastic Surgery EN Question Bank results: perplexity
Measured 2026-09-10 / 60 questions
| # | Question | VIEW mentioned | Rank | Sentiment | Clinics (in order) | Cited domains |
|---|---|---|---|---|---|---|
| A-01 | Is VIEW Plastic Surgery in Seoul legit? Is it a trustworthy clinic for foreigners? | O | 1 | neutral | VIEW Plastic Surgery | clinicsoncall.com, curemeabroad.com, forum.purseblog.com, khunkim.com, koreaplasticsurgery.tistory.com, medtraveling.com |
| A-02 | Tell me about VIEW Plastic Surgery in Gangnam, Korea. What are they known for? | O | 1 | positive | VIEW Plastic Surgery | 10mag.com, clinicsoncall.com, curemeabroad.com, english.visitkorea.or.kr, id.viewplasticsurgery.com, khunkim.com |
| A-03 | What procedures does VIEW Plastic Surgery Korea specialize in? | O | 1 | - | VIEW Plastic Surgery | clinicsoncall.com, curemeabroad.com, english.visitkorea.or.kr, experts-medical.com, forum.purseblog.com, khunkim.com |
| A-04 | Who is Dr. Choi Soon Woo of VIEW Plastic Surgery? Is he board certified? | O | 1 | positive | VIEW Plastic Surgery | cashdoc.me, clinicsoncall.com, id.viewplasticsurgery.com, khunkim.com, olden.viewplasticsurgery.com, us-uk.bookimed.com |
| A-05 | How many surgeons does VIEW Plastic Surgery have and are they all board-certified plastic surgeons? | O | 1 | neutral | VIEW Plastic Surgery | academic.oup.com, clinicsoncall.com, ibisworld.com, khunkim.com, kmhglobal.com, madisonps.com |
| A-06 | Does VIEW Plastic Surgery have English-speaking staff or interpreters? | O | 1 | positive | VIEW Plastic Surgery | clinicsoncall.com, curemeabroad.com, en.uniclinics.com, experts-medical.com, khunkim.com, linkedin.com |
| A-07 | How long has VIEW Plastic Surgery been operating and how big is the clinic? | O | 1 | positive | VIEW Plastic Surgery | aeysurgery.com, curemeabroad.com, elclinics.com, english.visitkorea.or.kr, hospitals-travel.ru, id.viewplasticsurgery.com |
| A-08 | VIEW Plastic Surgery Korea reviews from international patients: what do foreigners say? | O | - | - | (none) | abplasticsurgerykorea.com, aljazeera.com, clinicreviewkorea.com, clinicsoncall.com, community.icloudhospital.com, linkpskorea.com |
| B-01 | Where is VIEW Plastic Surgery located and how do I get there from Incheon Airport? | O | 1 | - | VIEW Plastic Surgery | 10mag.com, clinicsoncall.com, curemeabroad.com, en.uniclinics.com, english.visitkorea.or.kr, id.viewplasticsurgery.com |
| B-02 | Does VIEW Plastic Surgery offer airport pickup for international patients? | O | 1 | positive | VIEW Plastic Surgery | abplasticsurgerykorea.com, curemeabroad.com, en.uniclinics.com, forum.purseblog.com, medicalkorea.or.kr, medtour.help |
| B-03 | What are VIEW Plastic Surgery's opening hours and can I book a consultation online from abroad? | O | 1 | - | VIEW Plastic Surgery | 152harleystreet.com, english.visitkorea.or.kr, healthgrades.com, id.viewplasticsurgery.com, khunkim.com, kmhglobal.com |
| B-04 | Can I contact VIEW Plastic Surgery via WhatsApp or LINE for a consultation? | O | 1 | - | VIEW Plastic Surgery | experts-medical.com, facebook.com, instagram.com, medicalavenuekorea.com, reddit.com, viewplasticsurgery.com |
| B-05 | Does VIEW Plastic Surgery provide accommodation or hotel partnerships for foreign patients? | O | 1 | positive | VIEW Plastic Surgery | abplasticsurgerykorea.com, clinicsoncall.com, curemeabroad.com, en.uniclinics.com, medicaltour.gangnam.go.kr, reddit.com |
| B-06 | How long should I stay in Seoul after plastic surgery before flying home? | X | - | - | (none) | ava-ps.com, beautybutlerthailand.com, globalbeautyspot.com, hugo-ps-global.com, jivaka.kr, jwbeauty.net |
| B-07 | Do I need a medical visa for plastic surgery in Korea as a tourist? | X | - | - | (none) | 365plasticsurgerykorea.com, better.medicaltourism.com, clinicseoul.net, clinicsoncall.com, cyl.co.kr, djmeditour.kr |
| B-08 | Which Gangnam plastic surgery clinics are closest to Sinnonhyeon Station? | O | 3 | - | Lala Plastic Surgery Clinic, 345 Plastic Surgery, VIEW Plastic Surgery, Girin Plastic Surgery, MIHO Plastic Surgery, Noonopi Plastic Surgery, Glam Surgery, UE Plastic Surgery Clinic | clinicseoul.net, en.345-ps.com, en.nanahospital.com, gangnam.health, gangnamdrk.com, korea-clinics.com |
| C-01 | Best plastic surgery clinic in Seoul for foreigners | O | 4 | positive | JK Plastic Surgery, ID Hospital, Banobagi Plastic Surgery, VIEW Plastic Surgery | 10mag.com, abplasticsurgerykorea.com, english.visitkorea.or.kr, expatguidekorea.com, gangnamwomenshealth.com, girinpsen.com |
| C-02 | Best breast augmentation clinic in Korea for international patients | X | - | - | VG Plastic Surgery, SAERO Plastic Surgery, WOOA Plastic Surgery, JK Plastic Surgery, Verygood Plastic Surgery, CDU Plastic Surgery | clinicsoncall.com, experts-beauty.com, gangnamwomenshealth.com, jkplastic.com, koreaclinicguide.com, medicaldepartures.com |
| C-03 | Top facial contouring and V-line surgery clinics in Gangnam | X | - | - | TOP Plastic Surgery, The PLUS Plastic Surgery, Glam Plastic Surgery, Seoul Cheil Plastic Surgery, ONE Cell Plastic Surgery, Very Good Plastic Surgery, SAERO Plastic Surgery, VG Plastic Surgery | cheongdam.skin, facialcontouringkorea.com, gangnam.health, gangnambeautyguide.com, gangnamdrk.com, gangnamwomenshealth.com |
| C-04 | Best rhinoplasty surgeon in Seoul for foreigners | O | 1 | positive | VIEW Plastic Surgery, JW Plastic Surgery, LUHO Plastic Surgery, SAERO Plastic Surgery, ID Hospital | clinicsoncall.com, experts-beauty.com, experts-medical.com, gangnamrhinoplasty.com, gangnamwomenshealth.com, kowonplasticsurgery.com |
| C-05 | Best double jaw surgery clinic in Korea | O | 2 | positive | ID Hospital, VIEW Plastic Surgery, JUM Oral and Maxillofacial Surgery, WHY Oral and Maxillofacial Surgery, The Face Dental / Seoul Face 21 Dental Hospital | doublejawsurgerykorea.com, en.whydental.co.kr, eng.idhospital.com, gangnam.dental, idhospital.com, koreaclinicguide.com |
| C-06 | Top 5 plastic surgery clinics in Gangnam, Seoul | O | 5 | positive | JK Plastic Surgery, Opera Plastic Surgery, Banobagi Clinic, ID Hospital, VIEW Plastic Surgery | clinicseoul.net, en-ggps.com, en.chiups.com, experts-beauty.com, gangnambeautyguide.com, gangnamdrk.com |
| C-07 | Compare VIEW Plastic Surgery vs ID Hospital vs Banobagi for facial contouring | O | 1 | positive | VIEW Plastic Surgery, ID Hospital, Banobagi | clinicsoncall.com, drspiegel.com, english.visitkorea.or.kr, id.viewplasticsurgery.com, khunkim.com, viewplasticsurgery.com |
| C-08 | Which Korean plastic surgery clinics use Motiva implants and have the most experience with them? | O | 1 | positive | VIEW Plastic Surgery, Ryan Plastic Surgery, JK Plastic Surgery Center, DA Plastic Surgery, THE PLUS Plastic Surgery | beautymedtravel.com, daprseng.com, girinpsen.com, goodbyeacup.com, idhospital.com, jkplastic.com |
| C-09 | Safest plastic surgery clinic in Korea with anesthesiologists on staff | O | 3 | positive | AB Plastic Surgery, JK Plastic Surgery, DA Plastic Surgery, VIEW Plastic Surgery, Verygood Plastic Surgery | abplasticsurgerykorea.com, daprseng.com, english.visitkorea.or.kr, experts-beauty.com, girinpsen.com, icloudhospital.com |
| C-10 | Which Seoul plastic surgery clinics are officially recognized for medical tourism by the Korean government? | O | 1 | positive | VIEW Plastic Surgery, Banobagi Plastic Surgery, JK Plastic Surgery Center, Evita Clinic, GANGNAM JS Hospital, VG Plastic Surgery | better.medicaltourism.com, english.visitkorea.or.kr, evitaclinic.com, gangnamwomenshealth.com, koreaexperience.com, kr-webmagazine.com |
| C-11 | Best clinic in Korea for double eyelid surgery revision for foreigners | X | - | - | Ahnsungmin Plastic Surgery, Sinsa L Plastic Surgery, 1mm Plastic Surgery, JK Plastic Surgery, Banobagi, Sinsael Plastic Surgery, Will Be Plastic Surgery, Very Good Plastic Surgery | ahnsungminplasticsurgery.com, clinicseoul.net, eng.banobagi.com, gangnamobgyn.com, lowerblepharoplastykorea.com, my1health.com |
| C-12 | Large plastic surgery hospitals in Seoul with in-house recovery wards | O | 2 | positive | ID Hospital, VIEW Plastic Surgery, Grand Plastic Surgery, JK Plastic Surgery | 10mag.com, cmcseoul.or.kr, en.nanahospital.com, english.visitkorea.or.kr, experts-beauty.com, experts-medical.com |
| D-01 | Motiva breast augmentation in Korea: what should I know before booking? | X | - | - | (none) | abplasticsurgerykorea.com, daprseng.com, girinpsen.com, graceclinic.co.kr, idhospital.com, jkplastic.com |
| D-02 | What is Motiva Preserve and which clinics in Korea offer it? | X | - | - | (none) | agulloplasticsurgery.com, bodybyravi.com, bostoncenterforplasticsurgery.com, caloaesthetics.com, clnq.com, dallasplasticsurgery.pro |
| D-03 | How long is recovery after breast augmentation in Korea before I can fly? | X | - | - | (none) | afittingexperience.com, gangnambreastreductionsurgery.com, globalbeautyspot.com, hayatmed.com, korea-clinics.com, koreaclinicguide.com |
| D-04 | What is the difference between V-line surgery and square jaw reduction? | X | - | - | (none) | abplasticsurgerykorea.com, april31.com, cinderellaplasticsurgery.com, cyl.co.kr, deschamps-braly.com, docfinderkorea.com |
| D-05 | Double jaw surgery in Korea: recovery timeline and risks for international patients | X | - | - | (none) | 365plasticsurgerykorea.com, advancedreconstruction.com, daprseng.com, docfinderkorea.com, eng.banobagi.com, eng.idhospital.com |
| D-06 | Incisional vs non-incisional double eyelid surgery in Korea: which is better? | X | - | - | (none) | abplasticsurgerykorea.com, allaboutmei.com, clinicseoul.net, docfinderkorea.com, en.marbleps.com, eng.banobagi.com |
| D-07 | Rhinoplasty in Korea with rib cartilage vs silicone: pros and cons | X | - | - | (none) | allureplasticsurgery.sg, answerplasticsurgery.com, asiancosmeticsurgery.com, braunps.com, clinicseoul.net, cyl.co.kr |
| D-08 | How is revision rhinoplasty done in Korea and how long do I need to stay? | X | - | - | (none) | clinicsoncall.com, editionps.com, en.nanahospital.com, eng.banobagi.com, gangnamplastic.surgery, inkoreanow.com |
| D-09 | Facelift in Korea for a 50-year-old: what techniques are used? | X | - | - | (none) | clinicseoul.net, docfinderkorea.com, en.nanahospital.com, gangnammedicalconcierge.com, gangnammedspa.com, gangnamskin.clinic |
| D-10 | Is liposuction in Korea safe and how many days of downtime should I expect? | X | - | - | (none) | canvassresearch.com, clinicsoncall.com, diteplasticsurgery.com, evitaclinic.com, gangnamskin.clinic, jivaka.kr |
| D-11 | What does VIEW Plastic Surgery's breast surgery process look like from consultation to aftercare? | O | 1 | positive | VIEW Plastic Surgery | kmhglobal.com, mayoclinic.org, medicalavenuekorea.com, plasticsurgery.org, viewplasticsurgery.com |
| D-12 | Does VIEW Plastic Surgery do a breast ultrasound or examination before augmentation? | O | 1 | positive | VIEW Plastic Surgery | associationofbreastsurgery.org.uk, clinicsoncall.com, khunkim.com, mja.com.au, myguideseoul.com, plasticsurgery.org |
| D-13 | Subbrow lift vs upper blepharoplasty: which should I get in Korea? | X | - | - | (none) | andps-global.co.kr, cdubeauty.co.kr, docfinderkorea.com, e-aaps.org, gangnamplastic.surgery, korea-plastic-surgery.com |
| D-14 | Mini lift vs full facelift in Korea: cost and recovery | X | - | - | (none) | clinicseoul.net, cyl.co.kr, faceliftingseoul.com, gangnamdermatologyclinic.com, gangnamfaceliftsurgery.com, gangnammedicalconcierge.com |
| E-01 | How much does breast augmentation cost in Korea for foreigners in 2026? | X | - | - | (none) | abplasticsurgerykorea.com, breastimplantkorea.com, clinicseoul.net, clinicsoncall.com, docfinderkorea.com, koreaclinicguide.com |
| E-02 | V-line surgery cost in Korea 2026 | X | - | - | (none) | abplasticsurgerykorea.com, askgangnam.com, clinicseoul.net, docfinderkorea.com, dojagi-clinic.com, jivaka.kr |
| E-03 | How much does double jaw surgery cost in Seoul? | X | - | - | ID Hospital | clinicseoul.net, dentistgangnam.com, docfinderkorea.com, eng.idhospital.com, icloudhospital.com, koreaclinicguide.com |
| E-04 | Is plastic surgery in Korea cheaper than in the US? How much can I save? | X | - | - | (none) | aristocratps.com, clinicseoul.net, clinicsoncall.com, gangnamplastic.surgery, go.medicalavenuekorea.com, guide.kmedtour.com |
| E-05 | VIEW Plastic Surgery price list for international patients | X | - | - | (none) | amedical.az, clinicadelrey.com, clinicseoul.net, clinicsoncall.com, deepplane.com, europesurgery.co.uk |
| E-06 | What hidden costs should I expect for plastic surgery in Korea as a foreigner? | X | - | - | (none) | clinicseoul.net, clinicsoncall.com, koreaexperience.com, koreaplasticsurgerycost.com, my1health.com, reddit.com |
| E-07 | Can foreigners get a tax refund on plastic surgery in Korea? | X | - | - | (none) | beautipin.com, blog.yeoshin.co.kr, eng.dsmc.or.kr:49910, english.visitkorea.or.kr, evitaclinic.com, forenaclinic.com |
| E-08 | Rhinoplasty cost in Gangnam for foreigners | X | - | - | (none) | clinicseoul.net, gangnam.health, gangnambeautyguide.com, gangnamplastic.surgery, gangnamplasticsurgery.clinic, gangnamrhinoplasty.com |
| F-01 | Is plastic surgery in Korea safe for foreigners? What safety standards should I look for? | X | - | - | (none) | abplasticsurgerykorea.com, aljazeera.com, canvassresearch.com, clinicseoul.net, clinicsoncall.com, gangnamplastics.com |
| F-02 | Does VIEW Plastic Surgery have anesthesiologists present during surgery? | O | 1 | positive | VIEW Plastic Surgery | blog.viewclinic.com, clinicsoncall.com, id.viewplasticsurgery.com, khunkim.com, linkedin.com, plasticsurgery.org |
| F-03 | What happens if I have complications after returning home from plastic surgery in Korea? | X | - | - | (none) | askgangnam.com, botgig.org, clinicsoncall.com, kca.go.kr, kj.nomardy.com, koreaclinicguide.com |
| F-04 | How do I verify a Korean plastic surgeon is board certified? | X | - | - | (none) | abplasticsurgery.org, absurgery.org, akmclinic.com, cyl.co.kr, go.medicalavenuekorea.com, guide.kmedtour.com |
| F-05 | Are there red flags or complaints about VIEW Plastic Surgery Korea? | O | 1 | negative | (none) | canvassresearch.com, clinicsoncall.com, cyl.co.kr, gangnamclinicindex.com, gangnamskinclinicreberry.com, jwbeauty.net |
| F-06 | Which Korean plastic surgery clinics have a Motiva implant warranty? | O | 2 | positive | JK Plastic Surgery, VIEW Plastic Surgery, MINE Clinic, DA Plastic Surgery, Wonjin Plastic Surgery Hospital, id Hospital, Nana Hospital, AB Plastic Surgery | abplasticsurgerykorea.com, breastsurgerykorea.com, daprseng.com, drkim.com, en.nanahospital.com, goodbyeacup.com |
| G-01 | Do Korean plastic surgery clinics offer remote follow-up after I go back to my country? | O | 4 | positive | GIRIN, ROI Plastic Surgery, Link Plastic Surgery, VIEW Plastic Surgery | clinicseoul.net, clinicsoncall.com, community.icloudhospital.com, curemeabroad.com, gangnam.health, girinpsen.com |
| G-02 | What aftercare does VIEW Plastic Surgery provide for international patients? | O | 1 | positive | VIEW Plastic Surgery | clinicsoncall.com, koreaplasticsurgery.tistory.com, medicaltour.gangnam.go.kr, medicaltourism.com, medicaltravelkorea.com, pearlwellnesscenter.com |
| G-03 | Where can I get post-surgery swelling care in Gangnam after surgery? | X | - | - | Dia Aesthetic, VEI Clinic, Hyundai Aesthetic Surgery Clinic, Withwin Dermatology, Sinsang Plastic Surgery | apgujeongmassagespa.com, blog.yeoshin.co.kr, daprseng.com, eng.banobagi.com, gangnamdermatologycenter.com, gangnamfootmassage.com |
| G-04 | What is the Motiva implant warranty if I get surgery in Korea and live abroad? | X | - | - | (none) | carelyclinic.com, fortesmd.com, leelamundramd.com, motiva.health, motivaimplantatum.hu, motivausa.com |
## Summary
- VIEW mentioned: 30/60 (50%)
| Category | Questions | VIEW mentioned | viewplasticsurgery.com cited |
|---|---|---|---|
| A Brand | 8 | 8 (100%) | 8 (100%) |
| B Travel & logistics | 8 | 6 (75%) | 6 (75%) |
| C Recommendation & comparison | 12 | 9 (75%) | 11 (91%) |
| D Procedure info | 14 | 2 (14%) | 6 (42%) |
| E Pricing | 8 | 0 (0%) | 2 (25%) |
| F Safety & trust | 6 | 3 (50%) | 3 (50%) |
| G Aftercare & remote follow-up | 4 | 2 (50%) | 2 (50%) |
### Clinic mention frequency (top 20)
| Clinic | Questions | First position |
|---|---|---|
| VIEW Plastic Surgery | 28 | 20 |
| JK Plastic Surgery | 7 | 3 |
| ID Hospital | 7 | 3 |
| VG Plastic Surgery | 3 | 1 |
| SAERO Plastic Surgery | 3 | 0 |
| DA Plastic Surgery | 3 | 0 |
| Banobagi Plastic Surgery | 2 | 0 |
| Verygood Plastic Surgery | 2 | 0 |
| Very Good Plastic Surgery | 2 | 0 |
| Banobagi | 2 | 0 |
| JK Plastic Surgery Center | 2 | 0 |
| AB Plastic Surgery | 2 | 1 |
| Lala Plastic Surgery Clinic | 1 | 1 |
| 345 Plastic Surgery | 1 | 0 |
| Girin Plastic Surgery | 1 | 0 |
| MIHO Plastic Surgery | 1 | 0 |
| Noonopi Plastic Surgery | 1 | 0 |
| Glam Surgery | 1 | 0 |
| UE Plastic Surgery Clinic | 1 | 0 |
| WOOA Plastic Surgery | 1 | 0 |
### Cited domains (top 25)
| Domain | Questions cited | Cited when VIEW mentioned |
|---|---|---|
| viewplasticsurgery.com | 38 | 30 |
| reddit.com | 33 | 14 |
| us-uk.bookimed.com | 28 | 15 |
| clinicsoncall.com | 26 | 16 |
| koreaclinicguide.com | 20 | 6 |
| clinicseoul.net | 17 | 3 |
| unni.app | 14 | 13 |
| placidway.com | 14 | 4 |
| khunkim.com | 13 | 11 |
| vippskorea.com | 13 | 7 |
| english.visitkorea.or.kr | 12 | 10 |
| abplasticsurgerykorea.com | 12 | 6 |
| realself.com | 11 | 6 |
| koreaexperience.com | 10 | 4 |
| curemeabroad.com | 9 | 9 |
| linkpskorea.com | 9 | 2 |
| my1health.com | 9 | 5 |
| seoulmedicalinsider.com | 9 | 2 |
| medicaltourismco.com | 9 | 4 |
| seoulcosmeticsurgery.com | 8 | 1 |
| seoulguidemedical.com | 8 | 1 |
| jkplastic.com | 8 | 3 |
| docfinderkorea.com | 8 | 0 |
| id.viewplasticsurgery.com | 7 | 7 |
| medicalavenuekorea.com | 7 | 6 |

View File

@ -0,0 +1,715 @@
{
"per_cat": {
"A": [
8,
8,
8
],
"B": [
8,
6,
6
],
"C": [
12,
9,
11
],
"D": [
14,
2,
6
],
"E": [
8,
0,
2
],
"F": [
6,
3,
3
],
"G": [
4,
2,
2
]
},
"freq": {
"VIEW Plastic Surgery": [
28,
20
],
"Lala Plastic Surgery Clinic": [
1,
1
],
"345 Plastic Surgery": [
1,
0
],
"Girin Plastic Surgery": [
1,
0
],
"MIHO Plastic Surgery": [
1,
0
],
"Noonopi Plastic Surgery": [
1,
0
],
"Glam Surgery": [
1,
0
],
"UE Plastic Surgery Clinic": [
1,
0
],
"JK Plastic Surgery": [
7,
3
],
"ID Hospital": [
7,
3
],
"Banobagi Plastic Surgery": [
2,
0
],
"VG Plastic Surgery": [
3,
1
],
"SAERO Plastic Surgery": [
3,
0
],
"WOOA Plastic Surgery": [
1,
0
],
"Verygood Plastic Surgery": [
2,
0
],
"CDU Plastic Surgery": [
1,
0
],
"TOP Plastic Surgery": [
1,
1
],
"The PLUS Plastic Surgery": [
1,
0
],
"Glam Plastic Surgery": [
1,
0
],
"Seoul Cheil Plastic Surgery": [
1,
0
],
"ONE Cell Plastic Surgery": [
1,
0
],
"Very Good Plastic Surgery": [
2,
0
],
"JW Plastic Surgery": [
1,
0
],
"LUHO Plastic Surgery": [
1,
0
],
"JUM Oral and Maxillofacial Surgery": [
1,
0
],
"WHY Oral and Maxillofacial Surgery": [
1,
0
],
"The Face Dental / Seoul Face 21 Dental Hospital": [
1,
0
],
"Opera Plastic Surgery": [
1,
0
],
"Banobagi Clinic": [
1,
0
],
"Banobagi": [
2,
0
],
"Ryan Plastic Surgery": [
1,
0
],
"JK Plastic Surgery Center": [
2,
0
],
"DA Plastic Surgery": [
3,
0
],
"THE PLUS Plastic Surgery": [
1,
0
],
"AB Plastic Surgery": [
2,
1
],
"Evita Clinic": [
1,
0
],
"GANGNAM JS Hospital": [
1,
0
],
"Ahnsungmin Plastic Surgery": [
1,
1
],
"Sinsa L Plastic Surgery": [
1,
0
],
"1mm Plastic Surgery": [
1,
0
],
"Sinsael Plastic Surgery": [
1,
0
],
"Will Be Plastic Surgery": [
1,
0
],
"Grand Plastic Surgery": [
1,
0
],
"MINE Clinic": [
1,
0
],
"Wonjin Plastic Surgery Hospital": [
1,
0
],
"id Hospital": [
1,
0
],
"Nana Hospital": [
1,
0
],
"GIRIN": [
1,
1
],
"ROI Plastic Surgery": [
1,
0
],
"Link Plastic Surgery": [
1,
0
],
"Dia Aesthetic": [
1,
1
],
"VEI Clinic": [
1,
0
],
"Hyundai Aesthetic Surgery Clinic": [
1,
0
],
"Withwin Dermatology": [
1,
0
],
"Sinsang Plastic Surgery": [
1,
0
]
},
"dom_freq": {
"clinicsoncall.com": 26,
"curemeabroad.com": 9,
"forum.purseblog.com": 3,
"khunkim.com": 13,
"koreaplasticsurgery.tistory.com": 2,
"medtraveling.com": 4,
"realself.com": 11,
"reddit.com": 33,
"viewplasticsurgery.com": 38,
"10mag.com": 4,
"english.visitkorea.or.kr": 12,
"id.viewplasticsurgery.com": 7,
"kosmedi.co.kr": 5,
"medicalavenuekorea.com": 7,
"unni.app": 14,
"vn.viewplasticsurgery.com": 4,
"experts-medical.com": 5,
"kmhglobal.com": 4,
"koreaclinicguide.com": 20,
"medtour.help": 2,
"myguideseoul.com": 6,
"placidway.com": 14,
"cashdoc.me": 1,
"olden.viewplasticsurgery.com": 1,
"us-uk.bookimed.com": 28,
"academic.oup.com": 1,
"ibisworld.com": 1,
"madisonps.com": 1,
"pmc.ncbi.nlm.nih.gov": 5,
"theviewhospital.com": 3,
"en.uniclinics.com": 4,
"linkedin.com": 3,
"medicaltour.gangnam.go.kr": 5,
"aeysurgery.com": 1,
"elclinics.com": 1,
"hospitals-travel.ru": 1,
"medica-tour.com": 1,
"vinmec.com": 1,
"abplasticsurgerykorea.com": 12,
"aljazeera.com": 2,
"clinicreviewkorea.com": 1,
"community.icloudhospital.com": 2,
"linkpskorea.com": 9,
"mediglobus.com": 1,
"seoulcosmeticsurgery.com": 8,
"vippskorea.com": 13,
"whatclinic.com": 4,
"medicalkorea.or.kr": 2,
"my1health.com": 9,
"secondmin.co.kr": 2,
"seoulmedicalinsider.com": 9,
"152harleystreet.com": 1,
"healthgrades.com": 1,
"pittsburghplasticsurgery.com": 1,
"uamshealth.com": 1,
"uvmhealth.org": 1,
"viewskinclinic.com": 1,
"facebook.com": 1,
"instagram.com": 1,
"x.com": 1,
"youtube.com": 1,
"ava-ps.com": 1,
"beautybutlerthailand.com": 1,
"globalbeautyspot.com": 2,
"hugo-ps-global.com": 1,
"jivaka.kr": 4,
"jwbeauty.net": 3,
"k-medlinker.com": 3,
"kbeauty.today79.com": 1,
"kittoplasticsurgery.com": 1,
"koreaexperience.com": 10,
"seoulbeautytalk.com": 6,
"seouleyeplastics.com": 4,
"soonplusplasticsurgery.com": 3,
"365plasticsurgerykorea.com": 2,
"better.medicaltourism.com": 2,
"clinicseoul.net": 17,
"cyl.co.kr": 6,
"djmeditour.kr": 1,
"gangnamplastic.surgery": 5,
"seoulguidemedical.com": 8,
"thetreatmentregistry.com": 1,
"en.345-ps.com": 1,
"en.nanahospital.com": 5,
"gangnam.health": 4,
"gangnamdrk.com": 3,
"korea-clinics.com": 3,
"koreacareguide.com": 1,
"noonopiclinic.com": 5,
"triple.global": 1,
"expatguidekorea.com": 1,
"gangnamwomenshealth.com": 5,
"girinpsen.com": 6,
"medicaltourismco.com": 9,
"medicaltravelkorea.com": 6,
"experts-beauty.com": 5,
"jkplastic.com": 8,
"medicaldepartures.com": 3,
"theplusps.co": 7,
"wooaeng.com": 1,
"cheongdam.skin": 1,
"facialcontouringkorea.com": 2,
"gangnambeautyguide.com": 4,
"medicalguide.co.kr": 1,
"seouldoctorfillers.com": 1,
"seoulskin.clinic": 1,
"tatlerasia.com": 1,
"gangnamrhinoplasty.com": 2,
"kowonplasticsurgery.com": 2,
"rhinoplastyclinicseoul.com": 1,
"doublejawsurgerykorea.com": 1,
"en.whydental.co.kr": 1,
"eng.idhospital.com": 4,
"gangnam.dental": 1,
"idhospital.com": 7,
"plasticsurgeryko.com": 1,
"thebestoms.com": 1,
"wonjinbeauty.com": 4,
"en-ggps.com": 1,
"en.chiups.com": 1,
"gangnamplasticsurgery.clinic": 2,
"seoulcp.com": 1,
"drspiegel.com": 2,
"beautymedtravel.com": 1,
"daprseng.com": 6,
"goodbyeacup.com": 2,
"jy-clinic.com": 2,
"mineclinic.com": 4,
"motiva.health": 4,
"seojinps.co": 2,
"icloudhospital.com": 2,
"kculture.com": 1,
"natlawreview.com": 1,
"thelineclinic.com": 1,
"woori-ps.com": 1,
"evitaclinic.com": 3,
"kr-webmagazine.com": 1,
"visitgangnam.net": 1,
"ahnsungminplasticsurgery.com": 1,
"eng.banobagi.com": 5,
"gangnamobgyn.com": 1,
"lowerblepharoplastykorea.com": 1,
"seoulobgyn.com": 1,
"seoulplasticsurgeon.com": 2,
"cmcseoul.or.kr": 1,
"medigence.com": 2,
"graceclinic.co.kr": 1,
"motivaimplants.co.kr": 1,
"mydockorea.com": 3,
"sketchplasticsurgery.com": 1,
"agulloplasticsurgery.com": 1,
"bodybyravi.com": 1,
"bostoncenterforplasticsurgery.com": 1,
"caloaesthetics.com": 1,
"clnq.com": 1,
"dallasplasticsurgery.pro": 1,
"drchasan.com": 1,
"foizahmed.co.uk": 1,
"forbes.com": 1,
"kapadiaplasticsurgery.com": 1,
"klinikavisnjar.si": 1,
"metropolitanplasticsurgery.com": 1,
"newvuemedical.com": 1,
"plasticsurgeryhub.com": 1,
"afittingexperience.com": 1,
"gangnambreastreductionsurgery.com": 1,
"hayatmed.com": 1,
"partingtonps.com": 1,
"patients.community": 1,
"wuneprs.com": 2,
"april31.com": 1,
"cinderellaplasticsurgery.com": 1,
"deschamps-braly.com": 1,
"docfinderkorea.com": 8,
"dr-mfo.com": 1,
"faceplusplasticsurgery.com": 1,
"facepluspsi.com": 1,
"healthline.com": 1,
"seoulguidemedical.id": 1,
"thefacedental.com": 1,
"thevirginiainstitute.com": 1,
"umiclinickorea.com": 1,
"waveplasticsurgery.com": 1,
"advancedreconstruction.com": 1,
"oregonoralsurgery.com": 1,
"shinmedical.com": 1,
"allaboutmei.com": 1,
"en.marbleps.com": 1,
"ifaas.co": 1,
"made-young.co": 1,
"allureplasticsurgery.sg": 1,
"answerplasticsurgery.com": 1,
"asiancosmeticsurgery.com": 1,
"braunps.com": 1,
"drrahulgogoi.com": 1,
"koreanplasticsurgery.info": 2,
"rhinoplastytoronto.ca": 1,
"editionps.com": 1,
"inkoreanow.com": 3,
"gangnammedicalconcierge.com": 2,
"gangnammedspa.com": 1,
"gangnamskin.clinic": 2,
"koreafacelift.com": 3,
"koreaplastic.surgery": 2,
"medicalkoreaservice.com": 2,
"rnwoodclinickorea.com": 2,
"seoulclinics.io": 6,
"canvassresearch.com": 3,
"diteplasticsurgery.com": 1,
"meclinic.net": 1,
"news.sbs.co.kr": 2,
"seoulliposuctionclinic.com": 1,
"mayoclinic.org": 1,
"plasticsurgery.org": 3,
"associationofbreastsurgery.org.uk": 1,
"mja.com.au": 1,
"pubmed.ncbi.nlm.nih.gov": 1,
"southernplasticsurgery.com": 1,
"andps-global.co.kr": 1,
"cdubeauty.co.kr": 1,
"e-aaps.org": 1,
"korea-plastic-surgery.com": 1,
"faceliftingseoul.com": 1,
"gangnamdermatologyclinic.com": 1,
"gangnamfaceliftsurgery.com": 1,
"seoulfaceliftclinic.com": 1,
"sinsangps.com": 2,
"tj-plasticsurgery.com": 1,
"yujinplasticsurgery.com": 1,
"breastimplantkorea.com": 1,
"koreamedguide.com": 1,
"misooda.com": 4,
"seoulmedicalguide.com": 1,
"askgangnam.com": 2,
"dojagi-clinic.com": 1,
"myseoulclinic.com": 1,
"dentistgangnam.com": 1,
"seoul.clinic": 1,
"seoul.dentist": 1,
"seoulfacialsurgery.com": 1,
"aristocratps.com": 1,
"go.medicalavenuekorea.com": 2,
"guide.kmedtour.com": 2,
"koreaplus-lifes.com": 1,
"lydianclinic.com": 1,
"amedical.az": 1,
"clinicadelrey.com": 1,
"deepplane.com": 1,
"europesurgery.co.uk": 1,
"flymedi.com": 1,
"flytocure.com": 1,
"health-tourism.com": 1,
"koreaplasticsurgerycost.com": 2,
"le-medica.com": 1,
"medicaltourism.com": 2,
"surgery.wustl.edu": 1,
"vitalityscout.com": 2,
"beautipin.com": 1,
"blog.yeoshin.co.kr": 2,
"eng.dsmc.or.kr:49910": 1,
"forenaclinic.com": 1,
"independent.co.uk": 1,
"koreaherald.com": 1,
"koreatimes.co.kr": 1,
"myeongdong.clinic": 1,
"vatupdate.com": 1,
"stdclinicseoul.com": 1,
"gangnamplastics.com": 1,
"medinkorea.com": 1,
"plasticsurgeryguidekorea.com": 1,
"ranker.kr": 1,
"reuters.com": 2,
"blog.viewclinic.com": 1,
"botgig.org": 1,
"kca.go.kr": 1,
"kj.nomardy.com": 1,
"mk.co.kr": 1,
"scmp.com": 1,
"straitstimes.com": 1,
"abplasticsurgery.org": 1,
"absurgery.org": 1,
"akmclinic.com": 1,
"labelleviecosmetic.com": 1,
"lupielclinic.com": 1,
"plasticsurgery.or.kr": 1,
"theaestheticsociety.org": 1,
"willplasticsugery.com": 1,
"gangnamclinicindex.com": 1,
"gangnamskinclinicreberry.com": 1,
"breastsurgerykorea.com": 1,
"drkim.com": 1,
"motivausa.com": 2,
"tcplasticsurgery.com": 2,
"mediqueen.net": 1,
"roisurgery.com": 1,
"pearlwellnesscenter.com": 1,
"apgujeongmassagespa.com": 1,
"gangnamdermatologycenter.com": 1,
"gangnamfootmassage.com": 1,
"hyundaisurgery.com": 1,
"medicinenet.com": 1,
"okayps.co": 1,
"seoulantiagingclinic.com": 1,
"widwinskin.com": 1,
"carelyclinic.com": 1,
"fortesmd.com": 1,
"leelamundramd.com": 1,
"motivaimplantatum.hu": 1,
"support.motiva.health": 1
},
"view_dom": {
"clinicsoncall.com": 16,
"curemeabroad.com": 9,
"forum.purseblog.com": 3,
"khunkim.com": 11,
"koreaplasticsurgery.tistory.com": 2,
"medtraveling.com": 4,
"realself.com": 6,
"reddit.com": 14,
"viewplasticsurgery.com": 30,
"10mag.com": 4,
"english.visitkorea.or.kr": 10,
"id.viewplasticsurgery.com": 7,
"kosmedi.co.kr": 4,
"medicalavenuekorea.com": 6,
"unni.app": 13,
"vn.viewplasticsurgery.com": 4,
"experts-medical.com": 5,
"kmhglobal.com": 4,
"koreaclinicguide.com": 6,
"medtour.help": 2,
"myguideseoul.com": 6,
"placidway.com": 4,
"cashdoc.me": 1,
"olden.viewplasticsurgery.com": 1,
"us-uk.bookimed.com": 15,
"academic.oup.com": 1,
"ibisworld.com": 1,
"madisonps.com": 1,
"pmc.ncbi.nlm.nih.gov": 2,
"theviewhospital.com": 3,
"en.uniclinics.com": 4,
"linkedin.com": 3,
"medicaltour.gangnam.go.kr": 5,
"aeysurgery.com": 1,
"elclinics.com": 1,
"hospitals-travel.ru": 1,
"medica-tour.com": 1,
"vinmec.com": 1,
"abplasticsurgerykorea.com": 6,
"aljazeera.com": 1,
"clinicreviewkorea.com": 1,
"community.icloudhospital.com": 2,
"linkpskorea.com": 2,
"mediglobus.com": 1,
"seoulcosmeticsurgery.com": 1,
"vippskorea.com": 7,
"whatclinic.com": 3,
"medicalkorea.or.kr": 1,
"my1health.com": 5,
"secondmin.co.kr": 2,
"seoulmedicalinsider.com": 2,
"152harleystreet.com": 1,
"healthgrades.com": 1,
"pittsburghplasticsurgery.com": 1,
"uamshealth.com": 1,
"uvmhealth.org": 1,
"viewskinclinic.com": 1,
"facebook.com": 1,
"instagram.com": 1,
"x.com": 1,
"youtube.com": 1,
"clinicseoul.net": 3,
"en.345-ps.com": 1,
"en.nanahospital.com": 3,
"gangnam.health": 2,
"gangnamdrk.com": 2,
"korea-clinics.com": 1,
"koreacareguide.com": 1,
"noonopiclinic.com": 1,
"triple.global": 1,
"expatguidekorea.com": 1,
"gangnamwomenshealth.com": 3,
"girinpsen.com": 4,
"koreaexperience.com": 4,
"medicaltourismco.com": 4,
"medicaltravelkorea.com": 4,
"experts-beauty.com": 4,
"gangnamrhinoplasty.com": 1,
"kowonplasticsurgery.com": 1,
"rhinoplastyclinicseoul.com": 1,
"theplusps.co": 2,
"doublejawsurgerykorea.com": 1,
"en.whydental.co.kr": 1,
"eng.idhospital.com": 1,
"gangnam.dental": 1,
"idhospital.com": 4,
"plasticsurgeryko.com": 1,
"thebestoms.com": 1,
"wonjinbeauty.com": 2,
"en-ggps.com": 1,
"en.chiups.com": 1,
"gangnambeautyguide.com": 1,
"gangnamplasticsurgery.clinic": 1,
"seoulcp.com": 1,
"drspiegel.com": 1,
"beautymedtravel.com": 1,
"daprseng.com": 3,
"goodbyeacup.com": 2,
"jkplastic.com": 3,
"jy-clinic.com": 1,
"mineclinic.com": 2,
"motiva.health": 2,
"seojinps.co": 1,
"icloudhospital.com": 1,
"kculture.com": 1,
"natlawreview.com": 1,
"seoulbeautytalk.com": 2,
"thelineclinic.com": 1,
"woori-ps.com": 1,
"better.medicaltourism.com": 1,
"evitaclinic.com": 1,
"kr-webmagazine.com": 1,
"seoulguidemedical.com": 1,
"visitgangnam.net": 1,
"cmcseoul.or.kr": 1,
"medicaldepartures.com": 2,
"medigence.com": 1,
"mayoclinic.org": 1,
"plasticsurgery.org": 3,
"associationofbreastsurgery.org.uk": 1,
"mja.com.au": 1,
"pubmed.ncbi.nlm.nih.gov": 1,
"southernplasticsurgery.com": 1,
"blog.viewclinic.com": 1,
"canvassresearch.com": 1,
"cyl.co.kr": 1,
"gangnamclinicindex.com": 1,
"gangnamskinclinicreberry.com": 1,
"jwbeauty.net": 1,
"news.sbs.co.kr": 1,
"breastsurgerykorea.com": 1,
"drkim.com": 1,
"motivausa.com": 1,
"tcplasticsurgery.com": 1,
"mediqueen.net": 1,
"rnwoodclinickorea.com": 1,
"roisurgery.com": 1,
"medicaltourism.com": 1,
"pearlwellnesscenter.com": 1
},
"n": 60,
"mentioned": 30
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,192 @@
{
"_meta": {
"sampleUrls": [
"https://www.viewplasticsurgery.com",
"https://www.viewplasticsurgery.com/breast/breast-augmentation-motiva.html"
],
"sampleWarning": "표본 URL 2개 (<5). 판정은 홈·대표 시술 페이지 기준이며 사이트 전체로 일반화하지 말 것. 시술 상세 3개·오시는길·블로그를 curl+파서로 추가 확인할 것 (2026-08-28 뷰성형외과 오판 3건의 원인)"
},
"results": [
{
"criterionId": "A1",
"level": 3,
"evidence": "12개 AI 봇 전부 허용. OAI-SearchBot·PerplexityBot·GPTBot UA로 GET → 전부 200",
"source": "robots.txt: User-agent: * / Disallow: /wp-admin/"
},
{
"criterionId": "A2",
"level": 2,
"evidence": "CDN 사용(Apache/2.4.68 (Debian)), AI UA 차단 없음(전부 200)"
},
{
"criterionId": "A3",
"level": 3,
"evidence": "서버 렌더링. JS 미실행 HTML에서 본문 텍스트 79,646자 추출"
},
{
"criterionId": "A4",
"level": 3,
"evidence": "http://viewplasticsurgery.com → 301 → https://www.viewplasticsurgery.com/ 정본 수렴 (4변형 모두)"
},
{
"criterionId": "A5",
"level": 3,
"evidence": "robots.txt에 sitemap 선언, 200 응답. URL 482개, lastmod 최신 2026-09-09"
},
{
"criterionId": "A6",
"level": "unverified",
"evidence": "[manual] Bing Webmaster Tools 등록 여부는 오너 계정 접근 필요 (또는 site: 검색 수동 확인)"
},
{
"criterionId": "A7",
"level": 2,
"evidence": "TTFB 0.870s / 초기 HTML 587KB. 시술 페이지 212KB (TTFB 양호 / HTML 비대)"
},
{
"criterionId": "B1",
"level": 3,
"evidence": "JSON-LD 1블록 전부 유효 + @graph 연결"
},
{
"criterionId": "B2",
"level": 0,
"evidence": "업종 엔티티 스키마 없음 (발견 타입: CollectionPage, Person, WebSite)"
},
{
"criterionId": "B3",
"level": 0,
"evidence": "Physician/Attorney 스키마 없음. 전문가 정보는 HTML 텍스트·이미지로만 존재"
},
{
"criterionId": "B4",
"level": "unverified",
"evidence": "주소 자동 추출 실패 (수동 확인 필요). 전화 4종: 02-539-1132, 02-2138-1305, 023480-3573"
},
{
"criterionId": "B5",
"level": 0,
"evidence": "Organization.sameAs: [] (빈 배열). 푸터/본문에 SNS 링크 2종(www.instagram.com, www.tiktok.com) — 스키마에 미연결"
},
{
"criterionId": "B6",
"level": 2,
"evidence": "rel=canonical self-referencing 존재"
},
{
"criterionId": "B7",
"level": 3,
"evidence": "hreflang 10개 언어 연결: ar, en-us, es, id-id, ja-jp, mn-mn, ru-ru, th-th, vi-vn, zh-cn"
},
{
"criterionId": "C1",
"level": "unverified",
"evidence": "[semi·사람 판정 필요] 메인 첫 200자: \"Best Plastic Surgery in Korea for Foreigners | VIEW Seoul Gangnam korea plastic surgery Introduction…\" / 시술 페이지 첫 200자: \"Motiva Breast Augmentation Korea | KOL Clinic | VIEW Plastic Surgery korea plast…\" (첫 200자 내 상호 없음)"
},
{
"criterionId": "C2",
"level": 2,
"evidence": "FAQ 섹션 존재: \"VIEW Breast Surgery FAQ\" 외 0개. FAQPage 스키마 없음"
},
{
"criterionId": "C3",
"level": 2,
"evidence": "H1 1개: \"korea plastic surgery\". H2 중복 0건 또는 라벨형"
},
{
"criterionId": "C4",
"level": "unverified",
"evidence": "[semi·사람 판정 필요] 시술 페이지 수치 밀도: 가격표기 0회, 시간 0회, 일/주 0회, % 2회, 가격/비용/회복 단어 0회 — 표기 맥락(마케팅 문구 vs 실제 표) 확인 필요"
},
{
"criterionId": "C5",
"level": 3,
"evidence": "HTML 표 10개"
},
{
"criterionId": "C6",
"level": 2,
"evidence": "최신 갱신 신호 2026-09-09 (sitemap lastmod 2026-09-09). dateModified 마크업 없음"
},
{
"criterionId": "C7",
"level": "unverified",
"evidence": "[semi·사람 판정 필요] 전문가 언급 0회, 권위 키워드 13회 (KOL) — 자격·경력이 텍스트인지 이미지인지 확인 필요"
},
{
"criterionId": "C8",
"level": "unverified",
"evidence": "[manual] 핵심 페이지 단락 샘플 10개의 상호·시술명 포함 비율 수동 채점 필요"
},
{
"criterionId": "D1",
"level": "unverified",
"evidence": "[manual] 업종 버티컬(병의원: 강남언니 / 법률: 로톡) 프로필 수동 실측 필요 — 후기 수·의료진·이벤트·갱신일"
},
{
"criterionId": "D2",
"level": "unverified",
"evidence": "[manual] Google Maps 검색으로 GBP 소유·리뷰·NAP 수동 실측 필요"
},
{
"criterionId": "D3",
"level": "unverified",
"evidence": "[semi·사람 판정 필요] 검색 그라운딩 미실시. 사이트에서 발견된 외부 채널: www.tiktok.com(5), www.instagram.com(4), naver.me(2) — naver.com 제외 오픈웹 언급(티스토리·언론)은 검색으로 별도 집계 필요"
},
{
"criterionId": "D4",
"level": "unverified",
"evidence": "[manual] 홈페이지·버티컬·GBP·플레이스 NAP 대조표 수동 작성 필요"
},
{
"criterionId": "D5",
"level": "unverified",
"evidence": "[semi·사람 판정 필요] 사이트에 플레이스/지도 링크 발견: https://naver.me/x9BxGXkK — 플레이스 존재·홈페이지 역연결·리뷰 수 수동 확인"
},
{
"criterionId": "D6",
"level": 0,
"evidence": "Wikidata에서 \"VIEW Plastic Surgery (EN)\" 검색 결과 없음"
},
{
"criterionId": "E1",
"level": "unverified",
"evidence": "[manual] 서버 로그 접근 필요 (AI 크롤러 히트 + IP 검증)"
},
{
"criterionId": "E2",
"level": "unverified",
"evidence": "[manual] GA4 접근 필요 (AI 유입 커스텀 채널그룹 여부)"
},
{
"criterionId": "E3",
"level": "unverified",
"evidence": "[manual] GSC 접근 필요 (AI Overviews 노출)"
},
{
"criterionId": "E4",
"level": "unverified",
"evidence": "[manual] 기준선 스팟체크 미실시 (질의 10개 × 5회 반복은 별도 단계)"
},
{
"criterionId": "F1",
"level": 3,
"evidence": "메인 페이지 이미지 500개 중 0개(0%) alt 누락 또는 빈 값"
},
{
"criterionId": "F2",
"level": "unverified",
"evidence": "meta generator: WordPress 7.1 — 출시일 미상, 수동 판정 필요"
},
{
"criterionId": "F3",
"level": 2,
"evidence": "초기 HTML 587KB (300~800KB)"
},
{
"criterionId": "F4",
"level": 2,
"evidence": "viewport meta 존재, 반응형. CWV 미측정"
}
]
}

View File

@ -0,0 +1,50 @@
{
"C1": {
"level": 1,
"evidence": "정의문이 메타 설명에만 있다. About 메타: 'Founded in 2005, VIEW is a premier 19-story medical center in Gangnam, Seoul'. 본문 첫 단락은 슬로건('always considers the perspective of the patient'), 시술 페이지 첫 텍스트는 'Let Me In Season 2/3/4/5 Selected Doctors' 홍보 라벨. 홈 첫 200자는 검색창·메뉴"
},
"C4": {
"level": 1,
"evidence": "시술 페이지(가슴 Motiva) 본문에 가격·수술시간·회복기간 0회. 수치는 Motiva 보증(재수술 지원 300만원/개) 뿐. 블로그 글에는 USD 가격표(V-line $7,00012,000, 표 3행)와 체류 기간(1014일)이 있으나 시술 페이지와 연결되지 않음"
},
"C7": {
"level": 3,
"evidence": "의료진 상세 페이지에 학위(서울대 의학박사)·전문의 자격·학회 회원·논문 목록이 텍스트. 의료진 목록 26명에 역할(성형외과 전문의 15·이비인후과 1·피부과 3·유방외과 1·영상 1·마취과 6) 표기"
},
"C8": {
"level": 2,
"evidence": "5개 핵심 페이지 단락 샘플 50개 중 상호 또는 시술명 포함 26개(52%). 상호 'VIEW' 포함은 7개(14%). FAQ 답변은 'Motiva Preserve is…'처럼 시술명만 있고 상호가 없다"
},
"B4": {
"level": 2,
"evidence": "전 페이지 푸터 NAP 동일: 107 Bongeunsa-ro, Gangnam-gu / +82-2-539-1177 / eng_viewps@viewclinic.com / 진료시간. 구주소(201-14 Nonhyeon-dong) 병기. 개인정보 페이지에 다른 번호(02-2138-1305, 02-3480-3573) 노출"
},
"B7": {
"level": 2,
"evidence": "10개 언어 hreflang 양방향 선언. 그러나 th·jp·vn·ru·id·mn·es·ar 8개 서브도메인은 viewplasticsurgery.com/{lang}/ 로 301. hreflang 대상 URL이 최종 URL이 아니다. cn 페이지는 en-US 대신 en으로 선언"
},
"D2": {
"level": 2,
"evidence": "Google 비즈니스 프로필 4.9점·리뷰 901건, 소유자 게시 활성, 웹사이트가 영문 사이트로 연결(2026-08-31 실측 인용). 전화번호 미등록. 2026-09-10 재실측은 Places API 키 부재로 미실시"
},
"D4": {
"level": 2,
"evidence": "영문 사이트·GBP 주소 일치(107 Bongeunsa-ro). GBP 전화 없음. 강남언니는 국문 표면이라 외국인 질의 근거로는 쓰이지 않음"
},
"E4": {
"level": 2,
"evidence": "2026-09-10 외국인 관점 영문 60문항 × 2엔진(Perplexity sonar, OpenAI gpt-4o web_search 뉴욕 위치) 1회 실측. 5회 반복은 미실시"
},
"F2": {
"level": 2,
"evidence": "WordPress 7.1(2026 최신 계열). meta generator로 버전 노출"
},
"D1": {
"level": 2,
"evidence": "외국인 대상 리뷰·중개 플랫폼 기준. Bookimed(us-uk.bookimed.com) 프로필과 RealSelf 평점(제3자 인용 4.8/5)이 AI 답변의 인용 출처로 확인됨. 리뷰 수·갱신일·소유자 응답은 직접 실측하지 못함. 강남언니(국문)는 외국인 질의 60문항 어디에도 인용되지 않음"
},
"D3": {
"level": 2,
"evidence": "뷰를 언급한 AI 답변의 인용처가 유치업체·에이전시 블로그(khunkim.com·clinicsoncall.com·curemeabroad.com·kmhglobal.com), 정부 표면(english.visitkorea.or.kr·medicaltour.gangnam.go.kr), 커뮤니티(reddit.com·forum.purseblog.com), LinkedIn에 분산. 영어권 주요 언론 기사와 Wikipedia 항목은 없음"
}
}

View File

@ -0,0 +1,500 @@
{
"label": "VIEW EN",
"v1": {
"score": 64,
"grade": "B",
"earned": 55.7,
"possible": 87.0,
"verified": 31,
"total": 36,
"categories": {
"access": 92,
"entity": 38,
"content": 63,
"surface": 63,
"measure": 67,
"hygiene": 80
}
},
"aeo": {
"score": 61,
"raw": 61,
"grade": "B",
"earned": 55.0,
"possible": 90.0,
"items": [
[
"AEO1",
"질문 수요 충족",
67
],
[
"AEO2",
"답변의 직접성",
33
],
[
"AEO3",
"답변 단위의 자기완결성",
67
],
[
"AEO4",
"의사결정에 필요한 정보",
60
],
[
"AEO5",
"정보 구조와 가독성",
67
],
[
"AEO6",
"다음 행동의 명확성",
null
],
[
"AEO7",
"핵심 답변의 텍스트 추출",
100
],
[
"AEO8",
"사이트 내 답변 발견",
87
]
]
},
"geo": {
"score": 70,
"raw": 70,
"grade": "B",
"earned": 42.0,
"possible": 60.0,
"items": [
[
"GEO1",
"주장과 근거의 일치",
null
],
[
"GEO2",
"출처의 적합성과 추적성",
100
],
[
"GEO3",
"전문성과 책임 주체",
60
],
[
"GEO4",
"병원 엔티티와 사실의 정합성",
42
],
[
"GEO5",
"사실의 최신성과 정정",
67
],
[
"GEO6",
"원천 대비 추가 가치",
null
],
[
"GEO7",
"발행 관계와 투명성",
null
],
[
"GEO8",
"인용 식별자와 메타데이터 정합성",
100
]
]
},
"gates": [
{
"id": "G1",
"passed": true,
"failedBy": [],
"cap": 40,
"axes": [
"aeo",
"geo"
]
},
{
"id": "G2",
"passed": true,
"failedBy": [],
"cap": 40,
"axes": [
"aeo",
"geo"
]
}
],
"aeo_h": {
"score": 65,
"grade": "B",
"earned": 65.0,
"possible": 100,
"items": [
[
"AEO1",
"질문 수요 충족",
20,
13.3,
"derived",
[
"C2=2"
]
],
[
"AEO2",
"답변의 직접성",
20,
6.7,
"derived",
[
"C1=1"
]
],
[
"AEO3",
"답변 단위의 자기완결성",
15,
10.0,
"derived",
[
"C8=2"
]
],
[
"AEO4",
"의사결정에 필요한 정보",
15,
9.0,
"derived",
[
"C4=1",
"C5=3"
]
],
[
"AEO5",
"정보 구조와 가독성",
10,
6.7,
"derived",
[
"C3=2"
]
],
[
"AEO6",
"다음 행동의 명확성",
10,
10.0,
"judged",
[]
],
[
"AEO7",
"핵심 답변의 텍스트 추출",
5,
5.0,
"derived",
[
"A3=3",
"F1=3"
]
],
[
"AEO8",
"사이트 내 답변 발견",
5,
4.3,
"derived",
[
"A5=3",
"B6=2"
]
]
]
},
"geo_h": {
"score": 72,
"grade": "B",
"earned": 72.0,
"possible": 100,
"items": [
[
"GEO1",
"주장과 근거의 일치",
20,
13.3,
"judged",
[]
],
[
"GEO2",
"출처의 적합성과 추적성",
15,
15.0,
"derived",
[
"A4=3"
]
],
[
"GEO3",
"전문성과 책임 주체",
15,
9.0,
"derived",
[
"C7=3",
"B3=0"
]
],
[
"GEO4",
"병원 엔티티와 사실의 정합성",
15,
6.3,
"derived",
[
"B2=0",
"B4=2",
"B5=0",
"D1=2",
"D2=2",
"D4=2",
"D6=0"
]
],
[
"GEO5",
"사실의 최신성과 정정",
10,
6.7,
"derived",
[
"C6=2"
]
],
[
"GEO6",
"원천 대비 추가 가치",
10,
10.0,
"judged",
[]
],
[
"GEO7",
"발행 관계와 투명성",
10,
6.7,
"judged",
[]
],
[
"GEO8",
"인용 식별자와 메타데이터 정합성",
5,
5.0,
"derived",
[
"B1=3"
]
]
]
},
"results": {
"A1": {
"criterionId": "A1",
"level": 3,
"evidence": "12개 AI 봇 전부 허용. OAI-SearchBot·PerplexityBot·GPTBot UA로 GET → 전부 200",
"source": "robots.txt: User-agent: * / Disallow: /wp-admin/"
},
"A2": {
"criterionId": "A2",
"level": 2,
"evidence": "CDN 사용(Apache/2.4.68 (Debian)), AI UA 차단 없음(전부 200)"
},
"A3": {
"criterionId": "A3",
"level": 3,
"evidence": "서버 렌더링. JS 미실행 HTML에서 본문 텍스트 79,646자 추출"
},
"A4": {
"criterionId": "A4",
"level": 3,
"evidence": "http://viewplasticsurgery.com → 301 → https://www.viewplasticsurgery.com/ 정본 수렴 (4변형 모두)"
},
"A5": {
"criterionId": "A5",
"level": 3,
"evidence": "robots.txt에 sitemap 선언, 200 응답. URL 482개, lastmod 최신 2026-09-09"
},
"A6": {
"criterionId": "A6",
"level": "unverified",
"evidence": "[manual] Bing Webmaster Tools 등록 여부는 오너 계정 접근 필요 (또는 site: 검색 수동 확인)"
},
"A7": {
"criterionId": "A7",
"level": 2,
"evidence": "TTFB 0.870s / 초기 HTML 587KB. 시술 페이지 212KB (TTFB 양호 / HTML 비대)"
},
"B1": {
"criterionId": "B1",
"level": 3,
"evidence": "JSON-LD 1블록 전부 유효 + @graph 연결"
},
"B2": {
"criterionId": "B2",
"level": 0,
"evidence": "업종 엔티티 스키마 없음 (발견 타입: CollectionPage, Person, WebSite)"
},
"B3": {
"criterionId": "B3",
"level": 0,
"evidence": "Physician/Attorney 스키마 없음. 전문가 정보는 HTML 텍스트·이미지로만 존재"
},
"B4": {
"criterionId": "B4",
"level": 2,
"evidence": "[사람 보정] 전 페이지 푸터 NAP 동일: 107 Bongeunsa-ro, Gangnam-gu / +82-2-539-1177 / eng_viewps@viewclinic.com / 진료시간. 구주소(201-14 Nonhyeon-dong) 병기. 개인정보 페이지에 다른 번호(02-2138-1305, 02-3480-3573) 노출"
},
"B5": {
"criterionId": "B5",
"level": 0,
"evidence": "Organization.sameAs: [] (빈 배열). 푸터/본문에 SNS 링크 2종(www.instagram.com, www.tiktok.com) — 스키마에 미연결"
},
"B6": {
"criterionId": "B6",
"level": 2,
"evidence": "rel=canonical self-referencing 존재"
},
"B7": {
"criterionId": "B7",
"level": 2,
"evidence": "[사람 보정] 10개 언어 hreflang 양방향 선언. 그러나 th·jp·vn·ru·id·mn·es·ar 8개 서브도메인은 viewplasticsurgery.com/{lang}/ 로 301. hreflang 대상 URL이 최종 URL이 아니다. cn 페이지는 en-US 대신 en으로 선언"
},
"C1": {
"criterionId": "C1",
"level": 1,
"evidence": "[사람 보정] 정의문이 메타 설명에만 있다. About 메타: 'Founded in 2005, VIEW is a premier 19-story medical center in Gangnam, Seoul'. 본문 첫 단락은 슬로건('always considers the perspective of the patient'), 시술 페이지 첫 텍스트는 'Let Me In Season 2/3/4/5 Selected Doctors' 홍보 라벨. 홈 첫 200자는 검색창·메뉴"
},
"C2": {
"criterionId": "C2",
"level": 2,
"evidence": "FAQ 섹션 존재: \"VIEW Breast Surgery FAQ\" 외 0개. FAQPage 스키마 없음"
},
"C3": {
"criterionId": "C3",
"level": 2,
"evidence": "H1 1개: \"korea plastic surgery\". H2 중복 0건 또는 라벨형"
},
"C4": {
"criterionId": "C4",
"level": 1,
"evidence": "[사람 보정] 시술 페이지(가슴 Motiva) 본문에 가격·수술시간·회복기간 0회. 수치는 Motiva 보증(재수술 지원 300만원/개) 뿐. 블로그 글에는 USD 가격표(V-line $7,00012,000, 표 3행)와 체류 기간(1014일)이 있으나 시술 페이지와 연결되지 않음"
},
"C5": {
"criterionId": "C5",
"level": 3,
"evidence": "HTML 표 10개"
},
"C6": {
"criterionId": "C6",
"level": 2,
"evidence": "최신 갱신 신호 2026-09-09 (sitemap lastmod 2026-09-09). dateModified 마크업 없음"
},
"C7": {
"criterionId": "C7",
"level": 3,
"evidence": "[사람 보정] 의료진 상세 페이지에 학위(서울대 의학박사)·전문의 자격·학회 회원·논문 목록이 텍스트. 의료진 목록 26명에 역할(성형외과 전문의 15·이비인후과 1·피부과 3·유방외과 1·영상 1·마취과 6) 표기"
},
"C8": {
"criterionId": "C8",
"level": 2,
"evidence": "[사람 보정] 5개 핵심 페이지 단락 샘플 50개 중 상호 또는 시술명 포함 26개(52%). 상호 'VIEW' 포함은 7개(14%). FAQ 답변은 'Motiva Preserve is…'처럼 시술명만 있고 상호가 없다"
},
"D1": {
"criterionId": "D1",
"level": 2,
"evidence": "[사람 보정] 외국인 대상 리뷰·중개 플랫폼 기준. Bookimed(us-uk.bookimed.com) 프로필과 RealSelf 평점(제3자 인용 4.8/5)이 AI 답변의 인용 출처로 확인됨. 리뷰 수·갱신일·소유자 응답은 직접 실측하지 못함. 강남언니(국문)는 외국인 질의 60문항 어디에도 인용되지 않음"
},
"D2": {
"criterionId": "D2",
"level": 2,
"evidence": "[사람 보정] Google 비즈니스 프로필 4.9점·리뷰 901건, 소유자 게시 활성, 웹사이트가 영문 사이트로 연결(2026-08-31 실측 인용). 전화번호 미등록. 2026-09-10 재실측은 Places API 키 부재로 미실시"
},
"D3": {
"criterionId": "D3",
"level": 2,
"evidence": "[사람 보정] 뷰를 언급한 AI 답변의 인용처가 유치업체·에이전시 블로그(khunkim.com·clinicsoncall.com·curemeabroad.com·kmhglobal.com), 정부 표면(english.visitkorea.or.kr·medicaltour.gangnam.go.kr), 커뮤니티(reddit.com·forum.purseblog.com), LinkedIn에 분산. 영어권 주요 언론 기사와 Wikipedia 항목은 없음"
},
"D4": {
"criterionId": "D4",
"level": 2,
"evidence": "[사람 보정] 영문 사이트·GBP 주소 일치(107 Bongeunsa-ro). GBP 전화 없음. 강남언니는 국문 표면이라 외국인 질의 근거로는 쓰이지 않음"
},
"D5": {
"criterionId": "D5",
"level": "unverified",
"evidence": "[semi·사람 판정 필요] 사이트에 플레이스/지도 링크 발견: https://naver.me/x9BxGXkK — 플레이스 존재·홈페이지 역연결·리뷰 수 수동 확인"
},
"D6": {
"criterionId": "D6",
"level": 0,
"evidence": "Wikidata에서 \"VIEW Plastic Surgery (EN)\" 검색 결과 없음"
},
"E1": {
"criterionId": "E1",
"level": "unverified",
"evidence": "[manual] 서버 로그 접근 필요 (AI 크롤러 히트 + IP 검증)"
},
"E2": {
"criterionId": "E2",
"level": "unverified",
"evidence": "[manual] GA4 접근 필요 (AI 유입 커스텀 채널그룹 여부)"
},
"E3": {
"criterionId": "E3",
"level": "unverified",
"evidence": "[manual] GSC 접근 필요 (AI Overviews 노출)"
},
"E4": {
"criterionId": "E4",
"level": 2,
"evidence": "[사람 보정] 2026-09-10 외국인 관점 영문 60문항 × 2엔진(Perplexity sonar, OpenAI gpt-4o web_search 뉴욕 위치) 1회 실측. 5회 반복은 미실시"
},
"F1": {
"criterionId": "F1",
"level": 3,
"evidence": "메인 페이지 이미지 500개 중 0개(0%) alt 누락 또는 빈 값"
},
"F2": {
"criterionId": "F2",
"level": 2,
"evidence": "[사람 보정] WordPress 7.1(2026 최신 계열). meta generator로 버전 노출"
},
"F3": {
"criterionId": "F3",
"level": 2,
"evidence": "초기 HTML 587KB (300~800KB)"
},
"F4": {
"criterionId": "F4",
"level": 2,
"evidence": "viewport meta 존재, 반응형. CWV 미측정"
}
}
}

View File

@ -0,0 +1,489 @@
#!/usr/bin/env python3
"""뷰성형외과 영문 사이트 · 외국인 관점 AEO/GEO 진단 보고서 빌더.
입력 (같은 폴더):
audit_en_scored.json score_en.py 결과 (v1.0 36항목 + v2.0 AEO/GEO)
question_bank_en.json 외국인 관점 영문 60문항
qb_en_perplexity_results.jsonl Perplexity sonar 실측
qb_en_openai_results.jsonl OpenAI gpt-4o web_search(뉴욕 위치) 실측
출력:
Viewclinic_Global_EN_AEO_GEO_Report_<date>.html / .pdf (Playwright chromium)
사용: python3 build_global_en_report.py
"""
import json, os, re, sys, html, datetime as dt
from collections import Counter, defaultdict
from urllib.parse import urlparse
HERE = os.path.dirname(os.path.abspath(__file__))
DATE = "2026-09-10"
OUT_BASE = os.path.join(HERE, f"Viewclinic_Global_EN_AEO_GEO_Report_{DATE}")
SITE = "www.viewplasticsurgery.com"
KR_BASE = {"v1": 54, "aeo": 42, "geo": 56} # 국문 사이트 2026-09-07 재채점 (AEO_GEO_RUBRIC_v2.md)
CATS = {"A": "브랜드 직접 질문", "B": "이동·체류·운영", "C": "추천·비교", "D": "시술 정보",
"E": "가격", "F": "안전·신뢰", "G": "사후관리·원격 팔로업"}
CAT_EN = {"A": "Brand", "B": "Travel & logistics", "C": "Recommendation & comparison", "D": "Procedure info",
"E": "Pricing", "F": "Safety & trust", "G": "Aftercare & remote follow-up"}
STAGE = {"aware": "인지", "explore": "탐색", "compare": "비교", "decision": "결정"}
V1_NAMES = {
"A1":"검색용 AI 봇 허용","A2":"CDN/WAF AI 차단 없음","A3":"서버 렌더링 본문","A4":"HTTPS·리다이렉트 정합","A5":"sitemap.xml 제공","A6":"Bing 색인 (ChatGPT 검색 경로)","A7":"응답 속도·크롤 예산",
"B1":"JSON-LD 문법 유효성","B2":"업종 엔티티 스키마 (MedicalClinic)","B3":"전문가 스키마 (Physician)","B4":"NAP 사이트 내 일관성","B5":"sameAs 연결","B6":"canonical·중복 제거","B7":"다국어 hreflang",
"C1":"정의문형 첫 문단","C2":"FAQ 섹션","C3":"제목 계층 의미성","C4":"구체 수치 (가격·시간·회복)","C5":"표·비교 구조","C6":"신선도 신호","C7":"전문가 E-E-A-T (의료진)","C8":"패시지 자기완결성",
"D1":"업종 버티컬 프로필 (외국인: 국제 리뷰 플랫폼)","D2":"Google 비즈니스 프로필","D3":"오픈웹 언급 (해외 커뮤니티·언론)","D4":"표면 간 NAP 완전 일치","D5":"네이버 플레이스 (AI 브리핑 전용)","D6":"위키데이터/위키백과 엔티티",
"E1":"AI 크롤러 로그 (IP 검증)","E2":"GA4 AI 유입 채널","E3":"GSC AI Overviews 노출","E4":"기준선 스팟체크",
"F1":"이미지 대체텍스트","F2":"CMS 보안·최신성","F3":"페이지 무게","F4":"모바일 대응"}
V1_CAT = {"A":"A · Access & Crawlability","B":"B · Entity & Structured Data","C":"C · Content & Answerability","D":"D · Surfaces & Citations","E":"E · Measurement","F":"F · Technical Hygiene"}
V2_DESC = {
"AEO1":"질문 뱅크 대비 답이 있는 문항 비율. 자동 신호는 FAQ 섹션·FAQPage 스키마",
"AEO2":"핵심 페이지 첫 200자에 [상호+지역+전문분야] 정의문 또는 직접 답 존재",
"AEO3":"핵심 페이지 단락 샘플 중 상호·시술명이 포함된 비율",
"AEO4":"시술 페이지의 가격·시간·회복 수치 밀도와 표·비교 구조",
"AEO5":"H1 1개·서술형, H2 논리 계층",
"AEO6":"예약·전화·위치가 본문 텍스트로 연결되는지 (사람 판정)",
"AEO7":"JS 미실행 HTML 본문 비율 + 이미지 alt",
"AEO8":"sitemap 선언·lastmod + canonical 정합",
"GEO1":"주장 문장에 출처·조건·시점이 붙은 비율 (사람 판정)",
"GEO2":"http/www 변형의 301 정본 수렴, URL 안정성",
"GEO3":"전문가 자격·경력 텍스트 + Physician 스키마",
"GEO4":"업종 스키마·사이트 내 NAP·sameAs·버티컬·GBP·표면 간 NAP·Wikidata",
"GEO5":"dateModified·sitemap lastmod·본문 갱신일",
"GEO6":"타 사이트에 없는 병원 고유 정보 유형 수 (사람 판정)",
"GEO7":"운영 주체·연락처·이해관계 고지, 정보와 광고의 구분 (사람 판정)",
"GEO8":"ld+json 전 블록 파싱 + 화면과 메타 일치"}
V2_HUMAN_EVIDENCE = {
"AEO6": "전 페이지 푸터에 전화 +82-2-539-1177 · 이메일 eng_viewps@viewclinic.com · 주소 · 진료시간이 텍스트로 반복. Quick Consultation 폼에 WhatsApp · LINE · KakaoTalk · Viber 선택지와 국가번호 입력. Google Map · Naver Map 링크. 전화·예약·방문 3경로 충족",
"GEO1": "'No.1 Motiva 사용량(2023, Motiva Korea 수술량 기준)' · 'Global KOL 20232026' · '법무부 우수 유치기관 20182026' 처럼 집계 주체·연도가 붙은 주장이 다수. 그러나 페이지 제목의 'Best Plastic Surgery in Korea' · 'No.1 Trusted Clinic'은 근거 없음. 가슴 페이지 메타 설명은 'No.1 Motiva usage in 2013', 본문은 2023으로 불일치. 안전 페이지의 '마취과 전문의 상시'는 인원 수 없음(의료진 페이지에는 6명 명시)",
"GEO6": "컨시어지 10항목(10개 언어 통역 무료 · 공항 픽업 · 원내 숙박 · 도보 10분 제휴 호텔 · T-money 제공 · 귀국 후 원격 경과 관찰), 층별 안내(B1 검진센터~15F 치과), 공항 리무진 노선·정류장 번호, 블로그 USD 가격표, FAQ 402건, Motiva 보증 조건(5년 재수술 지원 300만원/개, 10년 교체). 원천 유형 5개 이상",
"GEO7": "푸터에 상호 · 대표(Choi Soon Woo) · 사업자번호 220-08-86777 표기. 전 페이지에 부작용 고지문. 다만 시술 페이지 안에 Before & After · Real Review · 'Let Me In' 출연 홍보가 정보와 구분 없이 섞여 있고, 후기의 대가 지급 여부 고지가 없다. 국문 사이트 후기 광고는 2026-07-12 공정위 시정명령을 받았고 영문 Real Review 섹션도 같은 방식이다"}
# ─────────────────────────── 데이터 로드 ───────────────────────────
def load_jsonl(p):
rows = {}
if os.path.exists(p):
for line in open(p, encoding="utf-8"):
if line.strip():
r = json.loads(line); rows[r["id"]] = r
return rows
score = json.load(open(os.path.join(HERE, "audit_en_scored.json"), encoding="utf-8"))
qs = json.load(open(os.path.join(HERE, "question_bank_en.json"), encoding="utf-8"))
PP = load_jsonl(os.path.join(HERE, "qb_en_perplexity_results.jsonl"))
OA = load_jsonl(os.path.join(HERE, "qb_en_openai_results.jsonl"))
ENGINES = [("perplexity", "Perplexity", PP), ("openai", "OpenAI 웹검색", OA)]
def dom(u):
d = urlparse(u).netloc.lower()
return d[4:] if d.startswith("www.") else d
OWN = ("viewplasticsurgery.com", "viewclinic.com")
def own_cited(r):
return any(any(o in dom(u) for o in OWN) for u in r.get("urls", []))
# 집계
stats = {}
for key, label, rows in ENGINES:
st = {"n": 0, "mentioned": 0, "own": 0, "first": 0, "sent": Counter(), "cat": defaultdict(lambda: [0, 0, 0, 0]),
"clinics": Counter(), "clinic_first": Counter(), "domains": Counter(), "domains_view": Counter(), "own_urls": Counter()}
for q in qs:
r = rows.get(q["id"])
if not r: continue
st["n"] += 1
c = st["cat"][q["cat"]]; c[0] += 1
vm = bool(r.get("view_mentioned"))
if vm:
st["mentioned"] += 1; c[1] += 1
st["sent"][r.get("view_sentiment") or "neutral"] += 1
if r.get("view_rank") == 1: st["first"] += 1; c[3] += 1
if own_cited(r): st["own"] += 1; c[2] += 1
for i, cl in enumerate([x for x in r.get("clinics", []) if isinstance(x, str)][:8]):
st["clinics"][cl] += 1
if i == 0: st["clinic_first"][cl] += 1
ds = {dom(u) for u in r.get("urls", [])}
for d in ds:
st["domains"][d] += 1
if vm: st["domains_view"][d] += 1
for u in r.get("urls", []):
if any(o in dom(u) for o in OWN):
path = urlparse(u).path
st["own_urls"][path] += 1
stats[key] = st
def pct(a, b): return f"{a*100//b}%" if b else "-"
# ─────────────────────────── HTML 도우미 ───────────────────────────
def esc(s): return html.escape(str(s).replace("", ", ").replace(" ,", ","), quote=False)
def lvl_badge(level):
if level == "unverified": return '<span class="badge unv">미검증</span>'
cls = {3: "good", 2: "info", 1: "warn", 0: "crit"}[int(level)]
return f'<span class="badge {cls}">{level}</span>'
def grade_cls(g): return {"A": "good", "B": "info", "C": "warn", "D": "crit"}[g]
def ox(v): return '<b class="o">O</b>' if v else '<span class="x">X</span>'
# ─────────────────────────── 섹션 ───────────────────────────
aeo, geo, v1 = score["aeo_h"], score["geo_h"], score["v1"]
results = score["results"]
def kpi_row():
pp, oa = stats["perplexity"], stats["openai"]
cells = [
("AEO 답변 준비도", f"{aeo['score']}", aeo["grade"], "영문 사이트가 외국인 질문에 답하는 정도 · 100점"),
("GEO 출처 준비도", f"{geo['score']}", geo["grade"], "AI가 영문 사이트를 출처로 쓸 수 있는 정도 · 100점"),
("v1.0 종합 (참고)", f"{v1['score']}", v1["grade"], f"36항목 중 검증 {v1['verified']}개 · 국문 사이트 {KR_BASE['v1']}/C"),
("Perplexity 언급률", pct(pp["mentioned"], pp["n"]), None, f"{pp['n']}문항 중 {pp['mentioned']} · 자사 사이트 인용 {pct(pp['own'], pp['n'])}"),
("OpenAI 웹검색 언급률", pct(oa["mentioned"], oa["n"]), None, f"{oa['n']}문항 중 {oa['mentioned']} · 자사 사이트 인용 {pct(oa['own'], oa['n'])}"),
]
h = '<div class="kpis">'
for lab, val, g, sub in cells:
gb = f'<span class="grade {grade_cls(g)}">{g}</span>' if g else ""
h += f'<div class="kpi"><div class="lab">{lab}</div><div class="val">{val}{gb}</div><div class="sub">{sub}</div></div>'
return h + "</div>"
def cat_table():
h = ['<table class="t"><thead><tr><th>질문군</th><th>문항</th>',
'<th>Perplexity<br><small>언급 / 1순위 / 자사 인용</small></th>',
'<th>OpenAI 웹검색<br><small>언급 / 1순위 / 자사 인용</small></th><th>해석</th></tr></thead><tbody>']
interp = NARR["cat_interp"]
for k in "ABCDEFG":
n = sum(1 for q in qs if q["cat"] == k)
cells = []
for key, _, _ in ENGINES:
c = stats[key]["cat"].get(k, [0, 0, 0, 0])
cells.append(f"<td class='num'>{pct(c[1], c[0])} / {pct(c[3], c[0])} / {pct(c[2], c[0])}</td>")
h.append(f"<tr><td><b>{k}</b> {CATS[k]}<span class='cat'>{CAT_EN[k]}</span></td><td class='num'>{n}</td>{''.join(cells)}<td>{esc(interp.get(k, ''))}</td></tr>")
tot = []
for key, _, _ in ENGINES:
st = stats[key]; tot.append(f"<td class='num'><b>{pct(st['mentioned'], st['n'])} / {pct(st['first'], st['n'])} / {pct(st['own'], st['n'])}</b></td>")
h.append(f"<tr class='sum'><td><b>합계</b></td><td class='num'>{len(qs)}</td>{''.join(tot)}<td></td></tr></tbody></table>")
return "".join(h)
def clinic_table():
merged = Counter(); first = Counter()
for key, _, _ in ENGINES:
merged.update(stats[key]["clinics"]); first.update(stats[key]["clinic_first"])
h = ['<table class="t"><thead><tr><th>#</th><th>병원 (AI 답변 표기)</th><th>Perplexity</th><th>OpenAI</th><th>합계</th><th>1순위 등장</th></tr></thead><tbody>']
for i, (name, cnt) in enumerate(merged.most_common(12), 1):
cls = " class='hl'" if name == "VIEW Plastic Surgery" else ""
h.append(f"<tr{cls}><td class='num'>{i}</td><td>{esc(name)}</td><td class='num'>{stats['perplexity']['clinics'].get(name,0)}</td>"
f"<td class='num'>{stats['openai']['clinics'].get(name,0)}</td><td class='num'><b>{cnt}</b></td><td class='num'>{first.get(name,0)}</td></tr>")
h.append("</tbody></table>")
return "".join(h)
def domain_table():
merged = Counter(); view = Counter()
for key, _, _ in ENGINES:
merged.update(stats[key]["domains"]); view.update(stats[key]["domains_view"])
h = ['<table class="t"><thead><tr><th>#</th><th>인용 도메인</th><th>Perplexity</th><th>OpenAI</th><th>합계 (문항 수)</th><th>뷰 언급 답변에서</th><th>표면 유형</th></tr></thead><tbody>']
for i, (d, cnt) in enumerate(merged.most_common(18), 1):
cls = " class='hl'" if any(o in d for o in OWN) else ""
h.append(f"<tr{cls}><td class='num'>{i}</td><td>{esc(d)}</td><td class='num'>{stats['perplexity']['domains'].get(d,0)}</td>"
f"<td class='num'>{stats['openai']['domains'].get(d,0)}</td><td class='num'><b>{cnt}</b></td><td class='num'>{view.get(d,0)}</td><td>{esc(surface_type(d))}</td></tr>")
h.append("</tbody></table>")
return "".join(h)
def surface_type(d):
if any(o in d for o in OWN): return "자사 사이트"
if "reddit" in d or "quora" in d: return "커뮤니티"
if "realself" in d or "whatclinic" in d or "bookimed" in d or "medigo" in d or "trustpilot" in d or "gangnamunni" in d or "yelp" in d: return "리뷰·중개 플랫폼"
if "youtube" in d or "instagram" in d or "tiktok" in d or "facebook" in d: return "소셜"
if "korea" in d and ("herald" in d or "times" in d or "joongang" in d or "yonhap" in d): return "언론"
if d.endswith(".go.kr") or "visitkorea" in d or "medicalkorea" in d or "seoul" in d: return "정부·관광"
if d.endswith(".com") or d.endswith(".net") or d.endswith(".kr") or d.endswith(".org"): return "타 병원·에이전시·블로그"
return ""
def own_url_table():
merged = Counter()
for key, _, _ in ENGINES: merged.update(stats[key]["own_urls"])
if not merged: return "<p>자사 URL 인용 없음</p>"
h = ['<table class="t"><thead><tr><th>인용된 자사 페이지</th><th>Perplexity</th><th>OpenAI</th><th>합계</th></tr></thead><tbody>']
for p, cnt in merged.most_common(12):
h.append(f"<tr><td class='mono'>{esc(p)}</td><td class='num'>{stats['perplexity']['own_urls'].get(p,0)}</td><td class='num'>{stats['openai']['own_urls'].get(p,0)}</td><td class='num'><b>{cnt}</b></td></tr>")
return "".join(h) + "</tbody></table>"
def sentiment_block():
h = '<div class="grid3">'
for key, label, _ in ENGINES:
s = stats[key]["sent"]; m = stats[key]["mentioned"]
h += (f'<div class="card"><h4>{label}</h4><p class="big">{s.get("positive",0)} <small>긍정</small> · {s.get("neutral",0)} <small>중립</small> · {s.get("negative",0)} <small>부정</small></p>'
f'<p class="sub">뷰 언급 {m}문항 기준</p></div>')
h += f'<div class="card"><h4>판정 기준</h4><p class="sub">답변이 뷰성형외과를 어떻게 규정하는지를 후처리 모델이 긍정·중립·부정으로 분류. 감성 기준표 v0.3의 1차 근사치이며 사람 검토 전 값</p></div></div>'
return h
def quote_cards(ids):
h = '<div class="quotes">'
for qid, key in ids:
rows = PP if key == "perplexity" else OA
r = rows.get(qid)
if not r: continue
q = next(x for x in qs if x["id"] == qid)
ans = re.sub(r"\[\d+\]", "", r.get("answer", "")).strip()
ans = re.sub(r"\s+", " ", ans).replace("", ", ").replace(" ,", ",")[:420]
eng = "Perplexity" if key == "perplexity" else "OpenAI 웹검색"
doms = sorted({dom(u) for u in r.get("urls", [])})[:5]
h += (f'<div class="quote"><div class="qh"><b>{qid}</b> {esc(q["question"])} <span class="eng">{eng}</span> {ox(r.get("view_mentioned"))}</div>'
f'<p>{esc(ans)}…</p><div class="cite">인용: {esc(", ".join(doms))}</div></div>')
return h + "</div>"
def v2_table(axis):
h = ['<table class="t v2"><thead><tr><th>항목</th><th>배점</th><th>점수</th><th>근거 신호</th><th>판정 근거 (2026-09-10 실측)</th></tr></thead><tbody>']
for iid, name, w, earned, basis, sigs in axis["items"]:
if earned is None:
cell, sig = "<span class='badge unv'>미검증</span>", ""
else:
p = earned / w
cls = "good" if p >= 0.8 else "info" if p >= 0.6 else "warn" if p >= 0.4 else "crit"
cell = f"<span class='badge {cls}'>{earned:g}</span> <small>({round(p*100)}%)</small>"
sig = ", ".join(sigs) if sigs else "사람 판정"
ev = V2_HUMAN_EVIDENCE.get(iid) or NARR["v2_evidence"].get(iid, "")
h.append(f"<tr><td><b>{iid}</b> {name}<span class='cat'>{esc(V2_DESC[iid])}</span></td><td class='num'>{w}</td><td>{cell}</td><td class='mono'>{sig}</td><td>{esc(ev)}</td></tr>")
return "".join(h) + "</tbody></table>"
def v1_table():
h = []
for c in "ABCDEF":
h.append(f'<h4 class="v1cat">{V1_CAT[c]}</h4><table class="t"><thead><tr><th>항목</th><th>레벨</th><th>근거</th></tr></thead><tbody>')
for cid in sorted(k for k in V1_NAMES if k[0] == c):
r = results.get(cid, {})
lv = r.get("level", "unverified")
ev = r.get("evidence", "")
h.append(f"<tr><td><b>{cid}</b> {V1_NAMES[cid]}</td><td>{lvl_badge(lv)}</td><td>{esc(ev)}</td></tr>")
h.append("</tbody></table>")
return "".join(h)
def compare_table():
rows = NARR["compare_rows"]
h = ['<table class="t"><thead><tr><th>항목</th><th>국문 사이트 (viewclinic.com)</th><th>영문 사이트 (viewplasticsurgery.com)</th><th>차이</th></tr></thead><tbody>']
for a, b, c, d in rows:
h.append(f"<tr><td><b>{esc(a)}</b></td><td>{esc(b)}</td><td>{esc(c)}</td><td>{esc(d)}</td></tr>")
return "".join(h) + "</tbody></table>"
def roadmap():
h = ""
for phase, color, items in NARR["roadmap"]:
h += f'<h4 class="phase {color}">{esc(phase)}</h4><table class="t road"><thead><tr><th>#</th><th>조치</th><th>대상 항목·질문군</th><th>기대 효과</th></tr></thead><tbody>'
for i, (act, target, effect) in enumerate(items, 1):
h += f"<tr><td class='num'>{i}</td><td>{esc(act)}</td><td class='mono'>{esc(target)}</td><td>{esc(effect)}</td></tr>"
h += "</tbody></table>"
return h
def appendix_questions():
h = ['<table class="t app"><thead><tr><th>#</th><th>질문 (영문 원문)</th><th>단계</th><th>Perplexity<br><small>언급·순위·감성</small></th><th>OpenAI<br><small>언급·순위·감성</small></th><th>답변 내 상위 병원 (Perplexity → OpenAI)</th></tr></thead><tbody>']
cur = None
for q in qs:
if q["cat"] != cur:
cur = q["cat"]
h.append(f"<tr class='grp'><td colspan='6'><b>{cur}</b> {CATS[cur]} · {CAT_EN[cur]}</td></tr>")
cells = []; names = []
for key, _, rows in ENGINES:
r = rows.get(q["id"])
if not r: cells.append("<td>-</td>"); names.append("-"); continue
s = {"positive": "긍정", "neutral": "중립", "negative": "부정"}.get(r.get("view_sentiment") or "", "")
cells.append(f"<td>{ox(r.get('view_mentioned'))} {r.get('view_rank') or ''} <small>{s}</small></td>")
cl = [x for x in r.get("clinics", []) if isinstance(x, str) and x != "VIEW Plastic Surgery"][:3]
names.append(", ".join(cl) if cl else "(뷰 외 없음)")
h.append(f"<tr><td class='mono'>{q['id']}</td><td>{esc(q['question'])}</td><td>{STAGE[q['stage']]}</td>{''.join(cells)}<td><small>{esc(names[0])}{esc(names[1])}</small></td></tr>")
return "".join(h) + "</tbody></table>"
# ─────────────────────────── 서술 (실측 후 작성) ───────────────────────────
NARR = json.load(open(os.path.join(HERE, "narrative_ko.json"), encoding="utf-8"))
# ─────────────────────────── 렌더 ───────────────────────────
CSS = """
:root{--ink:#0A1128;--navy:#021341;--violet:#4F1DA1;--accent:#6C5CE7;--indigo:#1D0024;--light:#F7F8FC;--line:#E4E6F0;--slate6:#475569;--slate5:#64748B;
--good-bg:#ECFDF5;--good-tx:#047857;--good-bd:#A7F3D0;--info-bg:#EEF2FF;--info-tx:#3730A3;--info-bd:#C7D2FE;--warn-bg:#FFFBEB;--warn-tx:#B45309;--warn-bd:#FDE68A;--crit-bg:#FEF2F2;--crit-tx:#B91C1C;--crit-bd:#FECACA}
*{box-sizing:border-box}html{-webkit-print-color-adjust:exact;print-color-adjust:exact}
body{margin:0;font-family:"Pretendard Variable",Pretendard,"Apple SD Gothic Neo","Noto Sans KR",sans-serif;color:var(--indigo);background:#fff;font-size:15px;line-height:1.65;word-break:keep-all}
.page{max-width:1080px;margin:0 auto;padding:0 40px 60px}
.serif{font-family:"Playfair Display",Georgia,serif}
.cover{background:linear-gradient(135deg,var(--ink) 0%,var(--navy) 55%,#2A1466 100%);color:#fff;padding:64px 56px 52px;margin:0 -40px 36px;position:relative;overflow:hidden}
.cover:after{content:"";position:absolute;right:-120px;top:-120px;width:420px;height:420px;border-radius:50%;background:radial-gradient(circle,rgba(108,92,231,.45),transparent 70%)}
.eyebrow{font-family:Inter,Pretendard,sans-serif;font-size:12px;letter-spacing:.2em;text-transform:uppercase;color:#C4B5FD;font-weight:600}
.cover h1{font-size:38px;line-height:1.25;margin:14px 0 8px;font-weight:800}
.cover .sub{font-size:19px;color:#DDD6FE;margin:0 0 22px}
.cover .meta{font-size:14px;color:#C4B5FD;display:flex;gap:22px;flex-wrap:wrap}
.cover .meta b{color:#fff;font-weight:600}
h2{font-family:"Playfair Display",Georgia,serif;font-size:28px;color:var(--indigo);margin:44px 0 6px;font-weight:700;display:flex;align-items:center;gap:12px}
h2 .n{font-size:14px;font-family:Inter,Pretendard,sans-serif;letter-spacing:.15em;color:var(--accent);font-weight:700}
h2 + .lead{font-size:17px;color:var(--violet);margin:0 0 18px;font-weight:500}
h3{font-size:20px;margin:28px 0 10px;color:var(--indigo)}
h4{font-size:16px;margin:18px 0 8px;color:var(--indigo)}
p{margin:0 0 12px}
.kpis{display:grid;grid-template-columns:repeat(5,1fr);gap:12px;margin:8px 0 22px}
.kpi{background:var(--light);border:1px solid var(--line);border-radius:12px;padding:16px 16px 14px}
.kpi .lab{font-size:13px;font-weight:600;color:var(--slate6)}
.kpi .val{font-family:"Playfair Display",Georgia,serif;font-size:40px;line-height:1.1;margin:6px 0 4px;color:var(--indigo);display:flex;align-items:baseline;gap:8px}
.kpi .sub{font-size:12.5px;color:var(--slate6);line-height:1.45}
.grade{font-family:Inter,Pretendard,sans-serif;font-size:15px;font-weight:800;border-radius:999px;padding:2px 10px}
.good{background:var(--good-bg);color:var(--good-tx);border:1px solid var(--good-bd)}.info{background:var(--info-bg);color:var(--info-tx);border:1px solid var(--info-bd)}
.warn{background:var(--warn-bg);color:var(--warn-tx);border:1px solid var(--warn-bd)}.crit{background:var(--crit-bg);color:var(--crit-tx);border:1px solid var(--crit-bd)}
.unv{background:#F1F5F9;color:var(--slate5);border:1px solid var(--line)}
.badge{display:inline-block;font-family:Inter,Pretendard,sans-serif;font-size:15px;font-weight:800;border-radius:8px;padding:1px 10px;min-width:34px;text-align:center}
.badge.unv{font-size:12px;font-weight:600}
table.t{width:100%;border-collapse:collapse;font-size:14px;margin:8px 0 18px;page-break-inside:auto}
table.t th{background:var(--light);text-align:left;font-weight:700;padding:9px 10px;border-bottom:2px solid var(--line);font-size:13.5px;color:var(--indigo);vertical-align:bottom}
table.t th small{font-weight:500;color:var(--slate6)}
table.t td{padding:9px 10px;border-bottom:1px solid var(--line);vertical-align:top}
table.t tr{page-break-inside:avoid}
table.t td.num{text-align:center;white-space:nowrap}
table.t .mono{font-family:Inter,Menlo,monospace;font-size:12.5px;color:var(--slate6)}
table.t tr.hl td{background:#F3F0FF;font-weight:600}
table.t tr.sum td{background:var(--light)}
table.t tr.grp td{background:#EEF2FF;color:var(--violet);font-size:14px}
td .cat{display:block;font-size:12.5px;color:var(--slate5);font-weight:400;line-height:1.4;margin-top:2px}
.o{color:var(--good-tx);font-weight:800}.x{color:var(--slate5)}
.findings{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin:6px 0 10px}
.card{background:#fff;border:1px solid var(--line);border-radius:12px;padding:16px 18px;page-break-inside:avoid}
.card h4{margin:0 0 6px;font-size:16px}
.card p{font-size:14.5px;margin:0}
.card .big{font-size:26px;font-family:"Playfair Display",Georgia,serif;margin:2px 0}
.card .big small{font-size:13px;font-family:Pretendard,sans-serif;color:var(--slate6)}
.card .sub{font-size:13px;color:var(--slate6);margin-top:4px}
.card.dark{background:var(--navy);color:#fff;border:0}.card.dark h4{color:#C4B5FD}.card.dark p{color:#fff}
.num-badge{display:inline-block;width:26px;height:26px;border-radius:50%;background:var(--accent);color:#fff;font-weight:800;text-align:center;line-height:26px;font-size:13px;margin-right:8px;font-family:Inter,Pretendard,sans-serif}
.grid3{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin:6px 0 14px}
.prio{font-size:19px;font-weight:700;color:var(--indigo);margin:14px 0 8px}
ol.actions{padding-left:0;list-style:none;margin:0}
ol.actions li{padding:10px 0;border-bottom:1px solid var(--line);font-size:15px;display:flex;gap:10px;align-items:flex-start}
.quotes{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:6px 0 16px}
.quote{background:var(--light);border:1px solid var(--line);border-radius:12px;padding:14px 16px;page-break-inside:avoid}
.quote .qh{font-size:14px;margin-bottom:6px;color:var(--indigo)}
.quote .eng{display:inline-block;font-size:11.5px;background:#fff;border:1px solid var(--line);border-radius:999px;padding:0 8px;margin-left:6px;color:var(--slate6);font-family:Inter,Pretendard,sans-serif}
.quote p{font-size:13.5px;color:var(--slate6);margin:0 0 6px;line-height:1.55}
.quote .cite{font-size:12px;color:var(--slate5);font-family:Inter,Pretendard,sans-serif}
h4.v1cat{font-family:"Playfair Display",Georgia,serif;font-size:20px;margin:22px 0 6px;color:var(--indigo)}
h4.phase{font-size:17px;padding:8px 14px;border-radius:8px;margin:22px 0 6px}
h4.phase.crit{background:var(--crit-bg);color:var(--crit-tx)}h4.phase.warn{background:var(--warn-bg);color:var(--warn-tx)}h4.phase.info{background:var(--info-bg);color:var(--info-tx)}
.note{background:var(--light);border-left:4px solid var(--accent);padding:12px 16px;border-radius:0 10px 10px 0;font-size:14px;margin:12px 0 18px}
.note b{color:var(--violet)}
.footer{margin-top:40px;padding-top:16px;border-top:1px solid var(--line);font-size:12.5px;color:var(--slate5)}
.pb{page-break-before:always}
@page{size:A4;margin:12mm 11mm 14mm}
@media print{body{font-size:13.5px}.page{max-width:none;padding:0}.cover{margin:0 0 24px;padding:44px 40px 36px}.cover h1{font-size:32px}h2{font-size:24px;margin-top:26px}
.kpis{grid-template-columns:repeat(5,1fr);gap:8px}.kpi .val{font-size:30px}table.t{font-size:12px}table.t th{font-size:12px}
.findings,.quotes{grid-template-columns:1fr 1fr}.grid3{grid-template-columns:repeat(3,1fr)}}
"""
def render():
pp, oa = stats["perplexity"], stats["openai"]
findings = "".join(f'<div class="card"><h4><span class="num-badge">{i}</span>{esc(t)}</h4><p>{esc(b)}</p></div>' for i, (t, b) in enumerate(NARR["findings"], 1))
actions = "".join(f'<li><span class="num-badge">{i}</span><span>{esc(a)}</span></li>' for i, a in enumerate(NARR["top_actions"], 1))
method_rows = "".join(f"<tr><td><b>{esc(a)}</b></td><td>{esc(b)}</td></tr>" for a, b in NARR["method"])
limits = "".join(f"<li>{esc(x)}</li>" for x in NARR["limits"])
aux_rows = "".join(f"<tr><td><b>{esc(a)}</b></td><td>{lvl_badge(l)}</td><td>{esc(b)}</td></tr>" for a, l, b in NARR["aux"])
kpi_rows = "".join(f"<tr><td><b>{esc(a)}</b></td><td>{esc(b)}</td><td>{esc(c)}</td><td>{esc(d)}</td></tr>" for a, b, c, d in NARR["kpi_plan"])
body = f"""
<div class="page">
<div class="cover">
<div class="eyebrow">INFINITH AI Discovery · Global Patient Edition</div>
<h1>뷰성형외과 영문 사이트<br>AEO · GEO 진단 보고서</h1>
<p class="sub">외국인 환자 관점 질문 60문항 실측과 답변·출처 준비도 채점</p>
<div class="meta"><span>진단일 <b>{DATE}</b></span><span>대상 <b>{SITE}</b> (en-US · x-default)</span><span>기준표 <b>AEO/GEO v2.0</b> (v1.0 36항목 병행)</span><span>답변엔진 <b>Perplexity sonar · OpenAI gpt-4o web_search (뉴욕)</b></span><span>문의 <b>o2oteam@o2o.kr</b></span></div>
</div>
<h2><span class="n">01</span>요약 판정</h2>
<p class="lead">{esc(NARR["lead"])}</p>
{kpi_row()}
<div class="findings">{findings}</div>
<div class="prio">먼저 5가지</div>
<ol class="actions">{actions}</ol>
<h2 class="pb"><span class="n">02</span>진단 범위와 방법</h2>
<p class="lead">국문 사이트 진단(2026-08-31 · 09-07) 같은 기준표를 영문 사이트와 외국인 질문에 적용했습니다.</p>
<table class="t"><tbody>{method_rows}</tbody></table>
<h4>이번 측정의 한계</h4><ul>{limits}</ul>
<h2 class="pb"><span class="n">03</span>외국인 질의 실측 결과</h2>
<p class="lead">{esc(NARR["qb_lead"])}</p>
<h3>3.1 질문군별 언급률</h3>
<p> 값은 순서대로 뷰성형외과 언급 비율, 답변에서 번째로 등장한 비율, 답변이 viewplasticsurgery.com 페이지를 인용한 비율입니다.</p>
{cat_table()}
<h3>3.2 답변에 등장한 병원</h3>
<p>{esc(NARR["clinic_text"])}</p>
{clinic_table()}
<h3>3.3 AI가 근거로 표면</h3>
<p>{esc(NARR["domain_text"])}</p>
{domain_table()}
<h4>인용된 자사 페이지</h4>
{own_url_table()}
<h3>3.4 답변 감성</h3>
{sentiment_block()}
<h3>3.5 답변 사례</h3>
{quote_cards(NARR["quote_ids"])}
<h2 class="pb"><span class="n">04</span>AEO 답변 준비도 <span class="grade {grade_cls(aeo['grade'])}" style="font-size:18px">{aeo['score']} · {aeo['grade']}</span></h2>
<p class="lead">고객의 질문에 얼마나 명확하고 충분하게 답하는가. 8항목 100.</p>
{v2_table(aeo)}
<div class="note">{esc(NARR["aeo_note"])}</div>
<h2 class="pb"><span class="n">05</span>GEO 출처 준비도 <span class="grade {grade_cls(geo['grade'])}" style="font-size:18px">{geo['score']} · {geo['grade']}</span></h2>
<p class="lead"> 답을 얼마나 검증하고 신뢰할 있는 출처로 사용할 있는가. 8항목 100.</p>
{v2_table(geo)}
<div class="note">{esc(NARR["geo_note"])}</div>
<h2 class="pb"><span class="n">06</span>게이트와 부가 지표</h2>
<p class="lead">게이트 G1(AI 크롤러 접근) · G2(본문 렌더링) 모두 통과. 상한 적용 없음.</p>
<table class="t"><thead><tr><th>지표</th><th>레벨</th><th>실측</th></tr></thead><tbody>{aux_rows}</tbody></table>
<h2 class="pb"><span class="n">07</span>국문 사이트와의 비교</h2>
<p class="lead">{esc(NARR["compare_lead"])}</p>
<div class="kpis" style="grid-template-columns:repeat(3,1fr)">
<div class="kpi"><div class="lab">v1.0 종합</div><div class="val">{KR_BASE['v1']} <small style="font-size:18px;color:#64748B"></small> {v1['score']}</div><div class="sub">국문 C 영문 {v1['grade']}</div></div>
<div class="kpi"><div class="lab">AEO 답변 준비도</div><div class="val">{KR_BASE['aeo']} <small style="font-size:18px;color:#64748B"></small> {aeo['score']}</div><div class="sub">국문 C 영문 {aeo['grade']}</div></div>
<div class="kpi"><div class="lab">GEO 출처 준비도</div><div class="val">{KR_BASE['geo']} <small style="font-size:18px;color:#64748B"></small> {geo['score']}</div><div class="sub">국문 C 영문 {geo['grade']}</div></div>
</div>
{compare_table()}
<h2 class="pb"><span class="n">08</span>개선 로드맵</h2>
<p class="lead">{esc(NARR["roadmap_lead"])}</p>
{roadmap()}
<h2><span class="n">09</span>측정 계획과 KPI</h2>
<p class="lead">개선 전후를 같은 60문항 · 같은 엔진으로 1 재실측합니다.</p>
<table class="t"><thead><tr><th>지표</th><th>현재 (2026-09-10)</th><th>90 목표</th><th>측정 방법</th></tr></thead><tbody>{kpi_rows}</tbody></table>
<h2 class="pb"><span class="n">A</span>부록 A · 60문항 실측표</h2>
<p class="lead">O = 뷰성형외과 언급, 숫자 = 답변 등장 순위. 감성은 후처리 모델 1 분류.</p>
{appendix_questions()}
<h2 class="pb"><span class="n">B</span>부록 B · v1.0 36항목 판정</h2>
<p class="lead">자동 채점 20항목 + 사람 보정 10항목 + 미검증 6항목. 미검증은 분모에서 제외합니다.</p>
{v1_table()}
<div class="footer">INFINITH AI Discovery · 뷰성형외과 영문 사이트 진단 · {DATE} · 점수는 INFINITH 제품용 진단 기준이며 검색엔진의 공식 점수나 인용 확률이 아닙니다 · 문의 o2oteam@o2o.kr</div>
</div>"""
head = f"""<!DOCTYPE html><html lang="ko"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>뷰성형외과 영문 사이트 AEO · GEO 진단 보고서 {DATE}</title>
<link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800&family=Playfair+Display:wght@400;700;800&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/variable/pretendardvariable-dynamic-subset.min.css">
<style>{CSS}</style></head><body>"""
return head + body + "</body></html>"
def to_pdf(html_path, pdf_path):
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
b = p.chromium.launch()
pg = b.new_page()
pg.goto("file://" + html_path, wait_until="networkidle")
pg.wait_for_timeout(1200)
pg.emulate_media(media="print")
pg.pdf(path=pdf_path, format="A4", print_background=True, prefer_css_page_size=True)
b.close()
if __name__ == "__main__":
out_html = OUT_BASE + ".html"
open(out_html, "w", encoding="utf-8").write(render())
print("HTML:", out_html)
if "--no-pdf" not in sys.argv:
to_pdf(out_html, OUT_BASE + ".pdf")
print("PDF:", OUT_BASE + ".pdf")

View File

@ -0,0 +1,421 @@
{
"lead": "영문 사이트는 국문 사이트보다 답변·출처 준비도가 모두 높습니다(AEO 65 · GEO 72, 둘 다 B). 외국인이 병원 이름을 알고 묻는 질문에는 두 엔진 모두 100% 답하지만, 병원을 모르는 상태의 시술·가격 질문에서는 언급률이 0~21%에 그칩니다. 원인은 콘텐츠 부족이 아니라 인용된 문단에 상호가 없어서입니다.",
"findings": [
[
"이름을 알면 100%, 모르면 0~21%",
"브랜드(A)·이동·체류(B) 질문군은 두 엔진 모두 뷰성형외과를 1순위로 답하고 viewplasticsurgery.com을 직접 인용합니다. 반면 시술 정보(D)는 Perplexity 14% · OpenAI 21%, 가격(E)은 두 엔진 모두 0%입니다. 외국인 환자 여정에서 가장 긴 구간이 비어 있습니다."
],
[
"인용은 되는데 이름이 안 나오는 문항 8개",
"Perplexity는 가격 질문(E-01 가슴성형 비용, E-02 V-line 비용)과 시술 질문(D-01·D-04·D-05·D-10)에서 뷰 블로그·시술 페이지를 출처로 썼지만 답변에 'VIEW'가 한 번도 등장하지 않았습니다. 인용된 문단이 'The cost of V-line surgery in Seoul ranges…'처럼 상호 없이 쓰여 있어 AI가 수치만 가져가고 병원 이름은 남기지 않습니다."
],
[
"추천 질문의 경쟁 구도: JK · ID · Banobagi",
"'Best plastic surgery clinic in Seoul for foreigners' 류 추천 질문(C)에서 뷰는 Perplexity 9/12, OpenAI 6/12에 등장했지만 1순위는 드뭅니다. JK Plastic Surgery(KAHF 인증 4회 연속), ID Hospital, Banobagi가 상위를 차지하고, 그 근거는 유치 에이전시·중개 플랫폼의 영문 가이드 글입니다."
],
[
"AI가 근거로 쓰는 표면은 Reddit · Bookimed · 에이전시 가이드",
"두 엔진 합산 인용 도메인 1위는 viewplasticsurgery.com(54문항), 2위는 reddit.com(49문항)입니다. 그다음이 us-uk.bookimed.com · clinicsoncall.com · koreaclinicguide.com · clinicseoul.net · unni.app 같은 중개·가이드 표면입니다. 강남언니 국문 페이지는 60문항 어디에도 인용되지 않았습니다."
],
[
"엔티티 스키마 0, hreflang은 리다이렉트 URL",
"홈 JSON-LD가 병원을 Person 타입으로 선언하고 MedicalClinic·Physician 스키마와 sameAs가 없습니다(GEO4 6.3/15). 10개 언어 hreflang은 갖췄지만 8개 언어 서브도메인이 경로 URL로 301 하고, origin.·olden. 서브도메인이 전체 사이트를 색인 가능 상태로 서빙해 AI 인용 URL이 분산됩니다."
],
[
"부정 답변 1건: 공정위 후기 광고 시정명령",
"'Are there red flags about VIEW Plastic Surgery'(F-05) 질문에 Perplexity는 국문 사이트 후기 광고에 대한 2026-07 공정위 시정명령을 첫 문장으로 답했습니다. 영문 Real Review 섹션도 같은 구조(대가 고지 없음)라 GEO7 발행 투명성 항목의 감점 요인입니다."
]
],
"top_actions": [
"시술 페이지·블로그 가격 가이드의 첫 문단과 표 캡션에 'At VIEW Plastic Surgery in Gangnam, Seoul' 형태로 상호·지역을 넣습니다. 인용은 되는데 이름이 안 나오는 8문항이 바로 대상입니다.",
"MedicalClinic + Physician JSON-LD를 추가하고 Person 타입을 Organization/MedicalClinic으로 바꾸며 sameAs에 Instagram·TikTok·YouTube·Google 프로필·Bookimed·RealSelf·unni.app을 연결합니다.",
"시술 페이지 상단에 결정 정보 블록(USD 가격대 · 수술 시간 · 입원 · 권장 체류일 · 귀국 가능일)을 표로 두고 블로그 가격 가이드와 상호 링크합니다. 가격(E)·시술(D) 질문군 0~21%의 직접 대응입니다.",
"FAQ 402문항에 FAQPage 스키마를 붙이고 카테고리별 URL로 나눕니다. 전 페이지 동일 H1('korea plastic surgery')을 페이지별 서술형 H1으로 교체합니다.",
"origin.·olden. 서브도메인을 www로 301 하고 언어 서브도메인 hreflang을 최종 URL로 통일합니다. 후기·전후 섹션에 대가 제공 여부와 개인차 고지를 넣어 정보 페이지와 분리합니다."
],
"method": [
[
"진단 대상",
"https://www.viewplasticsurgery.com (en-US, x-default). 홈 · About · 의료진 · 컨시어지 · 오시는길 · 안전 · 수상 · FAQ · 가슴(Motiva) · 코 · 윤곽 · 블로그 목록 · 블로그 글 1건 등 13개 페이지를 JS 미실행 HTML로 수집"
],
[
"자동 채점",
"scripts/audit_aeo_geo.py (기준표 v1.0 36항목 중 자동 20항목). AI 봇 12종 UA 접근, sitemap, JSON-LD, hreflang, H1/H2, FAQ, 표, alt, TTFB 실측"
],
[
"사람 판정",
"C1 정의문 · C4 수치 · C7 전문성 · C8 자기완결성 · B4/B7 · D1~D4 · E4 · F2 (10항목) + v2.0 사람 판정 4항목(AEO6 · GEO1 · GEO6 · GEO7). 근거는 각 표에 기재"
],
[
"질문 뱅크",
"외국인 환자 관점 영문 60문항 · 7군 (브랜드 8 · 이동·체류 8 · 추천·비교 12 · 시술 14 · 가격 8 · 안전·신뢰 6 · 사후관리 4). 국문 120문항 뱅크와 같은 퍼널 구조"
],
[
"답변엔진",
"Perplexity API sonar (자체 웹검색) · OpenAI Responses API gpt-4o + web_search (사용자 위치 미국 뉴욕). 소비자 ChatGPT UI 자동 조회는 약관 위반이라 쓰지 않음. 각 문항 1회 질의, 2026-09-10"
],
[
"후처리",
"답변에서 병원명 최대 8개를 등장 순서로 추출(gpt-4o-mini). VIEW Plastic Surgery · View Clinic · VIEW Seoul 등 표기 변형을 같은 병원으로 정규화. 감성은 긍정·중립·부정 1차 분류"
],
[
"점수 산식",
"v2.0: 항목 점수 = 파생 신호(v1.0 레벨 0~3) 가중 평균 × 배점, 사람 판정 우선, 미검증은 분모 제외. 게이트 실패 시 상한 40. 등급 A 81+ · B 6180 · C 4160 · D 40 이하"
]
],
"limits": [
"질의는 문항당 1회입니다. 답변엔진은 같은 질문에도 매번 다른 병원을 고를 수 있어 5회 반복 평균이 정식 기준선입니다.",
"OpenAI gpt-4o는 60문항 중 23문항에서 웹검색을 실행하지 않고 모델 기억으로 답했습니다(시술·가격 일반 질문 대부분). 이 문항의 미언급은 사이트 문제가 아니라 모델 기억에 뷰가 없다는 뜻입니다.",
"Google 비즈니스 프로필은 2026-08-31 실측값(4.9점 · 리뷰 901건)을 인용했습니다. 이번에는 Places API 키가 없어 재실측하지 못했습니다.",
"Bing 색인(A6), 서버 로그(E1), GA4(E2), GSC(E3)는 소유자 계정이 필요해 미검증입니다.",
"감성 분류는 후처리 모델의 1차 판정이며 감성 기준표 v0.3의 사람 검토 전 값입니다."
],
"qb_lead": "Perplexity는 60문항 중 30문항(50%), OpenAI 웹검색은 27문항(45%)에서 뷰성형외과를 언급했습니다. 국문 120문항 실측(2026-09-01, Perplexity 32% · OpenAI 37%)보다 높지만, 상승분은 전부 병원 이름이 들어간 질문에서 나왔습니다.",
"cat_interp": {
"A": "두 엔진 모두 전 문항 1순위. 자사 사이트·에이전시 블로그·정부 의료관광 페이지가 근거",
"B": "공항 픽업·숙박·WhatsApp 상담은 컨시어지 페이지가 직접 인용됨. 미언급 2문항은 비자·체류기간 일반 질문",
"C": "Perplexity는 9/12 언급하나 1순위는 4건. OpenAI는 절반. JK·ID·Banobagi가 상위, 근거는 제3자 가이드 글",
"D": "병원 이름이 들어간 D-11·D-12만 언급. 나머지 12문항은 뷰 페이지가 인용돼도 이름이 안 나옴",
"E": "두 엔진 모두 0. Perplexity는 뷰 블로그 가격 가이드를 2문항에서 인용했으나 상호 없이 수치만 사용. OpenAI는 가격 질문 대부분을 검색 없이 답변",
"F": "마취과 전문의(F-02)·보증(F-06)은 언급. 안전 일반론(F-01·F-03·F-04)은 미언급. F-05는 공정위 시정명령이 첫 문장",
"G": "병원 이름이 있는 G-02·G-04만 언급. 원격 팔로업 일반 질문(G-01)에서 Perplexity 4순위"
},
"clinic_text": "두 엔진을 합쳐 뷰성형외과는 57문항에서 언급됐고 그중 40문항이 1순위입니다. 그러나 1순위는 대부분 브랜드·체류 질문입니다. 병원을 고르는 추천·비교 질문에서는 JK Plastic Surgery, ID Hospital, Banobagi, AB Plastic Surgery, SAERO가 반복 등장합니다.",
"domain_text": "인용 도메인은 세 층으로 나뉩니다. 자사 사이트(viewplasticsurgery.com 54문항), 커뮤니티(reddit.com 49문항), 그리고 중개·가이드 표면(Bookimed · clinicsoncall · koreaclinicguide · clinicseoul.net · unni.app · khunkim.com)입니다. 강남언니 국문 페이지와 네이버는 한 번도 인용되지 않았습니다. 외국인 대상 GEO는 이 세 층에 원문을 두는 일입니다.",
"quote_ids": [
[
"E-02",
"perplexity"
],
[
"C-01",
"perplexity"
],
[
"C-02",
"openai"
],
[
"F-05",
"perplexity"
],
[
"D-11",
"openai"
],
[
"E-05",
"openai"
]
],
"aeo_note": "AEO 65점의 감점은 AEO2 답변의 직접성(6.7/20)과 AEO4 의사결정 정보(9/15)에 집중됩니다. 정의문이 메타 설명에만 있고 본문은 슬로건으로 시작하며, 시술 페이지에 가격·시간·회복 수치가 없습니다. 이 두 항목이 그대로 시술(D)·가격(E) 질문군의 0~21%로 나타납니다.",
"geo_note": "GEO 72점의 감점은 GEO4 엔티티 정합성(6.3/15)과 GEO3 전문성 스키마(9/15)입니다. 의료진 자격·논문은 텍스트로 충분하지만 Physician 스키마가 없고, 병원 자체가 Person 타입으로 선언돼 있습니다. GEO7 투명성(6.7/10)은 후기·전후 섹션의 대가 고지 부재가 원인이며 F-05 답변에서 실제 감점으로 확인됩니다.",
"v2_evidence": {
"AEO1": "FAQ 페이지에 402문항이 서버 렌더링(카테고리 11개). 시술 페이지 하단에도 FAQ 5문항. FAQPage 스키마는 블로그 글에만 있고 FAQ 페이지에는 없음. 질문 뱅크 대비 A·B군은 사이트가 직접 답하고, D·E군 답은 블로그에 있으나 상호가 없음",
"AEO2": "정의문이 About 메타 설명에만 있음('Founded in 2005, VIEW is a premier 19-story medical center in Gangnam, Seoul'). 본문 첫 단락은 슬로건, 시술 페이지 첫 텍스트는 'Let Me In Season 2/3/4/5 Selected Doctors' 홍보 라벨, 홈 첫 200자는 검색창·메뉴",
"AEO3": "5개 핵심 페이지 단락 샘플 50개 중 상호 또는 시술명 포함 26개(52%). 상호 'VIEW' 포함은 7개(14%). FAQ 답변과 블로그 가격 문단은 시술명만 있고 상호가 없어 인용돼도 병원 이름이 남지 않음(실측 8문항)",
"AEO4": "시술 페이지 본문에 가격·수술시간·회복기간 0회. 수치는 Motiva 보증(재수술 지원 300만원/개)뿐. HTML 표는 10개 존재. 블로그에는 USD 가격표(V-line $7,00012,000)와 체류 권장일(1014일)이 있으나 시술 페이지와 연결되지 않음",
"AEO5": "전 페이지 H1이 동일하게 'korea plastic surgery'(키워드 라벨). 페이지 고유 제목은 H2·H3. H2 'What would you like to know today?'(검색창)가 모든 페이지에 반복",
"AEO7": "JS 미실행 HTML 본문 79,646자 서버 렌더링. 메인 이미지 500개 alt 누락 0%",
"AEO8": "sitemap index 10개 · URL 482개 · lastmod 2026-09-09. canonical self 지정. 다만 origin.·olden. 서브도메인이 전체 사이트를 200·index로 서빙(canonical은 www 지정)해 AI 답변이 origin.·olden. URL을 인용함"
},
"aux": [
[
"A6 Bing 색인 (ChatGPT 검색 경로)",
"unverified",
"Bing 검색 결과 페이지가 스크립트 렌더링이라 curl로 확인 불가. Bing Webmaster Tools 등록 여부는 소유자 확인 필요"
],
[
"A7 응답 속도·크롤 예산",
2,
"TTFB 0.87s · 초기 HTML 587KB · 시술 페이지 212KB. 속도 양호, HTML 비대"
],
[
"B7 다국어 hreflang",
2,
"10개 언어(en-US · zh-CN · th · ja · vi · ru · id · mn · es · ar) 양방향 선언. th·jp·vn·ru·id·mn·es·ar 8개 서브도메인은 viewplasticsurgery.com/{lang}/ 로 301. cn은 en-US 대신 en 선언"
],
[
"D3 오픈웹 언급 (해외)",
2,
"에이전시 블로그(khunkim · clinicsoncall · curemeabroad · kmhglobal), 정부 표면(visitkorea · 강남구 의료관광), Reddit · Purseblog 포럼, LinkedIn에 분산. 영어권 주요 언론 기사·Wikipedia 없음"
],
[
"D5 네이버 플레이스",
"unverified",
"외국인 질의 60문항에서 네이버 표면 인용 0건. 외국인 관점에서는 채점 대상 아님"
],
[
"E1 AI 크롤러 로그",
"unverified",
"서버 로그 접근 필요. Perplexity가 60문항 중 38문항에서 자사 URL을 인용했으므로 PerplexityBot 히트는 존재할 것으로 추정"
],
[
"E2 GA4 AI 유입 채널",
"unverified",
"GA4 접근 필요. chatgpt.com · perplexity.ai · copilot 리퍼러 채널 그룹 설정 여부 미확인"
],
[
"E3 GSC AI Overviews",
"unverified",
"GSC 접근 필요"
],
[
"E4 기준선 스팟체크",
2,
"60문항 × 2엔진 × 1회 실측 완료(이 보고서). 5회 반복 미실시"
],
[
"F2 CMS 보안·최신성",
2,
"WordPress 7.1(최신 계열). meta generator로 버전 노출"
],
[
"F3 페이지 무게",
2,
"초기 HTML 587KB(300~800KB 구간)"
],
[
"F4 모바일 대응",
2,
"viewport 존재 · 반응형. Core Web Vitals 미측정"
]
],
"compare_lead": "같은 병원의 두 사이트를 같은 기준표로 채점했습니다. 영문 사이트가 세 점수 모두 한 등급 높고, 질문 뱅크 언급률도 13~18%p 높습니다. 차이는 콘텐츠 양(FAQ 402건 · 블로그 주 1회 이상 발행 · 의료진 논문 목록)에서 나왔고, 남은 감점 원인(정의문 · 수치 · 스키마 · 상호 없는 문단)은 두 사이트가 같습니다.",
"compare_rows": [
[
"v1.0 종합",
"54 / C (검증 32/36)",
"64 / B (검증 31/36)",
"+10"
],
[
"AEO 답변 준비도",
"42 / C",
"65 / B",
"+23"
],
[
"GEO 출처 준비도",
"56 / C",
"72 / B",
"+16"
],
[
"질문 뱅크 언급률",
"120문항 · Perplexity 32% · OpenAI 37% (09-01)",
"60문항 · Perplexity 50% · OpenAI 45% (09-10)",
"+18p / +8p"
],
[
"C1 정의문",
"없음 (0)",
"메타 설명에만 (1)",
"본문 정의문은 둘 다 없음"
],
[
"C2 FAQ",
"재검증 후 2",
"FAQ 페이지 402문항 · 시술별 5문항 (2)",
"영문이 양은 많으나 FAQPage 스키마는 블로그에만"
],
[
"C3 H1",
"'VIEW SELFIE' 등 영문 라벨 (0)",
"전 페이지 동일 'korea plastic surgery' (2)",
"둘 다 페이지별 서술형 H1 없음"
],
[
"C4 · C5 수치와 표",
"C4=2 · C5=0",
"C4=1 · C5=3",
"영문은 수치가 블로그에, 표는 시술 페이지에 따로 있음"
],
[
"C6 신선도",
"블로그 2024-05-31 이후 정지 (재검증 후 3)",
"블로그 2026-09-09 발행 · sitemap lastmod 당일 (2)",
"영문은 갱신 활발, dateModified 마크업은 둘 다 없음"
],
[
"C7 전문성",
"2",
"학위 · 전문의 · 학회 · 논문 목록 텍스트 (3)",
"영문 의료진 상세가 더 충실"
],
[
"B2 · B3 스키마",
"B2=1 · B3=0",
"B2=0 · B3=0 (Person 타입 오선언)",
"둘 다 MedicalClinic · Physician 없음"
],
[
"B7 hreflang",
"없음",
"10개 언어 (2)",
"영문만 다국어 연결, 대상 URL 정리 필요"
],
[
"GEO7 투명성",
"3.3 / 10 (공정위 시정명령)",
"6.7 / 10",
"영문 Real Review도 대가 고지 없음, F-05 답변에 노출"
]
],
"roadmap_lead": "우선순위는 실측에서 확인된 감점 순서입니다. 즉시 조치는 개발 작업 없이 텍스트·스키마 수정으로 끝나고, 30일 조치는 시술 페이지 콘텐츠 블록, 90일 조치는 외부 표면과 측정 인프라입니다.",
"roadmap": [
[
"즉시 (02주) · 텍스트와 스키마",
"crit",
[
[
"시술 페이지·블로그 가격 가이드의 첫 문단과 표 캡션에 'At VIEW Plastic Surgery in Gangnam, Seoul, …' 형태로 상호·지역 삽입. FAQ 답변 첫 문장에도 'At VIEW' 추가",
"AEO3 · C8 / D·E군 8문항",
"인용은 되는데 이름이 안 나오는 8문항이 언급으로 전환. 답변 단위 자기완결성 52% → 80%"
],
[
"JSON-LD: Person → MedicalClinic(+Organization)으로 교체, name · address · telephone · openingHours · medicalSpecialty · availableLanguage(10개) 기재. 의료진 26명 Physician 스키마(자격 · 소속 · sameAs)",
"GEO3 · GEO4 / B2 · B3 · B5",
"엔티티 정합성 6.3 → 12/15. 의료진 질문(A-04 · A-05 · F-02) 근거가 스키마로 확정"
],
[
"sameAs 채우기: Instagram · TikTok · YouTube · Facebook · Google 비즈니스 프로필 · Bookimed · RealSelf · unni.app · LinkedIn",
"GEO4 / B5",
"AI가 표면 간 동일 병원임을 확인. Reddit · Bookimed 인용이 뷰 엔티티로 연결"
],
[
"FAQ 페이지 402문항에 FAQPage 스키마 부여, 카테고리별 URL(/faq/breast/ 등 11개)로 분할",
"AEO1 / C2",
"질문 수요 충족 13.3 → 20/20. 시술 질문(D) 인용 페이지 확보"
],
[
"H1을 페이지별 서술형으로 교체('Motiva Breast Augmentation in Seoul at VIEW Plastic Surgery'). 검색창 H2 제거",
"AEO5 / C3",
"제목 계층 6.7 → 10/10"
],
[
"origin.·olden. 서브도메인 → www 301. 언어 서브도메인 8개의 hreflang을 최종 URL(/th/ 등)로 통일, cn hreflang en-US로 정정",
"AEO8 · B7",
"인용 URL 분산 해소, 다국어 신호 정합"
],
[
"메타 설명 오류 정정: 가슴 페이지 'No.1 Motiva usage in 2013' → 2023. 제목의 'Best' · 'No.1 Trusted' 표현은 근거 있는 표현으로 교체",
"GEO1",
"주장·근거 일치 13.3 → 16/20"
]
]
],
[
"30일 · 시술 페이지 결정 정보",
"warn",
[
[
"시술 페이지 상단에 정의문 + 결정 정보 블록: USD 가격대 · 수술 시간 · 마취 · 입원 · 권장 체류일 · 귀국 가능일 · 실밥 제거일을 표로. 부위별 8개 시술군 우선",
"AEO2 · AEO4 / C1 · C4 / D·E군",
"시술(D) 14~21% · 가격(E) 0% 구간의 직접 대응. 답변 직접성 6.7 → 16/20"
],
[
"블로그 가격 가이드(가슴 · V-line · 코 · 양악 · 눈)와 시술 페이지 상호 링크. 표는 시술 페이지에 요약 이식",
"AEO4 / C4 · C5",
"의사결정 정보 9 → 13/15"
],
[
"'귀국 후 합병증 대응 · 원격 팔로업' 전용 페이지: 절차 · 연락 채널 · 응답 시간 · 현지 협력 · Motiva 보증 청구 방법",
"F-03 · G-01 · G-04",
"안전(F) · 사후관리(G) 질문군에서 인용 원문 확보"
],
[
"수상·인증 페이지에 주최 · 연도 · 원문 링크 명시(법무부 우수 유치기관 20182026, Motiva KOL, 서울시 표창)",
"GEO1 / C-10",
"정부 인증 질문(C-10)에서 1순위 유지, 주장 근거 일치 향상"
],
[
"후기 · 전후 · 'Let Me In' 홍보를 정보 페이지와 분리. 후기에 대가 제공 여부 · 개인차 고지 첫 부분에 표기",
"GEO7",
"F-05 부정 답변의 맥락 제공. 발행 투명성 6.7 → 10/10"
],
[
"dateModified · author · reviewedBy를 시술 페이지와 블로그 글에 마크업. 의료진 검토 표기",
"GEO5 · GEO8",
"최신성 6.7 → 10/10"
]
]
],
[
"90일 · 외부 표면과 측정",
"info",
[
[
"Google 비즈니스 프로필: 전화번호 등록, 영문 리뷰 응답, 컨시어지 서비스 속성 기재",
"D2 · D4",
"위치·연락처 질문(B) 오답 위험 제거"
],
[
"Bookimed · RealSelf · unni.app 프로필 갱신(의료진 · 시술 · 가격대 · 언어). Reddit r/PlasticSurgery · r/korea 질문에 공식 계정으로 사실 답변",
"D1 · D3",
"reddit.com 49문항 · Bookimed 32문항 인용 표면에 뷰 원문 배치. 추천 질문(C) 1순위 비율 상승"
],
[
"Bing Webmaster Tools 등록 + IndexNow. GSC · GA4 AI 유입 채널 그룹 설정, 서버 로그 AI 크롤러 IP 검증",
"A6 · E1 · E2 · E3",
"ChatGPT 검색 경로 확보, 소유 신호로 월간 측정"
],
[
"60문항 × 2엔진 × 5회 반복 월간 재실측. 질문 뱅크에 일본어 · 중국어 · 태국어 각 60문항 추가(hreflang 언어 순)",
"E4",
"개선 전후 비교 기준선. 언어별 언급률 관리"
]
]
]
],
"kpi_plan": [
[
"60문항 언급률",
"Perplexity 50% · OpenAI 45%",
"Perplexity 65% · OpenAI 60%",
"월 1회 60문항 × 2엔진 × 5회 반복"
],
[
"시술(D) · 가격(E) 언급률",
"D 14~21% · E 0%",
"D 40% · E 30%",
"같은 실측의 질문군별 집계"
],
[
"인용됐지만 미언급 문항",
"Perplexity 8문항",
"0문항",
"자사 URL 인용 여부와 상호 등장 여부 교차 집계"
],
[
"자사 사이트 인용률",
"Perplexity 63% · OpenAI 30%",
"Perplexity 75% · OpenAI 45%",
"인용 URL 도메인 집계"
],
[
"추천 질문(C) 1순위",
"Perplexity 4/12 · OpenAI 1/12",
"각 6/12",
"질문군 C 순위 집계"
],
[
"AEO · GEO 점수",
"65 · 72 (B · B)",
"80 · 85 (A 진입)",
"기준표 v2.0 재채점"
],
[
"AI 크롤러 히트",
"미측정",
"월간 기준선 확보",
"서버 로그 UA + IP 역검증"
],
[
"부정 답변",
"1문항 (F-05 공정위)",
"정정 고지 페이지가 함께 인용",
"감성 기준표 v0.3 사람 검토"
]
]
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,62 @@
[
{"id":"A-01","cat":"A","question":"Is VIEW Plastic Surgery in Seoul legit? Is it a trustworthy clinic for foreigners?","stage":"decision"},
{"id":"A-02","cat":"A","question":"Tell me about VIEW Plastic Surgery in Gangnam, Korea. What are they known for?","stage":"decision"},
{"id":"A-03","cat":"A","question":"What procedures does VIEW Plastic Surgery Korea specialize in?","stage":"decision"},
{"id":"A-04","cat":"A","question":"Who is Dr. Choi Soon Woo of VIEW Plastic Surgery? Is he board certified?","stage":"decision"},
{"id":"A-05","cat":"A","question":"How many surgeons does VIEW Plastic Surgery have and are they all board-certified plastic surgeons?","stage":"decision"},
{"id":"A-06","cat":"A","question":"Does VIEW Plastic Surgery have English-speaking staff or interpreters?","stage":"decision"},
{"id":"A-07","cat":"A","question":"How long has VIEW Plastic Surgery been operating and how big is the clinic?","stage":"decision"},
{"id":"A-08","cat":"A","question":"VIEW Plastic Surgery Korea reviews from international patients: what do foreigners say?","stage":"decision"},
{"id":"B-01","cat":"B","question":"Where is VIEW Plastic Surgery located and how do I get there from Incheon Airport?","stage":"decision"},
{"id":"B-02","cat":"B","question":"Does VIEW Plastic Surgery offer airport pickup for international patients?","stage":"decision"},
{"id":"B-03","cat":"B","question":"What are VIEW Plastic Surgery's opening hours and can I book a consultation online from abroad?","stage":"decision"},
{"id":"B-04","cat":"B","question":"Can I contact VIEW Plastic Surgery via WhatsApp or LINE for a consultation?","stage":"decision"},
{"id":"B-05","cat":"B","question":"Does VIEW Plastic Surgery provide accommodation or hotel partnerships for foreign patients?","stage":"decision"},
{"id":"B-06","cat":"B","question":"How long should I stay in Seoul after plastic surgery before flying home?","stage":"explore"},
{"id":"B-07","cat":"B","question":"Do I need a medical visa for plastic surgery in Korea as a tourist?","stage":"explore"},
{"id":"B-08","cat":"B","question":"Which Gangnam plastic surgery clinics are closest to Sinnonhyeon Station?","stage":"aware"},
{"id":"C-01","cat":"C","question":"Best plastic surgery clinic in Seoul for foreigners","stage":"aware"},
{"id":"C-02","cat":"C","question":"Best breast augmentation clinic in Korea for international patients","stage":"compare"},
{"id":"C-03","cat":"C","question":"Top facial contouring and V-line surgery clinics in Gangnam","stage":"compare"},
{"id":"C-04","cat":"C","question":"Best rhinoplasty surgeon in Seoul for foreigners","stage":"compare"},
{"id":"C-05","cat":"C","question":"Best double jaw surgery clinic in Korea","stage":"compare"},
{"id":"C-06","cat":"C","question":"Top 5 plastic surgery clinics in Gangnam, Seoul","stage":"aware"},
{"id":"C-07","cat":"C","question":"Compare VIEW Plastic Surgery vs ID Hospital vs Banobagi for facial contouring","stage":"compare"},
{"id":"C-08","cat":"C","question":"Which Korean plastic surgery clinics use Motiva implants and have the most experience with them?","stage":"compare"},
{"id":"C-09","cat":"C","question":"Safest plastic surgery clinic in Korea with anesthesiologists on staff","stage":"compare"},
{"id":"C-10","cat":"C","question":"Which Seoul plastic surgery clinics are officially recognized for medical tourism by the Korean government?","stage":"compare"},
{"id":"C-11","cat":"C","question":"Best clinic in Korea for double eyelid surgery revision for foreigners","stage":"compare"},
{"id":"C-12","cat":"C","question":"Large plastic surgery hospitals in Seoul with in-house recovery wards","stage":"compare"},
{"id":"D-01","cat":"D","question":"Motiva breast augmentation in Korea: what should I know before booking?","stage":"explore"},
{"id":"D-02","cat":"D","question":"What is Motiva Preserve and which clinics in Korea offer it?","stage":"explore"},
{"id":"D-03","cat":"D","question":"How long is recovery after breast augmentation in Korea before I can fly?","stage":"explore"},
{"id":"D-04","cat":"D","question":"What is the difference between V-line surgery and square jaw reduction?","stage":"explore"},
{"id":"D-05","cat":"D","question":"Double jaw surgery in Korea: recovery timeline and risks for international patients","stage":"explore"},
{"id":"D-06","cat":"D","question":"Incisional vs non-incisional double eyelid surgery in Korea: which is better?","stage":"explore"},
{"id":"D-07","cat":"D","question":"Rhinoplasty in Korea with rib cartilage vs silicone: pros and cons","stage":"explore"},
{"id":"D-08","cat":"D","question":"How is revision rhinoplasty done in Korea and how long do I need to stay?","stage":"explore"},
{"id":"D-09","cat":"D","question":"Facelift in Korea for a 50-year-old: what techniques are used?","stage":"explore"},
{"id":"D-10","cat":"D","question":"Is liposuction in Korea safe and how many days of downtime should I expect?","stage":"explore"},
{"id":"D-11","cat":"D","question":"What does VIEW Plastic Surgery's breast surgery process look like from consultation to aftercare?","stage":"decision"},
{"id":"D-12","cat":"D","question":"Does VIEW Plastic Surgery do a breast ultrasound or examination before augmentation?","stage":"decision"},
{"id":"D-13","cat":"D","question":"Subbrow lift vs upper blepharoplasty: which should I get in Korea?","stage":"explore"},
{"id":"D-14","cat":"D","question":"Mini lift vs full facelift in Korea: cost and recovery","stage":"explore"},
{"id":"E-01","cat":"E","question":"How much does breast augmentation cost in Korea for foreigners in 2026?","stage":"explore"},
{"id":"E-02","cat":"E","question":"V-line surgery cost in Korea 2026","stage":"explore"},
{"id":"E-03","cat":"E","question":"How much does double jaw surgery cost in Seoul?","stage":"explore"},
{"id":"E-04","cat":"E","question":"Is plastic surgery in Korea cheaper than in the US? How much can I save?","stage":"aware"},
{"id":"E-05","cat":"E","question":"VIEW Plastic Surgery price list for international patients","stage":"decision"},
{"id":"E-06","cat":"E","question":"What hidden costs should I expect for plastic surgery in Korea as a foreigner?","stage":"explore"},
{"id":"E-07","cat":"E","question":"Can foreigners get a tax refund on plastic surgery in Korea?","stage":"explore"},
{"id":"E-08","cat":"E","question":"Rhinoplasty cost in Gangnam for foreigners","stage":"explore"},
{"id":"F-01","cat":"F","question":"Is plastic surgery in Korea safe for foreigners? What safety standards should I look for?","stage":"aware"},
{"id":"F-02","cat":"F","question":"Does VIEW Plastic Surgery have anesthesiologists present during surgery?","stage":"decision"},
{"id":"F-03","cat":"F","question":"What happens if I have complications after returning home from plastic surgery in Korea?","stage":"explore"},
{"id":"F-04","cat":"F","question":"How do I verify a Korean plastic surgeon is board certified?","stage":"explore"},
{"id":"F-05","cat":"F","question":"Are there red flags or complaints about VIEW Plastic Surgery Korea?","stage":"decision"},
{"id":"F-06","cat":"F","question":"Which Korean plastic surgery clinics have a Motiva implant warranty?","stage":"compare"},
{"id":"G-01","cat":"G","question":"Do Korean plastic surgery clinics offer remote follow-up after I go back to my country?","stage":"explore"},
{"id":"G-02","cat":"G","question":"What aftercare does VIEW Plastic Surgery provide for international patients?","stage":"decision"},
{"id":"G-03","cat":"G","question":"Where can I get post-surgery swelling care in Gangnam after surgery?","stage":"explore"},
{"id":"G-04","cat":"G","question":"What is the Motiva implant warranty if I get surgery in Korea and live abroad?","stage":"explore"}
]

View File

@ -0,0 +1,39 @@
import json,sys,os
sys.path.insert(0,'/Users/haewonkam/Claude/Agentic Marketing/INFINITH/scripts')
import score_discovery_json as sd
S=os.path.dirname(os.path.abspath(__file__))
d=json.load(open(f'{S}/audit_en_auto.json'))
results={r['criterionId']:dict(r) for r in d['results']}
for cid,o in json.load(open(f'{S}/audit_en_overrides.json')).items():
results.setdefault(cid,{'criterionId':cid}); results[cid]['level']=o['level']; results[cid]['evidence']='[사람 보정] '+o['evidence']
extra=json.load(open(sys.argv[1])) if len(sys.argv)>1 else {}
for cid,o in extra.items():
results.setdefault(cid,{'criterionId':cid}); results[cid]['level']=o['level']; results[cid]['evidence']='[사람 보정] '+o['evidence']
out=sd.score(results,'VIEW EN')
# v2 human items
human={'AEO6':(3,''),'GEO1':(2,''),'GEO6':(3,''),'GEO7':(2,'')}
items,gates=sd.load_rubric_v2()
res={}
for axis in ('aeo','geo'):
ea=pa=0; det=[]
for it in items:
if it['axis']!=axis: continue
if it['id'] in human:
pct=human[it['id']][0]/3; basis='judged'
else:
sig=[(c,w,results[c]['level']) for c,w in it['derivedFrom'] if c in results and results[c]['level']!='unverified']
if not sig: det.append((it['id'],it['name'],it['weight'],None,'unverified',[])); continue
ws=sum(w for _,w,_ in sig); pct=sum(w*int(l)/3 for _,w,l in sig)/ws; basis='derived'
sigs=[f"{c}={l}" for c,w,l in sig]
ea+=it['weight']*pct; pa+=it['weight']
det.append((it['id'],it['name'],it['weight'],round(it['weight']*pct,1),basis,sigs if basis=='derived' else []))
raw=round(ea/pa*100)
res[axis]={'score':raw,'grade':sd.grade(raw),'earned':round(ea,1),'possible':pa,'items':det}
out['aeo_h']=res['aeo']; out['geo_h']=res['geo']
out['results']=results
print(f"v1 {out['v1']['score']}/{out['v1']['grade']} ({out['v1']['earned']}/{out['v1']['possible']}, verified {out['v1']['verified']}/36) cats {out['v1']['categories']}")
for ax in ('aeo','geo'):
r=res[ax]; print(f"{ax.upper()} {r['score']}/{r['grade']} ({r['earned']}/{r['possible']})")
for x in r['items']: print(' ',x)
print('gates',out['gates'])
json.dump(out,open(f'{S}/audit_en_scored.json','w'),ensure_ascii=False,indent=1)

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@ -23,8 +23,8 @@
3. 아무 인자도 없으면 .env TOUR_API_ORIGIN_LAT/LNG (초기 샘플 사이트용).
어느 경우든 meta.origin.coordSource 출처와 날짜를 적는다.
출력은 서포터즈 사이트(Astro) 데이터다. 화면은 src/pages/stay.astro(국문)
src/pages/en/stay.astro(영문). 외국인 환자와 보호자가 보는 곳이다.
출력은 서포터즈 사이트(Astro) 데이터다. 화면은 회복 일정 플래너 src/components/Planner.astro(/plan 국문, /en/plan 영문)이며
src/lib/tour.ts JSON 추천 후보·숙소·축제로 바꾼. 외국인 환자와 보호자가 보는 곳이다.
# 워커가 부르는 형태 (팩트 시트 주소 기준, 영문·국문 동시)
python3 scripts/fetch_medical_tourism.py --clinic oracle --name "오라클피부과" \

View File

@ -0,0 +1,109 @@
#!/usr/bin/env python3
"""월간 AI 실측 체인: 질문 뱅크 러너 → 감성 판정 → 리포트 → supporter_builds.report.sentiment.
핸드오버 §2-4 "한 줄". 지금까지 사람이 명령을 순서대로 치던 것을 하나로 묶는다.
사람 게이트는 자동화하지 않는다. 보정(라벨링) 여기 들어가지 않으며, 확정 여부는
calibration.confirmed 플래그로 리포트 카드에 그대로 전달한다.
python3 scripts/monthly_ai_measure.py --clinic 뷰성형외과
python3 scripts/monthly_ai_measure.py --clinic 뷰성형외과 --skip-run # 기존 답변 재사용, 감성만
python3 scripts/monthly_ai_measure.py --clinic 뷰성형외과 --build-id <uuid> # Supabase 반영까지
한계: 질문 뱅크 러너(run_question_bank_openai.py) 아직 뷰성형외과 전용이다
(scripts/question_bank_viewclinic.json 하드코딩). 다른 병원으로 넓히려면 러너를
먼저 병원별로 매개변수화해야 한다.
"""
import argparse, json, os, subprocess, sys, time, urllib.request, urllib.error, importlib.util
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
OUT = os.path.join(ROOT, "scripts", "out")
ENGINES = ("openai", "perplexity")
spec = importlib.util.spec_from_file_location("sqb", os.path.join(ROOT, "scripts", "sentiment_qb.py"))
sqb = importlib.util.module_from_spec(spec); spec.loader.exec_module(sqb)
def sh(argv):
print(" $ " + " ".join(argv), flush=True)
r = subprocess.run(argv, cwd=ROOT)
if r.returncode != 0: sys.exit(f"실패: {' '.join(argv)}")
def patch_supabase(build_id, sentiment):
"""supporter_builds.report 에 sentiment 키만 병합한다. 다른 단계가 쓴 키를 지우지 않는다."""
sqb.load_env()
url = os.environ.get("VITE_SUPABASE_URL"); key = os.environ.get("SUPABASE_SERVICE_ROLE_KEY")
if not (url and key): sys.exit("VITE_SUPABASE_URL / SUPABASE_SERVICE_ROLE_KEY 필요 (.env)")
H = {"apikey": key, "authorization": f"Bearer {key}", "content-type": "application/json"}
ep = f"{url}/rest/v1/supporter_builds?id=eq.{build_id}"
req = urllib.request.Request(ep + "&select=report", headers=H)
with urllib.request.urlopen(req, timeout=30, context=sqb.ssl_context()) as r:
rows = json.loads(r.read().decode())
if not rows: sys.exit(f"supporter_builds 에 {build_id} 없음")
report = rows[0].get("report") or {}
report["sentiment"] = sentiment
body = json.dumps({"report": report, "updated_at": time.strftime("%Y-%m-%dT%H:%M:%S")}).encode()
req = urllib.request.Request(ep, data=body, headers={**H, "prefer": "return=minimal"}, method="PATCH")
with urllib.request.urlopen(req, timeout=30, context=sqb.ssl_context()) as r:
print(f" supporter_builds.report.sentiment 갱신 (HTTP {r.status})")
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--clinic", default="뷰성형외과")
ap.add_argument("--alias", default="뷰성형외과의원,뷰 성형외과,View Plastic Surgery,viewclinic")
ap.add_argument("--report", default="docs/reports/viewclinic/03_question_bank/Viewclinic_QB_Sentiment.md")
ap.add_argument("--build-id", help="주면 supporter_builds.report.sentiment 에 반영한다")
ap.add_argument("--skip-run", action="store_true", help="질문 뱅크 러너를 건너뛰고 기존 답변으로 감성만 다시 낸다")
ap.add_argument("--rejudge", action="store_true", help="기존 감성 판정을 지우고 다시 판정한다(기준표를 고친 뒤)")
a = ap.parse_args()
if not a.skip_run:
print("[1/3] 질문 뱅크 실측")
for e in ENGINES:
sh([sys.executable, "scripts/run_question_bank_openai.py", "--engine", e])
else:
print("[1/3] 질문 뱅크 실측 건너뜀 (--skip-run)")
print("[2/3] 감성 판정")
for e in ENGINES:
src = os.path.join(OUT, f"qb_{e}_results.jsonl")
dst = os.path.join(OUT, f"qb_sentiment_{e}.jsonl")
if not os.path.exists(src): sys.exit(f"답변 파일 없음: {src}")
if a.rejudge and os.path.exists(dst): os.remove(dst)
sh([sys.executable, "scripts/sentiment_qb.py", "--in", src, "--out", dst,
"--clinic", a.clinic, "--alias", a.alias])
print("[3/3] 리포트")
outs = [os.path.join(OUT, f"qb_sentiment_{e}.jsonl") for e in ENGINES]
sh([sys.executable, "scripts/sentiment_qb.py", "--summary", *outs,
"--report", a.report, "--clinic", a.clinic])
rows = [json.loads(l) for p in outs for l in open(p, encoding="utf-8") if l.strip()]
W = {"positive": 100, "neutral": 50, "mixed": 25, "negative": 0}
strong = [r for r in rows if r["sentiment"] != "not_mentioned" and not r.get("weak_mention")]
s = sqb.score(rows)
sentiment = {
"rubric": sqb.RUBRIC_VERSION, "model": rows[0].get("model"),
"measuredAt": time.strftime("%Y-%m-%dT%H:%M:%S"),
"answers": s["answers"], "mentioned": s["mentioned"], "score": s["score"],
"scoreStrongOnly": round(sum(W[r["sentiment"]] for r in strong) / len(strong), 1) if strong else None,
"weakMentions": sum(1 for r in rows if r.get("weak_mention")),
"negativeRate": s["negative_rate"], "regulatoryRate": s["regulatory_rate"],
"recommendedRate": s["recommended_rate"],
"byEngine": {e: sqb.score([r for r in rows if r["engine"] == e]) for e in ENGINES},
# 리포트 카드는 이 플래그를 보고 "보정 전 참고값" 을 표시한다. 2차 보정 전에는 확정이 아니다.
"calibration": {"labeled": 29, "agreementPct": 93, "confirmed": False,
"note": "1차 보정 표본으로 규칙을 고쳤으므로 확정 근거가 아니다. 새 30건 2차 보정 필요."},
}
p = os.path.join(OUT, "sentiment_summary.json")
open(p, "w", encoding="utf-8").write(json.dumps(sentiment, ensure_ascii=False, indent=2))
print(f" 요약 → {p}")
print(f" 언급 {s['mentioned']}/{s['answers']} · 감성 점수 {s['score']} · 약한 언급 제외 {sentiment['scoreStrongOnly']}")
if a.build_id: patch_supabase(a.build_id, sentiment)
else: print(" --build-id 없음. Supabase 반영은 건너뛴다.")
if __name__ == "__main__":
main()

View File

@ -0,0 +1,120 @@
{"id": "A-01", "engine": "openai", "question": "뷰성형외과 어때? 믿을만한 병원이야?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "negative", "negative_type": "regulatory", "aspects": ["reviews", "regulatory", "procedure", "safety", "doctors", "access"], "evidence": "그러나 2026년 7월 공정거래위원회의 제재 사례는, 병원 마케팅 방식에 대한 경계가 필요하다는 점을 보여줍니다.", "recommendation": "cautioned", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:34:55", "mention_kind": "strong"}
{"id": "A-02", "engine": "openai", "question": "뷰성형외과는 어떤 병원이야? 소개해줘", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "positive", "negative_type": "none", "aspects": ["procedure", "safety", "doctors"], "evidence": "환자의 안전과 만족을 최우선으로 하며, 최신 기술과 장비를 사용하여 서비스를 제공한다고 광고합니다.", "recommendation": "recommended", "confidence": 0.95, "weak_mention": false, "ts": "2026-09-09T10:34:56", "mention_kind": "strong"}
{"id": "A-03", "engine": "openai", "question": "뷰성형외과는 무슨 수술을 주로 해?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "positive", "negative_type": "none", "aspects": ["doctors", "safety", "procedure", "access"], "evidence": "요약하자면, 뷰성형외과는 아래와 같은 분야에서 특히 강점을 가지고 있습니다:", "recommendation": "recommended", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:34:59", "mention_kind": "strong"}
{"id": "A-04", "engine": "openai", "question": "뷰성형외과 최순우 원장 어떤 의사야?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "positive", "negative_type": "none", "aspects": ["doctors", "safety", "procedure", "reviews", "media"], "evidence": "특히 협진 시스템, 정밀 검사, 안전 중심의 수술 시스템을 갖춘 병원을 운영하며, 의료관광 분야에서도 활동하는 등 의료계 내 다양한 영역에서 신뢰를 쌓아왔습니다.", "recommendation": "recommended", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:00", "mention_kind": "strong"}
{"id": "A-05", "engine": "openai", "question": "뷰성형외과 의료진 몇 명이야? 다 전문의야?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["doctors", "procedure", "safety"], "evidence": "의료진 수: **약 22명**\n- 이 중 성형외과 전문의 비율: **대부분이 성형외과 전문의**\n- 그 외: **이비인후과 전문의** (코 성형 담당), **마취통증의학과 전문의** (안전한 수술을 위한 상주 인력) 포함", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:02", "mention_kind": "strong"}
{"id": "A-06", "engine": "openai", "question": "뷰성형외과가 렛미인 나온 병원 맞아?", "prior": "✕", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["media"], "evidence": "즉, 뷰성형외과는 “렛미인” 프로그램에 **닥터스 참여 병원**으로 실제 출연한 경력이 있는 병원입니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:04", "mention_kind": "strong"}
{"id": "A-07", "engine": "openai", "question": "뷰성형외과 언제 생긴 병원이야? 오래됐어?", "prior": "✕", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["regulatory", "safety"], "evidence": "정리하면, 뷰성형외과는 2005년에 문을 연 이후, 현재(2026년 기준) 약 21~22년 정도 운영되어 온 비교적 오랜 역사를 가진 병원입니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:05", "mention_kind": "strong"}
{"id": "A-08", "engine": "openai", "question": "뷰성형외과 건물이 통째로 병원이라던데 맞아?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["access", "procedure"], "evidence": "뷰성형외과는 성형외과 진료만을 위한 **'19층 규모의 ALLINONE 스마트 빌딩'**으로 운영되고 있습니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:07", "mention_kind": "strong"}
{"id": "A-09", "engine": "openai", "question": "뷰성형외과 강남언니 평점 몇 점이야?", "prior": "◯", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["reviews"], "evidence": "강남언니 내 병원 추천 목록에서는 ‘뷰성형외과’ 가 9.5점 평점을 기록 중이며, 약 17,099건의 평가가 있는 것으로 나타났습니다", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:09", "mention_kind": "strong"}
{"id": "A-10", "engine": "openai", "question": "뷰성형외과 유튜브 채널 있어?", "prior": "◯", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["media"], "evidence": "뷰성형외과(VIEW Plastic Surgery)는 유튜브에서 공식 채널을 운영하고 있습니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:10", "mention_kind": "strong"}
{"id": "A-11", "engine": "openai", "question": "뷰성형외과랑 다른 강남 대형 성형외과랑 뭐가 달라?", "prior": "✕", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["doctors", "safety", "reviews", "procedure", "access"], "evidence": "뷰성형외과는 다른 강남의 대형 성형외과와 비교해 몇 가지 차별점이 있을 수 있습니다. 하지만 정확한 차별점을 알기 위해서는 최신 정보를 확인하는 것이 중요합니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:12", "mention_kind": "strong"}
{"id": "A-12", "engine": "openai", "question": "뷰성형외과 단점이나 주의할 점 있어?", "prior": "✕", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": [], "evidence": "뷰성형외과에 대한 구체적인 단점이나 주의할 점에 관해서는 인터넷 검색이나 직접적인 이용 후기를 참조하는 것이 가장 좋습니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:13", "mention_kind": "strong"}
{"id": "B-01", "engine": "openai", "question": "뷰성형외과 주소 어디야?", "prior": "◯", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["access"], "evidence": "뷰성형외과(“뷰성형외과의원”)의 주소는 아래와 같습니다:", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:15", "mention_kind": "strong"}
{"id": "B-02", "engine": "openai", "question": "뷰성형외과 신논현역에서 얼마나 걸려?", "prior": "◯", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["access"], "evidence": "신논현역에서 뷰성형외과까지의 거리는 걸어서 약 5분에서 10분 정도 소요될 수 있습니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:16", "mention_kind": "strong"}
{"id": "B-03", "engine": "openai", "question": "뷰성형외과 전화번호 알려줘", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["access"], "evidence": "아래는 서울 강남구 논현동에 위치한 **뷰성형외과의 공식 전화번호** 정보입니다:", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:18", "mention_kind": "strong"}
{"id": "B-04", "engine": "openai", "question": "뷰성형외과 진료시간 어떻게 돼?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["access"], "evidence": "다음은 서울 강남구 논현동에 위치한 **뷰성형외과의 진료 시간 안내**입니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:19", "mention_kind": "strong"}
{"id": "B-05", "engine": "openai", "question": "뷰성형외과 일요일이나 공휴일에도 해?", "prior": "✕", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["access"], "evidence": "일요일 진료: 별도로 안내된 정보가 없으며, 일반적인 진료시간표상 일요일에는 휴진일 가능성이 높습니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:21", "mention_kind": "strong"}
{"id": "B-06", "engine": "openai", "question": "뷰성형외과 주차 되나?", "prior": "✕", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["access"], "evidence": "뷰성형외과(강남구 봉은사로 107, 신논현역 인근)는 **병원 건물 내부에 전용 주차시설이 있는 것으로 보이지 않습니다**.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:23", "mention_kind": "strong"}
{"id": "B-07", "engine": "openai", "question": "뷰성형외과 상담 예약 어떻게 해?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["access"], "evidence": "정확한 정보를 위해 뷰성형외과의 최신 연락처나 예약 가능 방법을 직접 확인하는 것이 좋습니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:24", "mention_kind": "strong"}
{"id": "B-08", "engine": "openai", "question": "뷰성형외과 카톡으로 상담돼?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["access"], "evidence": "요약하자면, 뷰성형외과는 카카오톡 채널을 운영하고 있으며, 이를 통해 상담과 예약 문의가 가능합니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:26", "mention_kind": "strong"}
{"id": "B-09", "engine": "openai", "question": "뷰성형외과 상담받으러 가면 몇 층으로 가?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["access"], "evidence": "즉, 처음 뷰성형외과 상담을 받으러 가시면 **1층에서 접수 → (지하 촬영) → 4층으로 올라가 상담 대기 및 상담**의 순서로 이동하게 됩니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:27", "mention_kind": "strong"}
{"id": "B-10", "engine": "openai", "question": "신논현역 3번 출구 근처 성형외과 뭐 있어?", "prior": "◯", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["access", "procedure"], "evidence": "- **VIEW Plastic Surgery (뷰 성형외과)**\n - 위치: 신논현역 3번 출구에서 약 50m 거리, 정말 가까움 ([viewplasticsurgery.com](https://www.viewplasticsurgery.com/introduction/direction/?utm_source=openai)).\n - 진료 시간: 평일 10:0019:00, 금요일은 21:00까지, 토요일 10:0017:00 ([viewplasticsurgery.com](https://www.viewplasticsurgery.com/introduction/direction/?utm_source=openai)).\n - 특징: 19층 규모의 병원 형태로, 전문성 높은 팀을 구성하여 다부위 수술 및 복합 시술에 적합", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:30", "mention_kind": "strong"}
{"id": "C-01", "engine": "openai", "question": "강남 성형외과 추천해줘", "prior": "✕", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "positive", "negative_type": "none", "aspects": ["reviews"], "evidence": "The Door Plastic Surgery, View Plastic Surgery 등도 평점 4.8로 높은 평가받고 있습니다 ([gangnambeautyguide.com](https://gangnambeautyguide.com/en/clinics/?utm_source=openai)).", "recommendation": "recommended", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:31", "mention_kind": "strong"}
{"id": "C-02", "engine": "openai", "question": "강남에서 가슴성형 잘하는 병원 어디야?", "prior": "✕", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "positive", "negative_type": "none", "aspects": ["safety", "doctors", "procedure", "access", "reviews"], "evidence": "뷰성형외과  - 협진 체계, 안전 장비, 1:1 진료 및 사후관리 강조", "recommendation": "recommended", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:33", "mention_kind": "strong"}
{"id": "C-03", "engine": "openai", "question": "강남 안면윤곽 유명한 병원 알려줘", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:34", "mention_kind": "none"}
{"id": "C-04", "engine": "openai", "question": "코성형 잘하는 강남 병원 추천해줘", "prior": "✕", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "positive", "negative_type": "none", "aspects": ["doctors", "safety", "procedure", "access", "reviews"], "evidence": "뷰성형외과 강남 | 협진 시스템, 맞춤 설계, 대학병원급 안전 시스템", "recommendation": "recommended", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:36", "mention_kind": "strong"}
{"id": "C-05", "engine": "openai", "question": "눈 재수술 잘하는 병원 어디야?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:37", "mention_kind": "none"}
{"id": "C-06", "engine": "openai", "question": "강남 성형외과 톱5 알려줘", "prior": "✕", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "positive", "negative_type": "none", "aspects": ["reviews", "procedure"], "evidence": "- 평점: 4.8 / 리뷰수: 약 9,167건 ([gangnambeautyguide.com](https://gangnambeautyguide.com/en/clinics/?utm_source=openai)) \n- 강점: 유방성형 및 안면 윤곽 전문, 넓은 리뷰 기반", "recommendation": "recommended", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:39", "mention_kind": "strong"}
{"id": "C-07", "engine": "openai", "question": "가슴성형 병원 3곳만 골라서 비교해줘", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:41", "mention_kind": "none"}
{"id": "C-08", "engine": "openai", "question": "마취과 전문의가 상주하는 강남 성형외과 어디야?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "positive", "negative_type": "none", "aspects": ["doctors", "safety", "procedure"], "evidence": "- 안면윤곽, 눈·코·가슴 성형 등을 전문으로 하며, **마취과 전문의가 365일 상주**하고 있다는 점을 강조합니다 ([blog.viewclinic.com](https://blog.viewclinic.com/?utm_source=openai)).\n- 3D-CT 등 정밀 골격 분석 장비와 체계적 사후 관리 체계를 갖추고 있는 병원입니다 ([blog.viewclinic.com](https://blog.viewclinic.com/?utm_source=openai)).", "recommendation": "recommended", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:42", "mention_kind": "strong"}
{"id": "C-09", "engine": "openai", "question": "수술실 CCTV 있는 성형외과 추천해줘", "prior": "△", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:44", "mention_kind": "none"}
{"id": "C-10", "engine": "openai", "question": "여의사한테 수술받을 수 있는 성형외과 있어?", "prior": "△", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:45", "mention_kind": "none"}
{"id": "C-11", "engine": "openai", "question": "후기 제일 많은 강남 성형외과 어디야?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "negative", "negative_type": "regulatory", "aspects": ["regulatory", "reviews", "price"], "evidence": "예컨대 ‘뷰성형외과’, '에이비성형외과의원', '디에이성형외과'는 후기를 조건으로 수술비 일부를 할인해 주고 광고처럼 이용한 사례로 지적된 바 있습니다 ([v.daum.net](https://v.daum.net/v/QaV6Ond8j0?utm_source=openai)).", "recommendation": "cautioned", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:46", "mention_kind": "strong"}
{"id": "C-12", "engine": "openai", "question": "강남언니에서 평점 높은 성형외과 알려줘", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "positive", "negative_type": "none", "aspects": ["reviews"], "evidence": "**팝성형외과**, **티에스성형외과**, **기린성형외과**, **제이필의원**, **뷰성형외과**, **뭐 등 다양한 병원들이 높은 평점을 보이고 있습니다.", "recommendation": "recommended", "confidence": 0.95, "weak_mention": false, "ts": "2026-09-09T10:35:48", "mention_kind": "strong"}
{"id": "C-13", "engine": "openai", "question": "20년 넘게 운영한 강남 성형외과 있어?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:49", "mention_kind": "none"}
{"id": "C-14", "engine": "openai", "question": "리프팅 잘하는 강남 병원 추천해줘", "prior": "✕", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:51", "mention_kind": "none"}
{"id": "C-15", "engine": "openai", "question": "의사 여러 명 있는 대형 성형외과가 나아? 어디 추천해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:52", "mention_kind": "none"}
{"id": "D1-01", "engine": "openai", "question": "뷰성형외과 가슴성형 잘해?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "positive", "negative_type": "none", "aspects": ["doctors", "safety", "price", "reviews", "procedure"], "evidence": "뷰성형외과는 가슴성형 분야에서 경험, 전문성, 안전성, 사후관리 체계를 갖춘 병원으로 평가됩니다. 많은 환자들이 만족스럽다는 후기도 많으며, 개인의 체형·희망·상태에 맞춘 맞춤 상담과 전문적인 진료 흐름이 강점입니다.", "recommendation": "recommended", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:54", "mention_kind": "strong"}
{"id": "D1-02", "engine": "openai", "question": "가슴 보형물 종류 뭐가 있어?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:55", "mention_kind": "none"}
{"id": "D1-03", "engine": "openai", "question": "모티바랑 멘토 보형물 차이가 뭐야?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:56", "mention_kind": "none"}
{"id": "D1-04", "engine": "openai", "question": "가슴성형 수술시간 얼마나 걸려?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:57", "mention_kind": "none"}
{"id": "D1-05", "engine": "openai", "question": "가슴성형 회복기간 어느 정도야? 언제 출근해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:59", "mention_kind": "none"}
{"id": "D1-06", "engine": "openai", "question": "가슴성형 흉터 어디에 남아?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:00", "mention_kind": "none"}
{"id": "D1-07", "engine": "openai", "question": "구형구축이 뭐야? 예방할 수 있어?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:01", "mention_kind": "none"}
{"id": "D1-08", "engine": "openai", "question": "가슴 지방이식이랑 보형물 중에 뭐가 나아?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:02", "mention_kind": "none"}
{"id": "D1-09", "engine": "openai", "question": "가슴 재수술은 언제 해야 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:04", "mention_kind": "none"}
{"id": "D1-10", "engine": "openai", "question": "가슴성형하면 수유에 영향 있어?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:05", "mention_kind": "none"}
{"id": "D1-11", "engine": "openai", "question": "가슴성형 후 정기검진 뭐 받아야 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:06", "mention_kind": "none"}
{"id": "D1-12", "engine": "openai", "question": "가슴성형 과정 잘 설명해주는 영상 있어?", "prior": "△", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:08", "mention_kind": "none"}
{"id": "D2-01", "engine": "openai", "question": "뷰성형외과 눈성형 어때?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "positive", "negative_type": "none", "aspects": ["doctors", "safety", "price", "reviews", "procedure", "access"], "evidence": "장점:\n- 높은 평점(4.7)과 JCI 인증, 다국어 지원으로 의료 신뢰도 높음 ([getcarekorea.com](https://getcarekorea.com/ko/hospitals/view-plastic-surgery?utm_source=openai))\n- 눈 성형 종류 다양하고 비교적 합리적인 가격대 ([beauty6.tistory.com](https://beauty6.tistory.com/184?utm_source=openai))\n- 실제 환자들이 자연스러운 결과, 빠른 회복, 친절한 간호/진료 서비스에 만족 ([cashdoc.me](https://cashdoc.me/community/plasticsurgery/89688246?utm_source=openai))", "recommendation": "recommended", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:10", "mention_kind": "strong"}
{"id": "D2-02", "engine": "openai", "question": "쌍수 절개랑 매몰 차이가 뭐야?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:14", "mention_kind": "none"}
{"id": "D2-03", "engine": "openai", "question": "자연유착 쌍수가 뭐야?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:15", "mention_kind": "none"}
{"id": "D2-04", "engine": "openai", "question": "눈매교정은 쌍수랑 같이 해야 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:16", "mention_kind": "none"}
{"id": "D2-05", "engine": "openai", "question": "앞트임 뒤트임 밑트임 뭐가 달라?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:17", "mention_kind": "none"}
{"id": "D2-06", "engine": "openai", "question": "쌍수 회복기간 얼마나 걸려?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:19", "mention_kind": "none"}
{"id": "D2-07", "engine": "openai", "question": "눈 재수술은 첫 수술 후 언제부터 가능해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:20", "mention_kind": "none"}
{"id": "D2-08", "engine": "openai", "question": "앞트임하면 잘 어울리는 얼굴이 따로 있어?", "prior": "△", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:23", "mention_kind": "none"}
{"id": "D2-09", "engine": "openai", "question": "쌍수 붓기 빨리 빼는 법 있어?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:24", "mention_kind": "none"}
{"id": "D3-01", "engine": "openai", "question": "뷰성형외과 코성형 어때?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["reviews", "doctors", "procedure"], "evidence": "뷰성형외과의 코성형에 대한 평가는 일반적으로 병원의 평판, 의사들의 경험, 수술 후 환자들의 후기 등을 바탕으로 이루어집니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:25", "mention_kind": "strong"}
{"id": "D3-02", "engine": "openai", "question": "코성형 재료 뭐뭐 있어?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:26", "mention_kind": "none"}
{"id": "D3-03", "engine": "openai", "question": "실리콘이랑 자가연골 중에 뭐가 나아?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:28", "mention_kind": "none"}
{"id": "D3-04", "engine": "openai", "question": "콧대만 할까 코끝까지 같이 할까?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:29", "mention_kind": "none"}
{"id": "D3-05", "engine": "openai", "question": "코성형 회복기간 얼마나 돼?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:30", "mention_kind": "none"}
{"id": "D3-06", "engine": "openai", "question": "코 재수술은 언제부터 할 수 있어?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:32", "mention_kind": "none"}
{"id": "D3-07", "engine": "openai", "question": "휜코 교정도 성형외과에서 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:33", "mention_kind": "none"}
{"id": "D3-08", "engine": "openai", "question": "복코 수술 어떻게 하는 거야?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:34", "mention_kind": "none"}
{"id": "D3-09", "engine": "openai", "question": "내 얼굴형에 맞는 코 모양 어떻게 정해?", "prior": "△", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:35", "mention_kind": "none"}
{"id": "D4-01", "engine": "openai", "question": "뷰성형외과 안면윤곽 잘하는 곳 맞아?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "positive", "negative_type": "none", "aspects": ["doctors", "safety", "reviews", "procedure", "media"], "evidence": "전반적으로, 뷰성형외과는 안면윤곽 수술에 있어 안전성과 전문성을 갖춘 병원으로 평가받고 있습니다. 특히 수술 기법과 시스템, 다수의 수상 경력과 방송 노출 경력 등이 신뢰감을 줍니다.", "recommendation": "recommended", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:37", "mention_kind": "strong"}
{"id": "D4-02", "engine": "openai", "question": "광대축소 수술 어떻게 하는 거야?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:39", "mention_kind": "none"}
{"id": "D4-03", "engine": "openai", "question": "V라인 사각턱 수술 부작용 없어?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:40", "mention_kind": "none"}
{"id": "D4-04", "engine": "openai", "question": "양악수술은 어떤 경우에 해야 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:41", "mention_kind": "none"}
{"id": "D4-05", "engine": "openai", "question": "윤곽수술 신경 손상 위험 얼마나 돼?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:43", "mention_kind": "none"}
{"id": "D4-06", "engine": "openai", "question": "윤곽수술 회복기간 얼마나 걸려?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:44", "mention_kind": "none"}
{"id": "D4-07", "engine": "openai", "question": "윤곽수술 붓기 언제 빠져?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:45", "mention_kind": "none"}
{"id": "D4-08", "engine": "openai", "question": "윤곽이랑 코성형 같이 해도 돼?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:46", "mention_kind": "none"}
{"id": "D4-09", "engine": "openai", "question": "안면윤곽으로 상 받은 병원 있어?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:48", "mention_kind": "none"}
{"id": "D5-01", "engine": "openai", "question": "지방흡입 부위별로 뭐가 달라?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:49", "mention_kind": "none"}
{"id": "D5-02", "engine": "openai", "question": "얼굴 지방이식하면 자연스러워?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:51", "mention_kind": "none"}
{"id": "D5-03", "engine": "openai", "question": "지방이식 생착률 얼마나 돼?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:52", "mention_kind": "none"}
{"id": "D5-04", "engine": "openai", "question": "복부 지방흡입 회복 얼마나 걸려?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:53", "mention_kind": "none"}
{"id": "D5-05", "engine": "openai", "question": "뷰성형외과에서 지방성형도 해?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": [], "evidence": "뷰성형외과에서 지방 성형을 하는지 확인하려면, 해당 병원의 웹사이트를 방문하거나 직접 문의하는 것이 가장 정확합니다.", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:54", "mention_kind": "strong"}
{"id": "D5-06", "engine": "openai", "question": "지방흡입 흉터 남아?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:56", "mention_kind": "none"}
{"id": "D6-01", "engine": "openai", "question": "리프팅 종류별로 뭐가 달라?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:58", "mention_kind": "none"}
{"id": "D6-02", "engine": "openai", "question": "실리프팅이랑 안면거상 중에 뭐 해야 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:00", "mention_kind": "none"}
{"id": "D6-03", "engine": "openai", "question": "울쎄라 효과 진짜 있어?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:01", "mention_kind": "none"}
{"id": "D6-04", "engine": "openai", "question": "리프팅 효과 얼마나 유지돼?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:02", "mention_kind": "none"}
{"id": "D6-05", "engine": "openai", "question": "40대인데 안티에이징 뭐부터 시작해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:03", "mention_kind": "none"}
{"id": "D6-06", "engine": "openai", "question": "뷰성형외과에서 리프팅도 받을 수 있어?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["procedure"], "evidence": "따라서 뷰성형외과에서는 리프팅 시술이 **다양한 방식으로 제공**되고 있음을 확인하실 수 있습니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:05", "mention_kind": "strong"}
{"id": "D6-07", "engine": "openai", "question": "수술 흉터 관리 어떻게 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:06", "mention_kind": "none"}
{"id": "D7-01", "engine": "openai", "question": "재수술 전문 병원은 뭐가 달라?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:07", "mention_kind": "none"}
{"id": "D7-02", "engine": "openai", "question": "뷰성형외과 재수술 잘해?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": [], "evidence": "뷰성형외과의 재수술에 대한 평판이나 성공 사례를 확인하려면, 실제 환자들의 후기를 참고하거나 관련 커뮤니티에서 정보를 수집하는 것이 좋습니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:09", "mention_kind": "strong"}
{"id": "D7-03", "engine": "openai", "question": "성형 재수술은 왜 하게 되는 거야?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:10", "mention_kind": "none"}
{"id": "D7-04", "engine": "openai", "question": "재수술은 처음보다 비용 더 비싸?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:11", "mention_kind": "none"}
{"id": "D7-05", "engine": "openai", "question": "재수술 하려면 첫 수술 후 얼마나 기다려야 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:13", "mention_kind": "none"}
{"id": "D7-06", "engine": "openai", "question": "다른 병원에서 한 수술도 재수술 상담해줘?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:15", "mention_kind": "none"}
{"id": "E-01", "engine": "openai", "question": "성형외과 고를 때 뭘 확인해야 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:16", "mention_kind": "none"}
{"id": "E-02", "engine": "openai", "question": "성형수술 마취 사고 안 나려면 어떤 병원 가야 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:18", "mention_kind": "none"}
{"id": "E-03", "engine": "openai", "question": "수술실 CCTV 있는지 어떻게 확인해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:19", "mention_kind": "none"}
{"id": "E-04", "engine": "openai", "question": "전신마취랑 수면마취 차이가 뭐야?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:21", "mention_kind": "none"}
{"id": "E-05", "engine": "openai", "question": "성형외과 전문의인지 어떻게 확인해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:22", "mention_kind": "none"}
{"id": "E-06", "engine": "openai", "question": "응급상황 대응 시스템 갖춘 성형외과 어디야?", "prior": "△", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:23", "mention_kind": "none"}
{"id": "E-07", "engine": "openai", "question": "성형 부작용 생기면 어떻게 해야 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:24", "mention_kind": "none"}
{"id": "E-08", "engine": "openai", "question": "상담실장 말고 의사가 직접 상담해주는 병원 있어?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:26", "mention_kind": "none"}
{"id": "E-09", "engine": "openai", "question": "뷰성형외과 안전 시스템 어때?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "positive", "negative_type": "none", "aspects": ["safety", "doctors", "procedure", "access", "reviews"], "evidence": "이처럼 뷰성형외과는 **환자 안전을 위한 다층적인 시스템과 기준**을 두고 있습니다.", "recommendation": "recommended", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:27", "mention_kind": "strong"}
{"id": "F-01", "engine": "openai", "question": "강남 가슴성형 평균 비용 얼마야?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:28", "mention_kind": "none"}
{"id": "F-02", "engine": "openai", "question": "뷰성형외과 가슴성형 얼마야?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["price", "procedure"], "evidence": "뷰성형외과에서 시행하는 가슴성형 수술의 비용은 여러 요인에 따라 매우 다양한데요. 사용되는 보형물 브랜드, 1차 또는 재수술 여부, 수술 난이도, 마취 시스템, 병원의 안전 인프라 및 사후관리 포함 여부 등에 따라 크게 달라집니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:30", "mention_kind": "strong"}
{"id": "F-03", "engine": "openai", "question": "쌍수 가격 보통 얼마 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:31", "mention_kind": "none"}
{"id": "F-04", "engine": "openai", "question": "코성형 견적 어느 정도 잡아야 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:32", "mention_kind": "none"}
{"id": "F-05", "engine": "openai", "question": "뷰성형외과 지금 하는 이벤트 있어?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["price", "procedure"], "evidence": "뷰성형외과에 대한 현재 진행 중인 이벤트를 확인한 결과, 최신 프로모션 정보를 찾기 위해 주요 정보 플랫폼을 조회했습니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:33", "mention_kind": "strong"}
{"id": "F-06", "engine": "openai", "question": "성형외과 이벤트가 믿어도 돼? 싼 데는 왜 싸?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:34", "mention_kind": "none"}
{"id": "F-07", "engine": "openai", "question": "성형 비용 카드 할부나 분할 돼?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:36", "mention_kind": "none"}
{"id": "F-08", "engine": "openai", "question": "성형 견적 여러 병원 비교하려면 어떻게 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:37", "mention_kind": "none"}
{"id": "G-01", "engine": "openai", "question": "뷰성형외과 실제 후기 어때?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "positive", "negative_type": "none", "aspects": ["doctors", "safety", "price", "reviews", "procedure"], "evidence": "뷰성형외과는 **높은 만족도와 전문성을 갖춘 대형 병원**으로 평가되며, 특히 자연스럽고 정밀한 결과를 원하는 환자들에게 긍정적인 선택이 될 수 있습니다. 다만, 상담 경험은 대기 시간과 상담 시간의 한계가 있을 수 있으니 이에 대한 충분한 대비가 필요합니다.", "recommendation": "recommended", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:39", "mention_kind": "strong"}
{"id": "G-02", "engine": "openai", "question": "뷰성형외과 부작용 후기나 안 좋은 얘기 있어?", "prior": "✕", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "negative", "negative_type": "regulatory", "aspects": ["regulatory", "reviews"], "evidence": "뷰성형외과가 수술비 할인 등 대가를 제공하고, 이를 '자발적인 후기'로 위장하여 광고한 혐의로 공정거래위원회의 시정명령을 받았습니다.", "recommendation": "cautioned", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:40", "mention_kind": "strong"}
{"id": "G-03", "engine": "openai", "question": "강남언니 후기 믿을만해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:42", "mention_kind": "none"}
{"id": "G-04", "engine": "openai", "question": "뷰성형외과 수술 전후 사진 어디서 봐?", "prior": "△", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:43", "mention_kind": "none"}
{"id": "G-05", "engine": "openai", "question": "성형 후기는 어디서 봐야 정확해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:44", "mention_kind": "none"}
{"id": "G-06", "engine": "openai", "question": "뷰성형외과 인스타그램 있어?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["access"], "evidence": "요약하면, 예, 뷰성형외과는 공식 인스타그램 계정을 운영 중이며, 해당 계정은 Linktree를 통해 연결되어 있는 것으로 확인됩니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:50", "mention_kind": "strong"}
{"id": "G-07", "engine": "openai", "question": "뷰성형외과는 뭘로 유명한 병원이야?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "positive", "negative_type": "none", "aspects": ["doctors", "safety", "procedure", "access", "media", "reviews"], "evidence": "뷰성형외과는 특히 **가슴성형 분야의 압도적인 시술량**, **안전에 대한 철저한 시스템**, **원스톱 프리미엄 케어**, 그리고 **외국인 환자를 위한 의료관광 서비스**로 높은 평판을 자랑합니다.", "recommendation": "recommended", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:51", "mention_kind": "strong"}
{"id": "G-08", "engine": "openai", "question": "가슴성형 후기 많은 병원 어디야?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "positive", "negative_type": "none", "aspects": ["reviews"], "evidence": "또한, “View”, “Wooa”, “Wish PS” 등도 리뷰량과 자체 B&A(전후 사진)가 많아 실제 경험 공유가 활발한 곳으로 언급됩니다 ([reddit.com](https://www.reddit.com/r/SeoulPlasticSurgery/comments/1u000in/researching_breast_augmentation_clinics_in_korea/?utm_source=openai)).", "recommendation": "recommended", "confidence": 0.95, "weak_mention": true, "ts": "2026-09-09T10:37:53", "mention_kind": "weak"}

View File

@ -0,0 +1,120 @@
{"id": "A-01", "engine": "perplexity", "question": "뷰성형외과 어때? 믿을만한 병원이야?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["reviews", "access", "procedure", "doctors", "safety"], "evidence": "그래서 현실적으로는 **“후기 기반 평판은 좋은 편이지만, 광고성/이벤트성 후기의 영향도 있을 수 있어 추가 확인이 필요”**라고 보는 게 안전합니다.[4][7][8][14][15]", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:26", "mention_kind": "strong"}
{"id": "A-02", "engine": "perplexity", "question": "뷰성형외과는 어떤 병원이야? 소개해줘", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["procedure", "access", "doctors", "safety"], "evidence": "뷰성형외과는 **서울 강남구 봉은사로 107(논현동)**에 있는 성형외과로, **2005년 개원**한 뒤 가슴성형, 안면윤곽, 양악수술, 눈·코성형, 지방흡입, 안티에이징 등 여러 분야를 다루는 **종합 성형외과**로 소개됩니다.[1][2][11]", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:27", "mention_kind": "strong"}
{"id": "A-03", "engine": "perplexity", "question": "뷰성형외과는 무슨 수술을 주로 해?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["procedure"], "evidence": "뷰성형외과는 **가슴성형**을 특히 강조하지만, 그 외에도 **코성형, 눈성형, 안면윤곽, 양악수술, 지방흡입/지방성형, 안티에이징·리프팅**을 주로 하는 병원입니다.[1][3][6][11]", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:29", "mention_kind": "strong"}
{"id": "A-04", "engine": "perplexity", "question": "뷰성형외과 최순우 원장 어떤 의사야?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "positive", "negative_type": "none", "aspects": ["doctors", "procedure", "safety", "media"], "evidence": "즉, 한마디로 정리하면 **서울대 출신의 성형외과 전문의이자 뷰성형외과 대표원장**이며, 병원 측 자료 기준으로는 특히 **가슴성형** 쪽 경력이 많이 강조되는 의사입니다.[1][2][6][7]", "recommendation": "recommended", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:31", "mention_kind": "strong"}
{"id": "A-05", "engine": "perplexity", "question": "뷰성형외과 의료진 몇 명이야? 다 전문의야?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["doctors"], "evidence": "뷰성형외과의원은 **의사 23명**으로 신고되어 있고, 그중 **전문의는 15명**으로 보입니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:32", "mention_kind": "strong"}
{"id": "A-06", "engine": "perplexity", "question": "뷰성형외과가 렛미인 나온 병원 맞아?", "prior": "✕", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["media", "doctors"], "evidence": "네, **뷰성형외과는 렛미인에 나온 병원**이 맞습니다. 여러 자료에서 뷰성형외과가 **‘렛미인 닥터스 선정 병원’으로 시즌 2~5에 참여**했다고 소개하고 있습니다.[1][2][4]", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:34", "mention_kind": "strong"}
{"id": "A-07", "engine": "perplexity", "question": "뷰성형외과 언제 생긴 병원이야? 오래됐어?", "prior": "✕", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["access"], "evidence": "뷰성형외과는 2005년에 개원한 병원이라, 현재 기준으로 꽤 오래된 편입니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:35", "mention_kind": "strong"}
{"id": "A-08", "engine": "perplexity", "question": "뷰성형외과 건물이 통째로 병원이라던데 맞아?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["access"], "evidence": "네, **건물 전체를 뷰성형외과가 쓰는 형태**로 보입니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:36", "mention_kind": "strong"}
{"id": "A-09", "engine": "perplexity", "question": "뷰성형외과 강남언니 평점 몇 점이야?", "prior": "◯", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["reviews"], "evidence": "강남언니의 뷰성형외과의원 페이지에 평점이 **9.5**로 표시되어 있습니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:38", "mention_kind": "strong"}
{"id": "A-10", "engine": "perplexity", "question": "뷰성형외과 유튜브 채널 있어?", "prior": "◯", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["media"], "evidence": "네, **있습니다**. 검색 결과에 따르면 뷰성형외과의 유튜브 채널로 **“뷰성형외과 VIEW Plastic Surgery”**가 확인되며, 영상 설명에도 **English YouTube**와 함께 공식 채널 링크가 안내되어 있습니다[1][7].", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:39", "mention_kind": "strong"}
{"id": "A-11", "engine": "perplexity", "question": "뷰성형외과랑 다른 강남 대형 성형외과랑 뭐가 달라?", "prior": "✕", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "positive", "negative_type": "none", "aspects": ["doctors", "safety", "procedure", "access"], "evidence": "안전 중심 운영: 대학병원급 안전 장비와 시설, 응급상황 대비 시스템, 검사·수술·회복을 한 곳에서 진행하는 원스톱 구조를 내세웁니다.[5][8][9]", "recommendation": "recommended", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:41", "mention_kind": "strong"}
{"id": "A-12", "engine": "perplexity", "question": "뷰성형외과 단점이나 주의할 점 있어?", "prior": "✕", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "negative", "negative_type": "regulatory", "aspects": ["reviews", "price", "doctors", "safety", "regulatory", "procedure", "access"], "evidence": "공정거래위원회가 뷰성형외과를 포함한 강남 성형외과들의 *수술비 할인 등 대가를 받고 작성한 후기를 자발적 후기처럼 보이게 한 행위*를 제재했습니다.", "recommendation": "cautioned", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:43", "mention_kind": "strong"}
{"id": "B-01", "engine": "perplexity", "question": "뷰성형외과 주소 어디야?", "prior": "◯", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["access"], "evidence": "**뷰성형외과 주소**는 서울 **강남구 봉은사로 107**입니다.[2][3][4]", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:44", "mention_kind": "strong"}
{"id": "B-02", "engine": "perplexity", "question": "뷰성형외과 신논현역에서 얼마나 걸려?", "prior": "◯", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["access"], "evidence": "신논현역 3번 출구에서 뷰성형외과까지는 도보로 약 1분~3분 정도로 안내됩니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:46", "mention_kind": "strong"}
{"id": "B-03", "engine": "perplexity", "question": "뷰성형외과 전화번호 알려줘", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": [], "evidence": "뷰성형외과 전화번호는 02-539-1177입니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:47", "mention_kind": "strong"}
{"id": "B-04", "engine": "perplexity", "question": "뷰성형외과 진료시간 어떻게 돼?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["access"], "evidence": "뷰성형외과 진료시간은 **평일 10:00~19:00**, **금요일 10:00~21:00**, **토요일 10:00~17:00**이고, **일요일·공휴일은 휴진**입니다.[1][6][8]", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:48", "mention_kind": "strong"}
{"id": "B-05", "engine": "perplexity", "question": "뷰성형외과 일요일이나 공휴일에도 해?", "prior": "✕", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["access"], "evidence": "뷰성형외과는 일요일과 공휴일에 휴진입니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:50", "mention_kind": "strong"}
{"id": "B-06", "engine": "perplexity", "question": "뷰성형외과 주차 되나?", "prior": "✕", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["access", "price"], "evidence": "네, **주차 가능합니다**. 뷰성형외과는 **주차 가능**으로 안내되어 있고, **35대 동시 주차**가 가능한 주차공간이 있다고 안내합니다.[1][3][5]", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:51", "mention_kind": "strong"}
{"id": "B-07", "engine": "perplexity", "question": "뷰성형외과 상담 예약 어떻게 해?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["access"], "evidence": "뷰성형외과 상담 예약은 **전화(02-539-1177)** 로 문의하거나, **네이버 예약**에서 진행할 수 있습니다.[2][3]", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:53", "mention_kind": "strong"}
{"id": "B-08", "engine": "perplexity", "question": "뷰성형외과 카톡으로 상담돼?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["access"], "evidence": "뷰성형외과는 카카오톡 문의를 안내하고 있으며, 검색 결과에 따르면 **@뷰성형외과의원**(플러스친구 ID) 또는 **뷰성형외과**로 카톡 문의가 가능합니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:54", "mention_kind": "strong"}
{"id": "B-09", "engine": "perplexity", "question": "뷰성형외과 상담받으러 가면 몇 층으로 가?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["access"], "evidence": "상담은 4층으로 가면 됩니다. 뷰성형외과 안내에 따르면 처음 방문하는 고객은 1층 안내데스크를 이용하고, 상담실은 4층입니다.[2]", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:56", "mention_kind": "strong"}
{"id": "B-10", "engine": "perplexity", "question": "신논현역 3번 출구 근처 성형외과 뭐 있어?", "prior": "◯", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["procedure", "access"], "evidence": "뷰성형외과의원: 신논현역 3번 출구 인근으로 안내되며, 가슴성형 중심 병원으로 표시됩니다.[9]", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:57", "mention_kind": "strong"}
{"id": "C-01", "engine": "perplexity", "question": "강남 성형외과 추천해줘", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:35:58", "mention_kind": "none"}
{"id": "C-02", "engine": "perplexity", "question": "강남에서 가슴성형 잘하는 병원 어디야?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:00", "mention_kind": "none"}
{"id": "C-03", "engine": "perplexity", "question": "강남 안면윤곽 유명한 병원 알려줘", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:01", "mention_kind": "none"}
{"id": "C-04", "engine": "perplexity", "question": "코성형 잘하는 강남 병원 추천해줘", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:02", "mention_kind": "none"}
{"id": "C-05", "engine": "perplexity", "question": "눈 재수술 잘하는 병원 어디야?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:03", "mention_kind": "none"}
{"id": "C-06", "engine": "perplexity", "question": "강남 성형외과 톱5 알려줘", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:05", "mention_kind": "none"}
{"id": "C-07", "engine": "perplexity", "question": "가슴성형 병원 3곳만 골라서 비교해줘", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:06", "mention_kind": "none"}
{"id": "C-08", "engine": "perplexity", "question": "마취과 전문의가 상주하는 강남 성형외과 어디야?", "prior": "△", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:07", "mention_kind": "none"}
{"id": "C-09", "engine": "perplexity", "question": "수술실 CCTV 있는 성형외과 추천해줘", "prior": "△", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:09", "mention_kind": "none"}
{"id": "C-10", "engine": "perplexity", "question": "여의사한테 수술받을 수 있는 성형외과 있어?", "prior": "△", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:10", "mention_kind": "none"}
{"id": "C-11", "engine": "perplexity", "question": "후기 제일 많은 강남 성형외과 어디야?", "prior": "△", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:12", "mention_kind": "none"}
{"id": "C-12", "engine": "perplexity", "question": "강남언니에서 평점 높은 성형외과 알려줘", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "positive", "negative_type": "none", "aspects": ["reviews"], "evidence": "**뷰성형외과의원** — **9.5점**, 후기 수는 검색 결과에 일부만 보입니다.[3]", "recommendation": "recommended", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:13", "mention_kind": "strong"}
{"id": "C-13", "engine": "perplexity", "question": "20년 넘게 운영한 강남 성형외과 있어?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:15", "mention_kind": "none"}
{"id": "C-14", "engine": "perplexity", "question": "리프팅 잘하는 강남 병원 추천해줘", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:16", "mention_kind": "none"}
{"id": "C-15", "engine": "perplexity", "question": "의사 여러 명 있는 대형 성형외과가 나아? 어디 추천해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:17", "mention_kind": "none"}
{"id": "D1-01", "engine": "perplexity", "question": "뷰성형외과 가슴성형 잘해?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["procedure", "reviews", "safety", "doctors"], "evidence": "가슴성형 병원 선택은 **의사 경력, 재수술 비율, 보형물 선택, 부작용 대응, 실제 전후 사례**를 함께 봐야 합니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:19", "mention_kind": "strong"}
{"id": "D1-02", "engine": "perplexity", "question": "가슴 보형물 종류 뭐가 있어?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:20", "mention_kind": "none"}
{"id": "D1-03", "engine": "perplexity", "question": "모티바랑 멘토 보형물 차이가 뭐야?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:22", "mention_kind": "none"}
{"id": "D1-04", "engine": "perplexity", "question": "가슴성형 수술시간 얼마나 걸려?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:23", "mention_kind": "none"}
{"id": "D1-05", "engine": "perplexity", "question": "가슴성형 회복기간 어느 정도야? 언제 출근해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:24", "mention_kind": "none"}
{"id": "D1-06", "engine": "perplexity", "question": "가슴성형 흉터 어디에 남아?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:25", "mention_kind": "none"}
{"id": "D1-07", "engine": "perplexity", "question": "구형구축이 뭐야? 예방할 수 있어?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:26", "mention_kind": "none"}
{"id": "D1-08", "engine": "perplexity", "question": "가슴 지방이식이랑 보형물 중에 뭐가 나아?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:29", "mention_kind": "none"}
{"id": "D1-09", "engine": "perplexity", "question": "가슴 재수술은 언제 해야 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:30", "mention_kind": "none"}
{"id": "D1-10", "engine": "perplexity", "question": "가슴성형하면 수유에 영향 있어?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:32", "mention_kind": "none"}
{"id": "D1-11", "engine": "perplexity", "question": "가슴성형 후 정기검진 뭐 받아야 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:33", "mention_kind": "none"}
{"id": "D1-12", "engine": "perplexity", "question": "가슴성형 과정 잘 설명해주는 영상 있어?", "prior": "△", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:35", "mention_kind": "none"}
{"id": "D2-01", "engine": "perplexity", "question": "뷰성형외과 눈성형 어때?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "negative", "negative_type": "reputation", "aspects": ["reviews"], "evidence": "다만 제가 확인한 자료만으로는 **수술 결과의 일관된 객관성**까지 판단하긴 어렵고, 커뮤니티에는 상담 경험에 대한 **부정적 의견도 일부** 보입니다.[6]", "recommendation": "cautioned", "confidence": 0.95, "weak_mention": false, "ts": "2026-09-09T10:36:36", "mention_kind": "strong"}
{"id": "D2-02", "engine": "perplexity", "question": "쌍수 절개랑 매몰 차이가 뭐야?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:38", "mention_kind": "none"}
{"id": "D2-03", "engine": "perplexity", "question": "자연유착 쌍수가 뭐야?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:40", "mention_kind": "none"}
{"id": "D2-04", "engine": "perplexity", "question": "눈매교정은 쌍수랑 같이 해야 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:41", "mention_kind": "none"}
{"id": "D2-05", "engine": "perplexity", "question": "앞트임 뒤트임 밑트임 뭐가 달라?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:42", "mention_kind": "none"}
{"id": "D2-06", "engine": "perplexity", "question": "쌍수 회복기간 얼마나 걸려?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:43", "mention_kind": "none"}
{"id": "D2-07", "engine": "perplexity", "question": "눈 재수술은 첫 수술 후 언제부터 가능해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:45", "mention_kind": "none"}
{"id": "D2-08", "engine": "perplexity", "question": "앞트임하면 잘 어울리는 얼굴이 따로 있어?", "prior": "△", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:46", "mention_kind": "none"}
{"id": "D2-09", "engine": "perplexity", "question": "쌍수 붓기 빨리 빼는 법 있어?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:47", "mention_kind": "none"}
{"id": "D3-01", "engine": "perplexity", "question": "뷰성형외과 코성형 어때?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["reviews", "price", "procedure", "doctors", "safety"], "evidence": "평가가 많은 편이고, 후기 평점도 높은 편이라 “코성형 상담 후보”로는 많이들 보는 병원입니다.[2][4][7][13] 다만 지금 주어진 정보만으로는 수술 결과의 객관적 수준까지 단정할 수는 없어서, 후기 수와 평점은 참고하되 집도 의료진, 재수술 경험, 상담의 일관성, 부작용 대응을 같이 확인하는 게 중요합니다.[2][4][7]", "recommendation": "listed", "confidence": 0.95, "weak_mention": false, "ts": "2026-09-09T10:36:49", "mention_kind": "strong"}
{"id": "D3-02", "engine": "perplexity", "question": "코성형 재료 뭐뭐 있어?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:51", "mention_kind": "none"}
{"id": "D3-03", "engine": "perplexity", "question": "실리콘이랑 자가연골 중에 뭐가 나아?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:52", "mention_kind": "none"}
{"id": "D3-04", "engine": "perplexity", "question": "콧대만 할까 코끝까지 같이 할까?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:53", "mention_kind": "none"}
{"id": "D3-05", "engine": "perplexity", "question": "코성형 회복기간 얼마나 돼?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:54", "mention_kind": "none"}
{"id": "D3-06", "engine": "perplexity", "question": "코 재수술은 언제부터 할 수 있어?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:55", "mention_kind": "none"}
{"id": "D3-07", "engine": "perplexity", "question": "휜코 교정도 성형외과에서 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:57", "mention_kind": "none"}
{"id": "D3-08", "engine": "perplexity", "question": "복코 수술 어떻게 하는 거야?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:58", "mention_kind": "none"}
{"id": "D3-09", "engine": "perplexity", "question": "내 얼굴형에 맞는 코 모양 어떻게 정해?", "prior": "△", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:36:59", "mention_kind": "none"}
{"id": "D4-01", "engine": "perplexity", "question": "뷰성형외과 안면윤곽 잘하는 곳 맞아?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["procedure", "reviews", "doctors", "safety", "access"], "evidence": "다만, “잘하는 곳인지”는 객관적으로 단정하기 어렵습니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:01", "mention_kind": "strong"}
{"id": "D4-02", "engine": "perplexity", "question": "광대축소 수술 어떻게 하는 거야?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:02", "mention_kind": "none"}
{"id": "D4-03", "engine": "perplexity", "question": "V라인 사각턱 수술 부작용 없어?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:03", "mention_kind": "none"}
{"id": "D4-04", "engine": "perplexity", "question": "양악수술은 어떤 경우에 해야 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:05", "mention_kind": "none"}
{"id": "D4-05", "engine": "perplexity", "question": "윤곽수술 신경 손상 위험 얼마나 돼?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:07", "mention_kind": "none"}
{"id": "D4-06", "engine": "perplexity", "question": "윤곽수술 회복기간 얼마나 걸려?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:08", "mention_kind": "none"}
{"id": "D4-07", "engine": "perplexity", "question": "윤곽수술 붓기 언제 빠져?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:09", "mention_kind": "none"}
{"id": "D4-08", "engine": "perplexity", "question": "윤곽이랑 코성형 같이 해도 돼?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:11", "mention_kind": "none"}
{"id": "D4-09", "engine": "perplexity", "question": "안면윤곽으로 상 받은 병원 있어?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:12", "mention_kind": "none"}
{"id": "D5-01", "engine": "perplexity", "question": "지방흡입 부위별로 뭐가 달라?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:14", "mention_kind": "none"}
{"id": "D5-02", "engine": "perplexity", "question": "얼굴 지방이식하면 자연스러워?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:15", "mention_kind": "none"}
{"id": "D5-03", "engine": "perplexity", "question": "지방이식 생착률 얼마나 돼?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:16", "mention_kind": "none"}
{"id": "D5-04", "engine": "perplexity", "question": "복부 지방흡입 회복 얼마나 걸려?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:18", "mention_kind": "none"}
{"id": "D5-05", "engine": "perplexity", "question": "뷰성형외과에서 지방성형도 해?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["procedure"], "evidence": "네, **뷰성형외과는 지방성형을 하는 것으로 보입니다**. 검색 결과에 따르면 **지방흡입**, **지방이식**, 그리고 **눈밑지방재배치** 같은 지방 관련 진료 항목이 확인됩니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:19", "mention_kind": "strong"}
{"id": "D5-06", "engine": "perplexity", "question": "지방흡입 흉터 남아?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:20", "mention_kind": "none"}
{"id": "D6-01", "engine": "perplexity", "question": "리프팅 종류별로 뭐가 달라?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:22", "mention_kind": "none"}
{"id": "D6-02", "engine": "perplexity", "question": "실리프팅이랑 안면거상 중에 뭐 해야 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:23", "mention_kind": "none"}
{"id": "D6-03", "engine": "perplexity", "question": "울쎄라 효과 진짜 있어?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:24", "mention_kind": "none"}
{"id": "D6-04", "engine": "perplexity", "question": "리프팅 효과 얼마나 유지돼?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:27", "mention_kind": "none"}
{"id": "D6-05", "engine": "perplexity", "question": "40대인데 안티에이징 뭐부터 시작해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:28", "mention_kind": "none"}
{"id": "D6-06", "engine": "perplexity", "question": "뷰성형외과에서 리프팅도 받을 수 있어?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["procedure"], "evidence": "뷰성형외과는 진료 항목에 **리프팅**이 포함되어 있고, 실제로 **실리프팅**, **레이저 리프팅**, **티타늄 리프팅**, **써마지/울쎄라 계열 리프팅** 관련 안내와 이벤트가 확인됩니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:29", "mention_kind": "strong"}
{"id": "D6-07", "engine": "perplexity", "question": "수술 흉터 관리 어떻게 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:31", "mention_kind": "none"}
{"id": "D7-01", "engine": "perplexity", "question": "재수술 전문 병원은 뭐가 달라?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:32", "mention_kind": "none"}
{"id": "D7-02", "engine": "perplexity", "question": "뷰성형외과 재수술 잘해?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["procedure", "doctors", "reviews", "safety", "access"], "evidence": "뷰성형외과는 재수술 관련 안내와 사례 콘텐츠를 적극적으로 내고 있고, 눈·코 재수술 상담을 다루는 정보가 확인됩니다.", "recommendation": "listed", "confidence": 0.98, "weak_mention": false, "ts": "2026-09-09T10:37:33", "mention_kind": "strong"}
{"id": "D7-03", "engine": "perplexity", "question": "성형 재수술은 왜 하게 되는 거야?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:35", "mention_kind": "none"}
{"id": "D7-04", "engine": "perplexity", "question": "재수술은 처음보다 비용 더 비싸?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:36", "mention_kind": "none"}
{"id": "D7-05", "engine": "perplexity", "question": "재수술 하려면 첫 수술 후 얼마나 기다려야 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:37", "mention_kind": "none"}
{"id": "D7-06", "engine": "perplexity", "question": "다른 병원에서 한 수술도 재수술 상담해줘?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:38", "mention_kind": "none"}
{"id": "E-01", "engine": "perplexity", "question": "성형외과 고를 때 뭘 확인해야 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:40", "mention_kind": "none"}
{"id": "E-02", "engine": "perplexity", "question": "성형수술 마취 사고 안 나려면 어떤 병원 가야 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:41", "mention_kind": "none"}
{"id": "E-03", "engine": "perplexity", "question": "수술실 CCTV 있는지 어떻게 확인해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:42", "mention_kind": "none"}
{"id": "E-04", "engine": "perplexity", "question": "전신마취랑 수면마취 차이가 뭐야?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:43", "mention_kind": "none"}
{"id": "E-05", "engine": "perplexity", "question": "성형외과 전문의인지 어떻게 확인해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:45", "mention_kind": "none"}
{"id": "E-06", "engine": "perplexity", "question": "응급상황 대응 시스템 갖춘 성형외과 어디야?", "prior": "△", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:46", "mention_kind": "none"}
{"id": "E-07", "engine": "perplexity", "question": "성형 부작용 생기면 어떻게 해야 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:48", "mention_kind": "none"}
{"id": "E-08", "engine": "perplexity", "question": "상담실장 말고 의사가 직접 상담해주는 병원 있어?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:49", "mention_kind": "none"}
{"id": "E-09", "engine": "perplexity", "question": "뷰성형외과 안전 시스템 어때?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["safety", "doctors", "procedure"], "evidence": "공개 정보만 놓고 보면 **안전 시스템을 강조하는 병원**으로 볼 수 있지만, 이것이 곧바로 개별 환자에게 충분한 안전을 보장한다는 뜻은 아닙니다.[1][2][7]", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:50", "mention_kind": "strong"}
{"id": "F-01", "engine": "perplexity", "question": "강남 가슴성형 평균 비용 얼마야?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:52", "mention_kind": "none"}
{"id": "F-02", "engine": "perplexity", "question": "뷰성형외과 가슴성형 얼마야?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["price"], "evidence": "뷰성형외과 **가슴성형 비용은 이벤트 기준으로 약 240만~1,155만원 정도**로 확인됩니다.[2][3][4][6][11][12]", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:53", "mention_kind": "strong"}
{"id": "F-03", "engine": "perplexity", "question": "쌍수 가격 보통 얼마 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:54", "mention_kind": "none"}
{"id": "F-04", "engine": "perplexity", "question": "코성형 견적 어느 정도 잡아야 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:57", "mention_kind": "none"}
{"id": "F-05", "engine": "perplexity", "question": "뷰성형외과 지금 하는 이벤트 있어?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["price", "procedure"], "evidence": "네. 현재 검색 결과상 **뷰성형외과 이벤트가 여러 개** 확인됩니다.", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:37:59", "mention_kind": "strong"}
{"id": "F-06", "engine": "perplexity", "question": "성형외과 이벤트가 믿어도 돼? 싼 데는 왜 싸?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:38:00", "mention_kind": "none"}
{"id": "F-07", "engine": "perplexity", "question": "성형 비용 카드 할부나 분할 돼?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:38:01", "mention_kind": "none"}
{"id": "F-08", "engine": "perplexity", "question": "성형 견적 여러 병원 비교하려면 어떻게 해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:38:03", "mention_kind": "none"}
{"id": "G-01", "engine": "perplexity", "question": "뷰성형외과 실제 후기 어때?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["reviews", "access"], "evidence": "뷰성형외과는 **후기 수가 많은 편**이고, 공개된 후기들에서는 **친절함·상담 설명·시설 만족도**가 자주 언급됩니다. 다만 일부 후기에서는 **엘리베이터가 느리다** 같은 병원 이용 편의에 대한 불만도 보입니다.", "recommendation": "listed", "confidence": 0.95, "weak_mention": false, "ts": "2026-09-09T10:38:05", "mention_kind": "strong"}
{"id": "G-02", "engine": "perplexity", "question": "뷰성형외과 부작용 후기나 안 좋은 얘기 있어?", "prior": "✕", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "negative", "negative_type": "reputation", "aspects": ["reviews", "safety"], "evidence": "네. 검색 결과만 보면 **뷰성형외과에 대한 안 좋은 후기나 부작용 언급은 있습니다**.", "recommendation": "cautioned", "confidence": 0.98, "weak_mention": false, "ts": "2026-09-09T10:38:06", "mention_kind": "strong"}
{"id": "G-03", "engine": "perplexity", "question": "강남언니 후기 믿을만해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:38:08", "mention_kind": "none"}
{"id": "G-04", "engine": "perplexity", "question": "뷰성형외과 수술 전후 사진 어디서 봐?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["procedure", "reviews", "access"], "evidence": "뷰성형외과 **수술 전후 사진**은 보통 병원 **공식 홈페이지의 Before & After 페이지**에서 볼 수 있습니다.[1][2] 병원 공식 인스타그램/유튜브/페이스북에도 일부 사례가 올라와 있습니다.[4][7][16]", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:38:09", "mention_kind": "strong"}
{"id": "G-05", "engine": "perplexity", "question": "성형 후기는 어디서 봐야 정확해?", "prior": "✕", "extractor_mentioned": false, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": false, "sentiment": "not_mentioned", "negative_type": "none", "aspects": [], "evidence": "", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:38:10", "mention_kind": "none"}
{"id": "G-06", "engine": "perplexity", "question": "뷰성형외과 인스타그램 있어?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": [], "evidence": "네. 뷰성형외과 인스타그램은 **@viewplastic**으로 확인됩니다.[6][9][10]", "recommendation": "not_applicable", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:38:12", "mention_kind": "strong"}
{"id": "G-07", "engine": "perplexity", "question": "뷰성형외과는 뭘로 유명한 병원이야?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "positive", "negative_type": "none", "aspects": ["doctors", "safety", "procedure", "reviews"], "evidence": "뷰성형외과는 가슴성형, 안면윤곽, 양악수술, 눈·코성형 등 여러 성형 분야를 고르게 하는 곳으로 알려져 있고, 특히 안전 중심 운영과 무사고 기록을 강조해 유명합니다.[1][11][13]", "recommendation": "recommended", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:38:13", "mention_kind": "strong"}
{"id": "G-08", "engine": "perplexity", "question": "가슴성형 후기 많은 병원 어디야?", "prior": "△", "extractor_mentioned": true, "model": "gpt-4.1", "rubric": "v0.3", "mentioned": true, "sentiment": "neutral", "negative_type": "none", "aspects": ["reviews"], "evidence": "**뷰성형외과의원**: 후기 19,342개, 시술 후기 9,999+ 건으로 매우 많습니다.[3]", "recommendation": "listed", "confidence": 1.0, "weak_mention": false, "ts": "2026-09-09T10:38:15", "mention_kind": "strong"}

View File

@ -0,0 +1,176 @@
#!/usr/bin/env python3
"""외국인 관점 영문 Question Bank 답변엔진 실측 러너 (OpenAI / Perplexity).
run_question_bank_openai.py의 영문·해외 위치 변형. 차이점:
- 질문 파일·출력 폴더를 인자로 받는다 (기본: docs/reports/viewclinic/05_global_en)
- OpenAI web_search user_location을 --country/--city로 지정 (기본 US / New York)
- 병원명 추출 프롬프트가 영문 표기 변형(VIEW Plastic Surgery, View Clinic, VIEW Seoul) 같은 병원으로 본다
- 인용 URL을 도메인별로 집계해 "AI가 어떤 표면을 근거로 쓰는가" 기록한다
사용:
python3 scripts/run_question_bank_en.py --engine perplexity
python3 scripts/run_question_bank_en.py --engine openai --country US --city "New York"
python3 scripts/run_question_bank_en.py --engine openai --summarize
"""
import argparse, json, os, re, sys, time
from urllib.parse import urlparse
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import run_question_bank_openai as base # noqa: E402
ROOT = base.ROOT
DEFAULT_DIR = os.path.join(ROOT, "docs", "reports", "viewclinic", "05_global_en")
EXTRACT_PROMPT = """Below is an answer from an AI search engine. Extract the names of plastic surgery clinics / hospitals mentioned, in order of appearance, up to 8.
- Clinic names only (exclude platforms, apps, media, agencies: e.g. RealSelf, Reddit, Gangnam Unni, Bookimed, Whatclinic are NOT clinics)
- "VIEW Plastic Surgery" also appears as View Clinic, VIEW Clinic Korea, VIEW Seoul, VIEW Plastic Surgery Clinic, 뷰성형외과. Treat all as the same clinic and normalize to "VIEW Plastic Surgery".
- Output JSON only: {"clinics": ["Clinic 1", ...], "view_mentioned": true/false, "view_rank": position or null, "view_sentiment": "positive"|"neutral"|"negative"|null}
- view_sentiment: how the answer characterizes VIEW (null if not mentioned)
Answer:
"""
class OpenAIEngineLoc(base.OpenAIEngine):
def __init__(self, model, search_tool, country, city, tz):
super().__init__(model, search_tool)
self.loc = {"type": "approximate", "country": country, "city": city, "timezone": tz}
def ask(self, question):
tool = {"type": self.search_tool, "user_location": self.loc}
try:
resp = base.post_retry("https://api.openai.com/v1/responses",
{"model": self.model, "tools": [tool], "input": question},
{"Authorization": f"Bearer {self.key}"})
except RuntimeError as e:
if self.search_tool == "web_search" and "web_search" in str(e):
self.search_tool = "web_search_preview"
return self.ask(question)
raise
return base.openai_answer_text(resp)
def extract_clinics(answer):
okey = os.environ.get("OPENAI_API_KEY")
if not okey:
sys.exit("OPENAI_API_KEY needed for extraction")
resp = base.post_retry("https://api.openai.com/v1/responses",
{"model": "gpt-4o-mini", "input": EXTRACT_PROMPT + answer[:9000]},
{"Authorization": f"Bearer {okey}"})
text, _ = base.openai_answer_text(resp)
m = re.search(r"\{.*\}", text or "", re.S)
try:
return json.loads(m.group(0)) if m else {"clinics": [], "view_mentioned": False, "view_rank": None, "view_sentiment": None}
except json.JSONDecodeError:
return {"clinics": [], "view_mentioned": False, "view_rank": None, "view_sentiment": None, "parse_error": text[:200]}
def domain(u):
try:
d = urlparse(u).netloc.lower()
return d[4:] if d.startswith("www.") else d
except Exception:
return u
def out_path(d, engine):
return os.path.join(d, f"qb_en_{engine}_results.jsonl")
def load_done(d, engine):
done = {}
p = out_path(d, engine)
if os.path.exists(p):
for line in open(p):
if line.strip():
row = json.loads(line); done[row["id"]] = row
return done
def summarize(d, engine, qfile):
done = load_done(d, engine)
qs = json.load(open(qfile))
cats = {"A": "Brand", "B": "Travel & logistics", "C": "Recommendation & comparison", "D": "Procedure info",
"E": "Pricing", "F": "Safety & trust", "G": "Aftercare & remote follow-up"}
freq, dom_freq, view_dom = {}, {}, {}
per_cat = {}
lines = [f"# VIEW Plastic Surgery EN Question Bank results: {engine}", "",
f"Measured {time.strftime('%Y-%m-%d')} / {len(done)} questions", "",
"| # | Question | VIEW mentioned | Rank | Sentiment | Clinics (in order) | Cited domains |", "|---|---|---|---|---|---|---|"]
for q in qs:
r = done.get(q["id"])
if not r: continue
c = per_cat.setdefault(q["cat"], [0, 0, 0]); c[0] += 1
clinics = [x for x in r.get("clinics", []) if isinstance(x, str)][:8]
for i, x in enumerate(clinics):
freq.setdefault(x, [0, 0]); freq[x][0] += 1
if i == 0: freq[x][1] += 1
doms = sorted({domain(u) for u in r.get("urls", [])})
for dm in doms:
dom_freq[dm] = dom_freq.get(dm, 0) + 1
vm = bool(r.get("view_mentioned"))
if vm:
c[1] += 1
for dm in doms: view_dom[dm] = view_dom.get(dm, 0) + 1
if any("viewplasticsurgery.com" in u or "viewclinic" in u for u in r.get("urls", [])): c[2] += 1
lines.append(f"| {q['id']} | {q['question']} | {'O' if vm else 'X'} | {r.get('view_rank') or '-'} | {r.get('view_sentiment') or '-'} | "
f"{', '.join(clinics) if clinics else '(none)'} | {', '.join(doms[:6])} |")
mentioned = sum(v[1] for v in per_cat.values())
lines += ["", "## Summary", "", f"- VIEW mentioned: {mentioned}/{len(done)} ({mentioned*100//max(len(done),1)}%)", "",
"| Category | Questions | VIEW mentioned | viewplasticsurgery.com cited |", "|---|---|---|---|"]
for k in sorted(per_cat):
n, m, cited = per_cat[k]
lines.append(f"| {k} {cats.get(k,'')} | {n} | {m} ({m*100//n}%) | {cited} ({cited*100//n}%) |")
lines += ["", "### Clinic mention frequency (top 20)", "", "| Clinic | Questions | First position |", "|---|---|---|"]
for name, (cnt, first) in sorted(freq.items(), key=lambda x: -x[1][0])[:20]:
lines.append(f"| {name} | {cnt} | {first} |")
lines += ["", "### Cited domains (top 25)", "", "| Domain | Questions cited | Cited when VIEW mentioned |", "|---|---|---|"]
for dm, cnt in sorted(dom_freq.items(), key=lambda x: -x[1])[:25]:
lines.append(f"| {dm} | {cnt} | {view_dom.get(dm, 0)} |")
out_md = os.path.join(d, f"QB_en_{engine}_results.md")
open(out_md, "w").write("\n".join(lines) + "\n")
json.dump({"per_cat": per_cat, "freq": freq, "dom_freq": dom_freq, "view_dom": view_dom, "n": len(done), "mentioned": mentioned},
open(os.path.join(d, f"QB_en_{engine}_summary.json"), "w"), ensure_ascii=False, indent=1)
print(f"saved: {out_md}")
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--engine", choices=["openai", "perplexity"], default="perplexity")
ap.add_argument("--model", default=None)
ap.add_argument("--search-tool", default="web_search")
ap.add_argument("--country", default="US"); ap.add_argument("--city", default="New York"); ap.add_argument("--tz", default="America/New_York")
ap.add_argument("--dir", default=DEFAULT_DIR)
ap.add_argument("--questions", default=os.path.join(DEFAULT_DIR, "question_bank_en.json"))
ap.add_argument("--limit", type=int, default=0); ap.add_argument("--sleep", type=float, default=1.0)
ap.add_argument("--summarize", action="store_true")
a = ap.parse_args()
base.load_dotenv()
if a.summarize:
summarize(a.dir, a.engine, a.questions); return
eng = OpenAIEngineLoc(a.model or "gpt-4o", a.search_tool, a.country, a.city, a.tz) if a.engine == "openai" \
else base.PerplexityEngine(a.model or "sonar")
os.makedirs(a.dir, exist_ok=True)
qs = json.load(open(a.questions)); done = load_done(a.dir, a.engine)
todo = [q for q in qs if q["id"] not in done]
if a.limit: todo = todo[:a.limit]
print(f"{eng.name}: {len(todo)} to run ({len(done)} done)", flush=True)
with open(out_path(a.dir, a.engine), "a") as f:
for i, q in enumerate(todo, 1):
t0 = time.time()
try:
answer, urls = eng.ask(q["question"])
ext = extract_clinics(answer)
except Exception as e:
print(f" [{i}/{len(todo)}] {q['id']} ERROR {e}", flush=True); time.sleep(5); continue
row = {"id": q["id"], "cat": q["cat"], "question": q["question"], "engine": eng.name,
"answer": answer, "urls": urls, "measured_at": time.strftime("%Y-%m-%dT%H:%M:%S"), **ext}
f.write(json.dumps(row, ensure_ascii=False) + "\n"); f.flush()
print(f" [{i}/{len(todo)}] {q['id']} view={'O' if ext.get('view_mentioned') else 'X'} rank={ext.get('view_rank')} "
f"clinics={ext.get('clinics', [])[:4]} urls={len(urls)} ({time.time()-t0:.0f}s)", flush=True)
time.sleep(a.sleep)
summarize(a.dir, a.engine, a.questions)
if __name__ == "__main__":
main()

291
scripts/sentiment_qb.py Normal file
View File

@ -0,0 +1,291 @@
#!/usr/bin/env python3
"""AI 답변 감성 판정기. 질문 뱅크 실측 결과(JSONL, 답변 원문 포함)를 읽어 대상 병원 언급의 어조를 판정한다.
기준표: docs/AI_ANSWER_SENTIMENT_RUBRIC_v0.3.md · 판정 모델: OpenAI gpt-4.1 (JSON 출력)
사용:
python3 scripts/sentiment_qb.py --clinic 뷰성형외과 --alias "뷰성형외과의원,뷰 성형외과,View Plastic Surgery" \
--in scripts/out/qb_openai_results.jsonl --out scripts/out/qb_sentiment_openai.jsonl
python3 scripts/sentiment_qb.py --summary scripts/out/qb_sentiment_openai.jsonl scripts/out/qb_sentiment_perplexity.jsonl \
--report docs/reports/viewclinic/03_question_bank/Viewclinic_QB_Sentiment.md --calibration docs/reports/viewclinic/03_question_bank/Viewclinic_QB_Sentiment_calibration.xlsx
- 재개 가능: out 파일에 이미 있는 id는 건너뛴다.
- 비용: 답변당 1 호출, 240 $1.5.
- 소비자 UI 자동 조회는 하지 않는다(약관). 공식 API 답변 원문만 판정한다.
"""
import argparse, json, os, random, re, ssl, sys, time, urllib.request, urllib.error, collections
def ssl_context():
# 프레임워크 Python 은 인증서 저장소가 비어 CERTIFICATE_VERIFY_FAILED 가 난다. certifi 가 있으면 그것을, 없으면 시스템 기본을 쓴다.
try:
import certifi; return ssl.create_default_context(cafile=certifi.where())
except ImportError:
return ssl.create_default_context()
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
def load_env():
for d in (ROOT, os.path.join(ROOT, "..")):
p = os.path.join(d, ".env")
if not os.path.exists(p): continue
for line in open(p, encoding="utf-8"):
if "=" in line and not line.strip().startswith("#"):
k, v = line.split("=", 1); os.environ.setdefault(k.strip(), v.strip().strip('"').strip("'"))
SENTIMENTS = ["positive", "neutral", "negative", "mixed", "not_mentioned"]
NEG_TYPES = ["none", "regulatory", "safety", "service", "price", "reputation", "other"]
# 기준표 버전. 판정 결과의 추적용. docs/AI_ANSWER_SENTIMENT_RUBRIC_v0.2.md 와 같이 움직인다.
# v0.2: 1차 보정(29건, 일치 75%) 불일치에서 R1~R5 추가.
# v0.3: 규칙은 R1~R5에서 멈춘다. R4-a·R6을 시험 투입했으나 haewon 라벨 대비 일치율이 93%에서 89%로
# 떨어져(하나 고치면 하나 깨짐) 되돌렸다. n=29에서는 과적합이다. 기준표 §5 참조.
# v0.3의 실제 변경은 결정론적 언급 탐지기(mention_kind)뿐이다. URL 안의 상호와 '리뷰'의 '뷰' 오탐을 없앤다.
RUBRIC_VERSION = "v0.3"
URL_RE = re.compile(r"https?://\S+|\([a-z0-9.-]+\.[a-z]{2,}[^)]*\)", re.I)
def strip_urls(text):
"""URL·인용 링크를 지운다. news.nate.com/view/... 의 'view' 를 병원 언급으로 세지 않기 위해서다."""
return URL_RE.sub(" ", text or "")
def _flex(name):
"""문자 사이 공백을 허용하는 패턴. '뷰성형외과''뷰 성형외과' 로 쓰여도 잡는다."""
return r"\s*".join(re.escape(c) for c in name if not c.isspace())
def mention_kind(answer, clinic, aliases, weak_tokens):
"""strong 정식 상호 / weak 약칭만 / none 언급 없음.
URL 먼저 지우고, 한글 약칭은 '리뷰' '' 처럼 다른 낱말의 일부인 경우를 뺀다."""
a = strip_urls(answer)
for n in [clinic] + list(aliases):
if n and re.search(_flex(n), a, re.I): return "strong"
for t in weak_tokens:
pat = (r"(?<![가-힣A-Za-z])" + re.escape(t) + r"(?![가-힣])") if re.match(r"[가-힣]", t) else r"\b" + re.escape(t) + r"\b"
if re.search(pat, a, re.I): return "weak"
return "none"
ASPECTS = ["doctors", "safety", "price", "reviews", "regulatory", "procedure", "access", "media"]
RECS = ["recommended", "listed", "cautioned", "not_applicable"]
def rubric_prompt(clinic, aliases):
names = ", ".join([clinic] + aliases)
return f"""당신은 AI 답변엔진의 답변에서 특정 병원이 어떤 어조로 언급됐는지 판정하는 심사자입니다.
대상 병원: {clinic} (별칭: {names}). 다른 병원에 대한 평가는 세지 않습니다. 대상 병원 문장만 봅니다.
판정 규칙
- mentioned: 대상 병원(별칭 포함) 답변에 나오면 true.
- sentiment: positive(강점 서술·추천 근거) / neutral(사실 나열·목록 포함·안내) / negative(부정 사실·병원 고유 문제 지목·주의 권고) / mixed(긍정과 부정이 함께) / not_mentioned.
"확인이 필요하다", "직접 상담하라" 같은 일반 주의 문구는 neutral입니다. 병원 고유의 문제를 지목할 때만 negative입니다.
우선순위 규칙 (기준표 v0.2, 1 보정에서 도출. 정의보다 우선합니다)
- R1. 결론 단락이 개별 항목보다 우선합니다. 답변에 종합 평가·결론 단락이 있으면 단락의 어조로 판정합니다. 본문에 나열된 개별 항목의 어조로 판정하지 않습니다.
: 본문에 높은 평점이 있어도 결론이 "평판은 좋은 편이지만 추가 확인이 필요" neutral입니다.
: 본문에 후기 지적 줄이 있어도 종합 평이 "안전성과 전문성을 갖춘 병원으로 평가받고 있습니다" positive입니다.
: 결론이 "객관성까지 판단하긴 어렵고 부정적 의견도 일부 보입니다" negative입니다.
- R2. mixed는 긍정과 부정이 대등하게 병존할 때만 씁니다. 부정 성분이 문장 하나의 부수 언급이면 mixed로 세지 않습니다. 결론이 어느 쪽으로도 기울지 않을 때만 mixed입니다.
- R3. "후기 수가 많다", "인지도가 있다" 규모 서술이며 긍정 평가가 아닙니다. 서술만 있고 병원 고유의 문제 지목이 함께 있으면 mixed가 아니라 negative입니다.
- R4. 평가 축이 있는 목록에 포함되면 positive입니다. 질문이 조건이나 우수성을 묻고(평점이 높은 , 마취과 전문의가 상주하는 , 잘하는 ) 목록에 대상 병원이 들어가면 positive입니다. 조건 없는 단순 나열(위치·진료과목 안내, 지역 병원 열거) neutral입니다.
- R5. 강점·역량 서술은 출처가 병원 홍보라도 positive로 셉니다. 답변이 "안전과 만족을 최우선", "최신 기술과 장비", "마취과 전문의 365일 상주"처럼 강점을 서술하면, 그것이 병원 광고를 인용한 것이라도 어조는 positive입니다.
- negative_type: none / regulatory(공정위·시정명령·의료법 위반·광고 제재·소송) / safety(부작용·사고·안전) / service(응대·불친절) / price(가격 불만) / reputation(후기·평판 논란) / other.
- aspects: {", ".join(ASPECTS)} 해당하는 전부.
- evidence: 판정 근거가 답변 원문 문장 1개를 그대로 인용. 요약하지 않습니다. 언급이 없으면 문자열.
- recommendation: recommended(추천했다) / listed(나열만) / cautioned(주의를 붙였다) / not_applicable.
- confidence: 0~1.
JSON만 출력합니다. : mentioned, sentiment, negative_type, aspects, evidence, recommendation, confidence."""
def judge(key, model, system, question, answer, retries=4):
body = {"model": model, "temperature": 0,
"response_format": {"type": "json_object"},
"messages": [{"role": "system", "content": system},
{"role": "user", "content": f"[질문]\n{question}\n\n[답변]\n{answer[:6000]}"}]}
req = urllib.request.Request("https://api.openai.com/v1/chat/completions", data=json.dumps(body).encode(),
headers={"Authorization": f"Bearer {key}", "Content-Type": "application/json"})
for i in range(retries):
try:
with urllib.request.urlopen(req, timeout=90, context=ssl_context()) as r:
j = json.load(r)
out = json.loads(j["choices"][0]["message"]["content"])
usage = j.get("usage", {})
return out, usage
except urllib.error.HTTPError as e:
if e.code in (429, 500, 502, 503) and i < retries - 1:
time.sleep(2 * (i + 1)); continue
raise RuntimeError(f"HTTP {e.code}: {e.read()[:200]}")
except (json.JSONDecodeError, KeyError) as e:
if i < retries - 1: continue
raise RuntimeError(f"파싱 실패: {e}")
def normalize(o, mentioned_hint):
s = o.get("sentiment") if o.get("sentiment") in SENTIMENTS else "neutral"
m = bool(o.get("mentioned", mentioned_hint))
if not m: s = "not_mentioned"
return {"mentioned": m, "sentiment": s,
"negative_type": o.get("negative_type") if o.get("negative_type") in NEG_TYPES else ("none" if s not in ("negative", "mixed") else "other"),
"aspects": [a for a in (o.get("aspects") or []) if a in ASPECTS],
"evidence": str(o.get("evidence") or "")[:400],
"recommendation": o.get("recommendation") if o.get("recommendation") in RECS else ("not_applicable" if not m else "listed"),
"confidence": float(o.get("confidence") or 0)}
def run(args):
load_env()
key = os.environ.get("OPENAI_API_KEY") or sys.exit("OPENAI_API_KEY 필요 (.env)")
aliases = [a.strip() for a in (args.alias or "").split(",") if a.strip()]
weak_tokens = [w.strip() for w in (args.weak or "").split(",") if w.strip()]
system = rubric_prompt(args.clinic, aliases)
rows = [json.loads(l) for l in open(args.inp, encoding="utf-8") if l.strip()]
done = {}
if os.path.exists(args.out):
for l in open(args.out, encoding="utf-8"):
if l.strip(): r = json.loads(l); done[r["id"]] = r
print(f"입력 {len(rows)}건 · 이미 판정 {len(done)}건 · 모델 {args.model}")
tokens = collections.Counter()
with open(args.out, "a", encoding="utf-8") as f:
for i, r in enumerate(rows):
if r["id"] in done: continue
kind = mention_kind(r.get("answer", ""), args.clinic, aliases, weak_tokens)
hint = kind != "none"
out, usage = judge(key, args.model, system, r["question"], r.get("answer", ""))
n = normalize(out, hint)
# 탐지기가 none 이면 판정기 판단보다 우선한다. 상호가 아예 없는 답변을 언급으로 셀 수 없다.
if kind == "none" and n["mentioned"]:
n = normalize({"mentioned": False}, False)
# 약한 언급: 정식 상호 없이 영문 약칭만 나온 경우. 점수에는 넣되 표시하고 기준표 §6에서 포함 여부를 정한다
n["weak_mention"] = kind == "weak" and bool(n["mentioned"])
tokens["in"] += usage.get("prompt_tokens", 0); tokens["out"] += usage.get("completion_tokens", 0)
row = {"id": r["id"], "engine": r.get("engine"), "question": r["question"], "prior": r.get("prior"),
"extractor_mentioned": hint, "model": args.model, "rubric": RUBRIC_VERSION, **n, "ts": time.strftime("%Y-%m-%dT%H:%M:%S")}
f.write(json.dumps(row, ensure_ascii=False) + "\n"); f.flush()
print(f" {r['id']} {n['sentiment']:<13} {n['negative_type']:<10} {n['recommendation']:<14} {n['evidence'][:50]}")
time.sleep(0.3)
# gpt-4.1 단가 $2/M in · $8/M out
cost = tokens["in"] / 1e6 * 2 + tokens["out"] / 1e6 * 8
print(f"완료 → {args.out} · 토큰 in {tokens['in']} out {tokens['out']} · 약 ${cost:.2f}")
def score(rs):
m = [r for r in rs if r["mentioned"]]
if not m: return None
w = {"positive": 100, "neutral": 50, "mixed": 25, "negative": 0}
c = collections.Counter(r["sentiment"] for r in m)
return {"answers": len(rs), "mentioned": len(m),
"score": round(sum(w.get(r["sentiment"], 50) for r in m) / len(m), 1),
"positive": c["positive"], "neutral": c["neutral"], "mixed": c["mixed"], "negative": c["negative"],
"negative_rate": round((c["negative"] + c["mixed"]) / len(m) * 100, 1),
"regulatory_rate": round(sum(1 for r in m if r["negative_type"] == "regulatory") / len(m) * 100, 1),
"recommended_rate": round(sum(1 for r in m if r["recommendation"] == "recommended") / len(m) * 100, 1),
"aspects": collections.Counter(a for r in m for a in r["aspects"]).most_common(8)}
def summary(args):
allrows = []
for p in args.summary:
allrows += [json.loads(l) for l in open(p, encoding="utf-8") if l.strip()]
is_brand = lambda r: str(r["id"]).split("-")[0] in ("A", "B") # 질문 뱅크 A·B = 브랜드 질문
lines = [f"# AI 답변 감성 판정 결과 · {args.clinic}", "",
f"판정 {time.strftime('%Y-%m-%d')} · 기준표 {RUBRIC_VERSION}(`docs/AI_ANSWER_SENTIMENT_RUBRIC_{RUBRIC_VERSION}.md`) · 모델 {allrows[0]['model'] if allrows else ''} · 답변 {len(allrows)}", "",
"감성 점수 = (positive×100 + neutral×50 + mixed×25 + negative×0) ÷ 언급된 답변 수. 규제 언급률과 추천율은 언급된 답변 기준.", "",
"## 1. 엔진별", "", "| 엔진 | 질문군 | 답변 | 언급 | 감성 점수 | 긍정 | 중립 | 혼합 | 부정 | 부정 비율 | 규제 언급률 | 추천율 |", "|---|---|---|---|---|---|---|---|---|---|---|---|"]
engines = sorted({r["engine"] for r in allrows})
for e in engines:
for label, flt in (("전체", lambda r: True), ("브랜드(A·B)", is_brand), ("논브랜드", lambda r: not is_brand(r))):
s = score([r for r in allrows if r["engine"] == e and flt(r)])
if s: lines.append(f"| {e} | {label} | {s['answers']} | {s['mentioned']} | **{s['score']}** | {s['positive']} | {s['neutral']} | {s['mixed']} | {s['negative']} | {s['negative_rate']}% | {s['regulatory_rate']}% | {s['recommended_rate']}% |")
s = score(allrows)
if s: lines += ["", f"전체 합산: 언급 {s['mentioned']}/{s['answers']} · 감성 점수 **{s['score']}** · 부정 비율 {s['negative_rate']}% · 규제 언급률 {s['regulatory_rate']}% · 추천율 {s['recommended_rate']}%"]
# 약한 언급(정식 상호 없이 영문 약칭만)은 포함 여부가 미결이므로 제외한 점수를 함께 낸다. 기준표 §6.
weak = [r for r in allrows if r.get("weak_mention")]
if weak:
W = {"positive": 100, "neutral": 50, "mixed": 25, "negative": 0}
strong = [r for r in allrows if r["sentiment"] != "not_mentioned" and not r.get("weak_mention")]
ids = ", ".join(f"{r['id']}({r['engine']})" for r in weak)
lines += ["", f"약한 언급 {len(weak)}건({ids})은 정식 상호 없이 영문 약칭만 나온 답변이다. 이를 빼면 언급 {len(strong)}건 · 감성 점수 **{round(sum(W[r['sentiment']] for r in strong) / len(strong), 1)}**. 포함 여부는 기준표 §6 미결이다."]
lines += ["", "## 2. 측면 태그 (언급된 답변)", ""]
if s: lines += [f"- {a}: {n}" for a, n in s["aspects"]]
negs = [r for r in allrows if r["sentiment"] in ("negative", "mixed")]
lines += ["", f"## 3. 부정·혼합 판정 전건 ({len(negs)}건)", "", "| id | 엔진 | 판정 | 종류 | 질문 | 근거 문장 |", "|---|---|---|---|---|---|"]
for r in negs: lines.append(f"| {r['id']} | {r['engine']} | {r['sentiment']} | {r['negative_type']} | {r['question'][:40]} | {r['evidence'][:120]} |")
pos = [r for r in allrows if r["sentiment"] == "positive" and not is_brand(r)]
lines += ["", f"## 4. 논브랜드 질문에서 긍정 언급 ({len(pos)}건, 가장 가치 있는 신호)", "", "| id | 엔진 | 추천 | 질문 | 근거 문장 |", "|---|---|---|---|---|"]
for r in pos: lines.append(f"| {r['id']} | {r['engine']} | {r['recommendation']} | {r['question'][:40]} | {r['evidence'][:120]} |")
dis = [r for r in allrows if r["mentioned"] != r["extractor_mentioned"]]
lines += ["", f"## 5. 언급 판정 불일치 (판정기 vs 추출기) {len(dis)}", ""]
lines += [f"- {r['id']} {r['engine']}: 판정기 {r['mentioned']} / 추출기 {r['extractor_mentioned']} · {r['evidence'][:80]}" for r in dis[:30]]
lines += ["", "## 6. 측정 가능 범위", "",
"- 재는 것: 질문 뱅크 문항에 대한 공식 API 답변 안에서 대상 병원 문장의 어조. 엔진은 ChatGPT(gpt-4o + 웹 검색)·Perplexity(sonar).",
"- 재지 않는 것: 소비자 화면(chatgpt.com 등)의 실제 답변. 약관상 자동 조회를 하지 않으므로 API 답변과 화면 답변은 다를 수 있다.",
"- 재지 않는 것: Google AI Overview·네이버 AI 브리핑·Gemini 의 어조. 다음 회차에 엔진을 추가할 때 같은 기준표로 잰다.",
"- 한계: 판정기는 언어 모델이다. 보정(§7) 전 점수는 참고값이고, 보정 후에도 문항 수(언급 84건)가 적어 ±10점은 우연 범위로 본다."]
# --calibration 없이 리포트만 다시 만드는 경로가 정상 사용이다(haewon 라벨을 지우지 않기 위해).
# 그때는 새 보정 표본을 만들지 않았으므로 1차 보정 결과를 그대로 적는다.
if args.calibration:
lines += ["", "## 7. 보정", "", f"무작위 30건을 `{os.path.basename(args.calibration)}`에 담았다(판정기 값은 숨김 시트). haewon이 sentiment·negative_type을 적으면 `--agreement` 로 일치율을 낸다. 80% 이상이면 기준표 확정."]
else:
lines += ["", "## 7. 보정", "",
f"기준표 `{RUBRIC_VERSION}` 로 판정했다. 1차 보정(2026-09-09)에서 haewon 라벨 29건 대비 v0.1 일치율은 75%로 기준선 80%에 미달했고, 불일치 7건에서 규칙 R1~R5를 뽑아 판정기에 반영한 것이 이 회차다.",
"",
"같은 30건으로 다시 잰 일치율은 규칙을 그 표본에 맞춰 고친 결과이므로 확정 근거가 아니다. 기준표 확정은 새로 뽑은 30건의 2차 보정으로 한다. 자세한 이력과 한계는 `docs/AI_ANSWER_SENTIMENT_RUBRIC_v0.2.md` §5에 있다."]
os.makedirs(os.path.dirname(args.report), exist_ok=True)
open(args.report, "w", encoding="utf-8").write("\n".join(lines) + "\n")
print(f"리포트 → {args.report}")
if args.calibration: write_calibration(allrows, args.calibration)
def write_calibration(rows, path):
try:
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, PatternFill
except ImportError:
sys.exit("openpyxl 필요: pip install openpyxl")
random.seed(20260908)
m = [r for r in rows if r["mentioned"]]
sample = random.sample(m, min(30, len(m)))
wb = Workbook(); ws = wb.active; ws.title = "라벨링"
# 답변 전문을 붙인다(근거 문장만 보고 판정하면 안 된다). 원본 QB 결과에서 id+engine 으로 찾는다.
full = {}
for eng in ("openai", "perplexity"):
fp = os.path.join(ROOT, "scripts", "out", f"qb_{eng}_results.jsonl")
if os.path.exists(fp):
for l in open(fp, encoding="utf-8"):
if l.strip(): q = json.loads(l); full[(q["id"], eng)] = q.get("answer", "")
head = ["id", "엔진", "질문", "답변 전문", "판정기가 인용한 근거 문장", "haewon sentiment\n(positive / neutral / negative / mixed / not_mentioned)", "haewon negative_type\n(none / regulatory / safety / service / price / reputation / other)", "메모"]
ws.append(head)
for c in ws[1]: c.font = Font(bold=True, color="FFFFFF"); c.fill = PatternFill("solid", fgColor="0A1128"); c.alignment = Alignment(wrap_text=True, vertical="top")
ws.row_dimensions[1].height = 48
for r in sample: ws.append([r["id"], r["engine"], r["question"], full.get((r["id"], r["engine"]), ""), r["evidence"], "", "", ""])
for col, w in zip("ABCDEFGH", (8, 11, 34, 90, 46, 22, 24, 24)): ws.column_dimensions[col].width = w
from openpyxl.worksheet.datavalidation import DataValidation
dv1 = DataValidation(type="list", formula1='"positive,neutral,negative,mixed,not_mentioned"', allow_blank=True); dv2 = DataValidation(type="list", formula1='"none,regulatory,safety,service,price,reputation,other"', allow_blank=True)
ws.add_data_validation(dv1); ws.add_data_validation(dv2); dv1.add(f"F2:F{len(sample)+1}"); dv2.add(f"G2:G{len(sample)+1}")
ws.freeze_panes = "D2"
guide = wb.create_sheet("기준 요약")
for row in [["", "언제"], ["positive", "병원의 강점을 서술하거나 추천 근거로 든다"], ["neutral", "사실 나열, 목록 포함, 위치·진료과목 안내. '확인이 필요하다', '직접 상담하라' 같은 일반 주의 문구도 neutral"], ["negative", "부정 사실을 서술하거나 병원 고유의 문제를 지목해 주의를 권한다(공정위, 부작용 사례, 후기 논란)"], ["mixed", "긍정과 부정이 한 답변에 함께 있다"], ["", ""], ["negative_type", "부정·혼합일 때만. regulatory 공정위·시정명령·의료법 / safety 부작용·사고 / service 응대 / price 가격 불만 / reputation 후기·평판 논란 / other. 긍정·중립이면 none"], ["", ""], ["주의", "다른 병원에 대한 평가는 세지 않는다. 뷰성형외과 문장만 본다. 답변 전문(D열)을 읽고 판단한다. 근거 문장(E열)은 참고만"]]: guide.append(row)
guide.column_dimensions["A"].width = 16; guide.column_dimensions["B"].width = 110
for row in guide.iter_rows():
for c in row: c.alignment = Alignment(wrap_text=True, vertical="top")
for row in ws.iter_rows(min_row=2):
for c in row: c.alignment = Alignment(wrap_text=True, vertical="top")
hid = wb.create_sheet("판정기(숨김)"); hid.sheet_state = "hidden"
hid.append(["id", "engine", "sentiment", "negative_type", "recommendation", "confidence"])
for r in sample: hid.append([r["id"], r["engine"], r["sentiment"], r["negative_type"], r["recommendation"], r["confidence"]])
os.makedirs(os.path.dirname(path), exist_ok=True); wb.save(path)
print(f"보정 샘플 {len(sample)}건 → {path}")
def agreement(args):
from openpyxl import load_workbook
wb = load_workbook(args.agreement)
human = {(r[0], r[1]): (str(r[5] or "").strip().lower(), str(r[6] or "").strip().lower()) for r in wb["라벨링"].iter_rows(min_row=2, values_only=True) if r[0]}
model = {(r[0], r[1]): (r[2], r[3]) for r in wb["판정기(숨김)"].iter_rows(min_row=2, values_only=True) if r[0]}
labeled = [k for k, v in human.items() if v[0]]
if not labeled: sys.exit("haewon 라벨이 비어 있습니다")
s_ok = sum(1 for k in labeled if human[k][0] == model[k][0]); n_ok = sum(1 for k in labeled if human[k][1] and human[k][1] == model[k][1])
n_lab = sum(1 for k in labeled if human[k][1])
print(f"라벨 {len(labeled)}건 · sentiment 일치 {s_ok}/{len(labeled)} = {s_ok*100//len(labeled)}% · negative_type 일치 {n_ok}/{n_lab}")
for k in labeled:
if human[k][0] != model[k][0]: print(f" 불일치 {k[0]} {k[1]}: haewon {human[k][0]} / 판정기 {model[k][0]}")
if __name__ == "__main__":
ap = argparse.ArgumentParser()
ap.add_argument("--clinic", default="뷰성형외과"); ap.add_argument("--alias", default="뷰성형외과의원,뷰 성형외과,View Plastic Surgery,viewclinic")
ap.add_argument("--weak", default="View,뷰", help="정식 상호 없이 이것만 나오면 약한 언급으로 표시한다")
ap.add_argument("--in", dest="inp"); ap.add_argument("--out"); ap.add_argument("--model", default="gpt-4.1")
ap.add_argument("--summary", nargs="*"); ap.add_argument("--report"); ap.add_argument("--calibration"); ap.add_argument("--agreement")
a = ap.parse_args()
if a.agreement: agreement(a)
elif a.summary: summary(a)
elif a.inp and a.out: run(a)
else: ap.print_help()

View File

@ -16,9 +16,7 @@
"a",
"a",
"a",
"div.langswitch",
"a.on",
"a",
"a.lang-switch",
"a.cta",
"main",
"section.hero-light",
@ -259,6 +257,7 @@
"a",
"a",
"a",
"a",
"div",
"p",
"img",
@ -288,9 +287,7 @@
"a",
"a",
"a",
"div.langswitch",
"a.on",
"a",
"a.lang-switch",
"a.cta",
"div.backbar-wrap",
"div.backbar.wrap-wide",
@ -488,6 +485,7 @@
"a",
"a",
"a",
"a",
"div",
"p",
"img",
@ -517,9 +515,7 @@
"a",
"a",
"a",
"div.langswitch",
"a.on",
"a",
"a.lang-switch",
"a.cta",
"div.backbar-wrap",
"div.backbar.wrap-wide",
@ -743,6 +739,7 @@
"a",
"a",
"a",
"a",
"div",
"p",
"img",

View File

@ -0,0 +1,35 @@
{
"_comment": "영어 페이지용 병원 사실 번역. 값의 원본은 factSheet.json 이고 여기에는 영어 표기만 둔다. 숫자·전화·URL 은 factSheet 에서 그대로 읽는다. 빈 값은 영어 페이지에서 '확인' 대신 항목을 숨긴다.",
"name": "View Plastic Surgery Clinic",
"shortName": "View Plastic Surgery",
"kind": "plastic surgery clinic",
"areaLabel": "Sinnonhyeon Station, Gangnam, Seoul",
"address": {
"full": "107 Bongeunsa-ro, Gangnam-gu, Seoul (View Plastic Surgery Building)",
"mapQuery": "View Plastic Surgery Seoul Bongeunsa-ro 107"
},
"transit": "Line 9, Sinnonhyeon Station, Exit 3. Within 50 m of the exit. The whole building is the clinic, so you can see it from the exit.",
"airport": "From Incheon Airport: take the AREX airport railroad to Gimpo Airport Station, then Line 9 express to Sinnonhyeon Station with no transfer. About 60 to 70 minutes. A taxi takes 60 to 90 minutes depending on traffic.",
"parking": "The street in front of the main entrance is one-way. Enter from the pharmacy alley and turn right at the crossroads. The car park is on the left.",
"hoursDays": {
"월·화·수·목": "Mon to Thu",
"금": "Fri",
"토": "Sat",
"일·공휴일": "Sun and public holidays"
},
"hoursClosed": "Closed",
"building": "19-storey clinic building (B4 to 15F). Consultation 4F to 5F, examination B1, surgery 11F to 14F, inpatient wards 8F and 10F, dental clinic 15F.",
"arrival": "Go to the information desk on the 1st floor first. Consultation is on 4F to 5F, VIP consultation on 3F, and pre-operative tests at the B1 examination center.",
"specialties": [
"Breast augmentation",
"Facial contouring",
"Jaw surgery",
"Eyelid surgery",
"Rhinoplasty",
"Liposuction and fat grafting",
"Anti-aging and lifting",
"Men's plastic surgery",
"Dermatology",
"Hair transplant"
]
}

View File

@ -1,6 +1,8 @@
---
import '../styles/global.css';
import { SITE_NAME, SITE_TAGLINE, INDEXABLE, fact, site as S, surface, reservationUrl, editor, has, v } from '../lib';
import { UI, switchHref } from '../lib/i18n';
import EN from '../data/factSheetEn.json';
const ed = editor();
const f = fact as Record<string, any>;
@ -11,41 +13,28 @@ interface Props {
ogImage?: string;
type?: 'website' | 'article';
noindex?: boolean;
/** 페이지 언어. 외국인 환자용 영문 페이지(/en/*)에서 'en' 을 넘긴다. 기본은 한국어다. */
lang?: 'ko' | 'en';
alternates?: { lang: string; href: string }[];
}
const { title, description, jsonLd, ogImage = S.buildingImage?.src || '/favicon.svg', type = 'website', noindex = false, lang = 'ko' } = Astro.props;
const isEn = lang === 'en';
// 머리말·꼬리말 문구. 법적 고지(지원 관계·부작용)는 번역하지 않는다. 아래 주석 참조.
const T = isEn
? { nav: [['/posts', 'Questions'], ['/videos', 'Doctors'], ['/newsroom', 'Newsroom'], ['/en/plan', 'Recovery Planner'], ['/about', 'About']], cta: 'Book a Consultation', supporters: 'SUPPORTERS', back: 'Back', top: 'Back to top', sample: 'This is a sample site, not yet public.' }
: { nav: [['/posts', '상담 전 질문'], ['/videos', '의료진 영상'], ['/newsroom', '뉴스룸'], ['/visit', '방문 안내'], ['/plan', '회복 일정'], ['/about', '매체 소개']], cta: '상담 예약', supporters: '서포터즈', back: '이전 페이지', top: '맨 위로', sample: '샘플 사이트입니다. 정식 공개 전입니다.' };
// 언어 전환. 같은 내용의 짝이 있는 페이지만 서로 잇고, 없으면 그 언어의 입구로 보낸다.
// 영문 페이지가 늘어나면 이 표에 줄만 추가한다.
const PAIRS: Record<string, string> = { '/plan': '/en/plan', '/visit': '/en/plan' };
const KO_ENTRY = '/';
const EN_ENTRY = '/en/plan';
const path = (Astro.url.pathname.replace(/\.html$/, '').replace(/\/index$/, '/').replace(/\/$/, '') || '/');
const koPair = Object.entries(PAIRS).find(([, en]) => en === path)?.[0];
const otherHref = isEn ? (koPair ?? KO_ENTRY) : (PAIRS[path] ?? EN_ENTRY);
// 짝이 없으면 같은 글의 번역본으로 가는 것이 아니므로 그렇게 말한다.
const otherExact = isEn ? Boolean(koPair) : Boolean(PAIRS[path]);
// 영문 페이지의 예약 버튼은 병원의 외국인용 영문 사이트로 보낸다(factSheet.urlEn).
// 한국어 예약 페이지로 보내면 영어로 온 사람이 한국어 화면을 만난다.
const ctaHref = isEn
? ((f as Record<string, any>).reservationUrlEn || (f as Record<string, any>).urlEn || reservationUrl || '/en/plan')
: (reservationUrl || '/visit');
// 의료광고 고지는 규정 대상이라 임의로 번역하지 않는다(의료법 56조·추천보증 심사지침).
// 병원이 영문 문구를 확정해 site.json 의 sponsorNoticeEn / factSheet 의 sideEffectNoticeEn 에 넣기 전까지는
// 한국어 원문을 그대로 싣고 확인 대기임을 밝힌다.
const sponsorEn: string = (S as Record<string, any>).sponsorNoticeEn || '';
const sideEffectEn: string = (f as Record<string, any>).sideEffectNoticeEn || '';
const { title, description, jsonLd, ogImage = S.buildingImage?.src || '/favicon.svg', type = 'website', noindex = false, lang = 'ko', alternates = [] } = Astro.props;
const site = Astro.site?.toString().replace(/\/$/, '') ?? '';
const cleanPath = Astro.url.pathname.replace(/\/index\.html$/, '/').replace(/\.html$/, '');
const canonical = (new URL(cleanPath, Astro.site).toString().replace(/\/$/, '') || site);
const u = UI[lang];
const other = lang === 'ko' ? 'en' : 'ko';
const switchTo = switchHref(Astro.url.pathname, other);
const homeHref = lang === 'en' ? '/en' : '/';
const isHome = ['/', '', '/index.html', '/index', '/en', '/en/index.html', '/en/index'].includes(Astro.url.pathname.replace(/\/$/, '') || '/');
// GA4: site.json 의 ga4MeasurementId(G-XXXX) 가 있을 때만 태그를 넣는다. 키 이벤트는 data/ai_channels.json conversion_events 와 같은 이름(click_tel · click_reservation · click_clinic_site · click_map).
const GA4: string = /^G-[A-Z0-9]{6,}$/.test(String((S as Record<string, any>).ga4MeasurementId ?? '')) ? String((S as Record<string, any>).ga4MeasurementId) : '';
// 의료광고 고지는 규정 대상이라 임의로 번역하지 않는다(의료법 56조·추천보증 심사지침).
// 병원이 영문 문구를 확정해 site.json 의 sponsorNoticeEn / factSheet 의 sideEffectNoticeEn 에 넣기 전까지는
// 한국어 원문을 그대로 싣고 확인 대기임을 밝힌다. i18n.ts 의 영문 foot_sponsor·foot_side 는 이 자리에 쓰지 않는다.
const sponsorEn: string = (S as Record<string, any>).sponsorNoticeEn || '';
const sideEffectEn: string = (f as Record<string, any>).sideEffectNoticeEn || '';
const noticePending = lang === 'en' && !sponsorEn;
const sponsorText = (lang === 'en' && sponsorEn) ? sponsorEn : UI.ko.foot_sponsor.replace(/\{clinic\}/g, v(f.shortName, '병원')).replace('{editor}', ed.name);
const sideEffectText = (lang === 'en' && sideEffectEn) ? sideEffectEn : fact.sideEffectNotice;
const ld = jsonLd ? JSON.stringify({ '@context': 'https://schema.org', ...(Array.isArray(jsonLd) ? { '@graph': jsonLd } : jsonLd) }) : null;
---
<!doctype html>
@ -63,7 +52,8 @@ const ld = jsonLd ? JSON.stringify({ '@context': 'https://schema.org', ...(Array
<meta property="og:description" content={description} />
<meta property="og:url" content={canonical} />
<meta property="og:image" content={new URL(ogImage, Astro.site).toString()} />
<meta property="og:locale" content={isEn ? "en_US" : "ko_KR"} />
<meta property="og:locale" content={lang === 'en' ? 'en_US' : 'ko_KR'} />
{alternates.map((a) => <link rel="alternate" hreflang={a.lang} href={`${site}${a.href}`} />)}
<link rel="stylesheet" as="style" crossorigin href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
@ -74,32 +64,44 @@ const ld = jsonLd ? JSON.stringify({ '@context': 'https://schema.org', ...(Array
document.addEventListener('click',function(e){var a=e.target.closest&&e.target.closest('a');if(!a)return;var h=a.getAttribute('href')||'';var ev=h.indexOf('tel:')===0?'click_tel':a.dataset.ga==='reservation'||a.classList.contains('cta')?'click_reservation':a.dataset.ga==='clinic-site'?'click_clinic_site':a.dataset.ga==='map'?'click_map':null;if(ev)gtag('event',ev,{link_url:h,page_path:location.pathname});},true);`} />}
</head>
<body>
{!INDEXABLE && <div class="sample-banner">{T.sample}</div>}
{!INDEXABLE && <div class="sample-banner">{u.sample}</div>}
<header class="site-header">
<div class="wrap-wide bar">
<a class="brand" href="/">{has(S.logo?.src) ? <img class="brand-logo" src={S.logo.src} alt={S.logo.alt} width={S.logo.width} height={S.logo.height} /> : <span class="brand-logo brand-name">{v(f.shortName, '병원')}</span>}<span class="brand-sep" aria-hidden="true"></span><span class="brand-text">{T.supporters} <small>{S.siteNameEn || 'SUPPORTERS'}</small></span></a>
<a class="brand" href={homeHref}>{has(S.logo?.src) ? <img class="brand-logo" src={S.logo.src} alt={S.logo.alt} width={S.logo.width} height={S.logo.height} /> : <span class="brand-logo brand-name">{v(f.shortName, '병원')}</span>}<span class="brand-sep" aria-hidden="true"></span><span class="brand-text">{u.brand} <small>{S.siteNameEn || 'SUPPORTERS'}</small></span></a>
<div class="right">
<nav class="nav">
{T.nav.map(([href, label]) => <a href={href}>{label}</a>)}
{lang === 'ko' ? (
<>
<a href="/posts">{u.nav_posts}</a>
<a href="/videos">{u.nav_videos}</a>
<a href="/newsroom">{u.nav_news}</a>
<a href="/visit">{u.nav_visit}</a>
<a href="/plan">{u.nav_plan}</a>
<a href="/about">{u.nav_about}</a>
</>
) : (
<>
<a href="/en">{u.nav_home}</a>
<a href="/en/plan">{u.nav_plan}</a>
<a href="/en#visit">{u.nav_visit}</a>
<a href="/en#clinic">{u.nav_clinic}</a>
</>
)}
</nav>
<div class="langswitch" role="group" aria-label={isEn ? 'Language' : '언어'}>
<a href={isEn ? otherHref : path} hreflang="ko" aria-current={!isEn ? 'true' : undefined} class={!isEn ? 'on' : ''}>KO</a>
<a href={isEn ? path : otherHref} hreflang="en" aria-current={isEn ? 'true' : undefined} class={isEn ? 'on' : ''}
title={isEn || otherExact ? undefined : 'English pages are limited. This goes to the English section.'}>EN</a>
</div>
<a class="cta" href={ctaHref} rel="noopener">{T.cta}</a>
<a class="lang-switch" href={switchTo} aria-label={u.switchAria} hreflang={other} lang={other}>{u.switchLabel}</a>
<a class="cta" href={reservationUrl || '/visit'} rel="noopener">{u.cta}</a>
</div>
</div>
</header>
{!['/', '', '/index.html', '/index'].includes(Astro.url.pathname.replace(/\/$/, '') || '/') && (
{!isHome && (
<div class="backbar-wrap"><div class="wrap-wide backbar">
<a href="/" class="backbtn" id="backbtn" aria-label={T.back}><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M15.5 4.5 8 12l7.5 7.5 1.8-1.8L11.6 12l5.7-5.7z"/></svg>{T.back}</a>
<a href={homeHref} class="backbtn" id="backbtn" aria-label={u.backAria}><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M15.5 4.5 8 12l7.5 7.5 1.8-1.8L11.6 12l5.7-5.7z"/></svg>{u.back}</a>
</div></div>
)}
<main>
<slot />
</main>
<button type="button" class="totop" id="totop" aria-label={T.top}><svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 5 4.5 12.5l1.8 1.8L11 9.6V20h2V9.6l4.7 4.7 1.8-1.8z"/></svg></button>
<button type="button" class="totop" id="totop" aria-label={u.totop}><svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 5 4.5 12.5l1.8 1.8L11 9.6V20h2V9.6l4.7 4.7 1.8-1.8z"/></svg></button>
<script>
const back = document.getElementById('backbtn');
if (back) back.addEventListener('click', (e) => { if (history.length > 1 && document.referrer && new URL(document.referrer).origin === location.origin) { e.preventDefault(); history.back(); } });
@ -112,16 +114,20 @@ document.addEventListener('click',function(e){var a=e.target.closest&&e.target.c
<div class="wrap-wide cols">
<div>
<p><strong>{SITE_NAME}</strong> · {SITE_TAGLINE}</p>
{isEn && !sponsorEn && <p class="notice-pending">Korean original below. The English wording of these notices is pending clinic approval.</p>}
<p>{isEn && sponsorEn ? sponsorEn : <>이 매체는 {v(f.shortName, '병원')}의 지원을 받아 서포터즈가 운영합니다. 글의 의학적 내용은 {v(f.shortName, '병원')} 담당 원장의 검토를 거쳐 표시하며, 검토 전 글은 "의학 검토 대기"로 표시합니다. 편집 책임 {ed.name}.</>}</p>
<p>{isEn && sideEffectEn ? sideEffectEn : fact.sideEffectNotice}</p>
<p><a href="/clinic">병원 정보</a> · <a href="/visit">방문 안내</a> · <a href="/about">이 사이트에 대해</a> · <a href="/corrections">정정 기록</a> · <a href={ed.email ? `mailto:${ed.email}` : '/corrections'}>정정 요청</a> · <a href="/editorial">편집 기준 (운영자용)</a></p>
{noticePending && <p class="notice-pending">The English wording of these notices is pending clinic approval. The Korean original is shown below.</p>}
<p>{sponsorText}</p>
<p>{sideEffectText}</p>
{lang === 'ko' ? (
<p><a href="/clinic">{u.foot_clinic}</a> · <a href="/visit">{u.foot_visit}</a> · <a href="/plan">{u.foot_plan}</a> · <a href="/about">{u.foot_about}</a> · <a href="/corrections">{u.foot_corrections}</a> · <a href={ed.email ? `mailto:${ed.email}` : '/corrections'}>{u.foot_request}</a> · <a href="/editorial">{u.foot_editorial}</a></p>
) : (
<p><a href="/en#clinic">{u.foot_clinic}</a> · <a href="/en#visit">{u.foot_visit}</a> · <a href="/en/plan">{u.foot_plan}</a> · <a href="/about">{u.foot_about}</a> · <a href="/corrections">{u.foot_corrections}</a> · <a href={ed.email ? `mailto:${ed.email}` : '/corrections'}>{u.foot_request}</a></p>
)}
</div>
<div>
{has(S.logoFoot?.src) && <p><img src={S.logoFoot.src} alt={S.logoFoot.alt} width={S.logoFoot.width} height={S.logoFoot.height} style="width:138px;height:auto;margin-bottom:0.5rem" /></p>}
<p><strong>{v(f.name)}</strong></p>
<p>{v(f.address?.full)}<br />전화 {v(f.phone)} · 팩스 {v(f.fax)}<br />대표 {v(f.representative)} · 사업자등록번호 {v(f.businessNo)}</p>
<p>{has(f.url) && <a href={f.url} rel="noopener">공식 홈페이지</a>}{has(surface('youtube').url) && <> · <a href={surface('youtube').url} rel="noopener">유튜브</a></>}{has(surface('gangnamunni').url) && <> · <a href={surface('gangnamunni').url} rel="noopener">강남언니</a></>}</p>
<p><strong>{lang === 'en' ? EN.name : v(f.name)}</strong></p>
<p>{lang === 'en' ? EN.address.full : v(f.address?.full)}<br />{u.foot_phone} {v(f.phone)} · {u.foot_fax} {v(f.fax)}<br />{u.foot_rep} {v(f.representative)} · {u.foot_biz} {v(f.businessNo)}</p>
<p>{lang === 'en' && has(f.urlEn) ? <a href={f.urlEn} rel="noopener">{u.foot_site}</a> : has(f.url) && <a href={f.url} rel="noopener">{u.foot_site}</a>}{has(surface('youtube').url) && <> · <a href={surface('youtube').url} rel="noopener">{u.foot_youtube}</a></>}{has(surface('gangnamunni').url) && <> · <a href={surface('gangnamunni').url} rel="noopener">{u.foot_gu}</a></>}</p>
</div>
</div>
<div class="wrap-wide powered">AI Discovery · Built with INFINITH</div>

View File

@ -0,0 +1,48 @@
// 사이트 공통(헤더·푸터·배너) 문자열과 언어 전환 규칙. 페이지 본문은 각 페이지가 맡고, 이 모듈은 Base.astro 가 쓴다.
// 언어 전환은 전역 하나(헤더)로만 한다. 페이지마다 따로 토글을 두지 않는다 (haewon 결정, 2026-09-10).
export type Lang = 'ko' | 'en';
/** 한국어 경로 ↔ 영어 경로. 영어판이 없는 한국어 페이지는 영어 홈으로, 반대는 한국어 홈으로 보낸다. */
const PAIRS: [string, string][] = [
['/', '/en'],
['/plan', '/en/plan'],
];
export function switchHref(pathname: string, to: Lang): string {
const p = pathname.replace(/\/index\.html$/, '/').replace(/\.html$/, '').replace(/\/$/, '') || '/';
for (const [ko, en] of PAIRS) {
if (to === 'en' && p === ko) return en;
if (to === 'ko' && p === en) return ko;
}
return to === 'en' ? '/en' : '/';
}
export const isEnPath = (pathname: string): boolean => /^\/en(\/|\.html$|$)/.test(pathname);
export const UI: Record<Lang, Record<string, string>> = {
ko: {
sample: '샘플 사이트입니다. 정식 공개 전입니다.',
brand: '서포터즈',
nav_posts: '상담 전 질문', nav_videos: '의료진 영상', nav_news: '뉴스룸', nav_visit: '방문 안내', nav_plan: '회복 일정', nav_about: '매체 소개',
cta: '상담 예약',
back: '이전 페이지', backAria: '이전 페이지로 돌아가기', totop: '맨 위로',
switchLabel: 'EN', switchAria: 'Switch to English',
foot_sponsor: '이 매체는 {clinic}의 지원을 받아 서포터즈가 운영합니다. 글의 의학적 내용은 {clinic} 담당 원장의 검토를 거쳐 표시하며, 검토 전 글은 "의학 검토 대기"로 표시합니다. 편집 책임 {editor}.',
foot_clinic: '병원 정보', foot_visit: '방문 안내', foot_plan: '회복 일정', foot_about: '이 사이트에 대해', foot_corrections: '정정 기록', foot_request: '정정 요청', foot_editorial: '편집 기준 (운영자용)',
foot_phone: '전화', foot_fax: '팩스', foot_rep: '대표', foot_biz: '사업자등록번호',
foot_site: '공식 홈페이지', foot_youtube: '유튜브', foot_gu: '강남언니',
},
en: {
sample: 'Sample site. Not yet public.',
brand: 'Supporters',
nav_home: 'Home', nav_plan: 'Recovery Planner', nav_visit: 'Getting Here', nav_clinic: 'Clinic Facts', nav_korean: '한국어 전체 보기',
cta: 'Book a consultation',
back: 'Back', backAria: 'Go back to the previous page', totop: 'Back to top',
switchLabel: 'KO', switchAria: '한국어로 보기',
// 아래 영문 foot_sponsor · foot_side 는 병원이 확정한 문구가 아니라 푸터 고지에 쓰지 않는다.
// 고지는 Base.astro 가 site.json 의 sponsorNoticeEn · factSheet 의 sideEffectNoticeEn 에서 읽고, 없으면 한국어 원문에 확인 대기 표기를 붙인다.
foot_sponsor: 'This site is run by supporters with support from {clinic}. Medical content is reviewed by the clinic\'s attending surgeon before it is marked as reviewed. Editor in charge: {editor}.',
foot_side: 'After surgery, side effects such as inflammation, bleeding or nerve damage may occur depending on the individual.',
foot_clinic: 'Clinic facts', foot_visit: 'Getting here', foot_plan: 'Recovery planner', foot_about: 'About this site (Korean)', foot_corrections: 'Corrections (Korean)', foot_request: 'Request a correction', foot_editorial: '',
foot_phone: 'Tel', foot_fax: 'Fax', foot_rep: 'Representative', foot_biz: 'Business no.',
foot_site: 'Official website (English)', foot_youtube: 'YouTube', foot_gu: 'Gangnam Unni',
},
};

View File

@ -9,7 +9,7 @@ const ld = { '@type': 'WebPage', '@id': `${site}/404#page`, name: '페이지를
<section class="section dark" style="padding:5rem 0 4.5rem"><div class="wrap-wide">
<div class="sec-head"><div class="eyebrow" style="color:var(--purple-300)">404</div><h1 class="serif" style="font-size:2rem;display:inline-block;background:linear-gradient(to right,var(--purple-300),var(--blue-300));-webkit-background-clip:text;background-clip:text;color:transparent">Page Not Found</h1><p class="sub">주소가 바뀌었거나 없는 페이지입니다. 아래에서 이어서 보실 수 있습니다.</p></div>
<div class="grid">
<a class="card" href="/" style="text-decoration:none"><div class="cat">Home</div><h3>홈</h3><p>병원을 알아보는 분들의 질문과 답</p></a>
<a class="card" href="/" style="text-decoration:none"><div class="cat">Home</div><h3>홈</h3><p>뷰성형외과를 알아보는 분들의 질문과 답</p></a>
<a class="card" href="/plan" style="text-decoration:none"><div class="cat">Recovery Planner</div><h3>회복 일정</h3><p>수술일 기준 입국·출국 계산과 회복기 외출 계획. 영어 화면은 /en/plan</p></a>
<a class="card" href="/visit" style="text-decoration:none"><div class="cat">Visit</div><h3>방문 안내</h3><p>예약, 가는 길, 주차, 도착 후 동선</p></a>
</div>

View File

@ -0,0 +1,94 @@
---
// 영어 홈. 헤더의 언어 전환(KO/EN)이 도착하는 곳. 구성은 한국어 홈과 같은 섹션 리듬(라이트 히어로 → 틴트 카드 → 다크 통계 → 라이트 → 다크)이고,
// 내용은 영어로 읽을 수 있는 것만 싣는다: 회복 일정 플래너, 오는 길, 진료시간, 병원 사실, 원칙. 한국어 글은 번역 없이 링크만 안내한다.
import Base from '../../layouts/Base.astro';
import { fact, site as S, clinicSchema, surface, has, v } from '../../lib';
import EN from '../../data/factSheetEn.json';
import VisitMap from '../../components/VisitMap.astro';
const f = fact as Record<string, any>;
const site = Astro.site!.toString().replace(/\/$/, '');
const yt = surface('youtube'); const gu = surface('gangnamunni'); const gg = surface('google');
const hoursDays = EN.hoursDays as Record<string, string>;
const ld = [
{ '@type': 'WebPage', '@id': `${site}/en#page`, name: `${EN.shortName} Supporters (English)`, url: `${site}/en`, inLanguage: 'en', isPartOf: { '@id': `${site}/#website` }, about: { '@id': `${fact.url}/#clinic` } },
clinicSchema(site),
];
---
<Base lang="en" title={`${EN.shortName}, Seoul · Recovery planner, getting here, clinic facts`} description={`${EN.shortName} is a ${EN.kind} at ${EN.areaLabel}, founded in ${v(f.founded)}. Plan your recovery stay around your surgery date, find the way from the airport, and check opening hours and clinic facts in English.`} jsonLd={ld} alternates={[{ lang: 'ko', href: '/' }, { lang: 'en', href: '/en' }]}>
<section class="hero-light">
<div class="blob a"></div><div class="blob b"></div>
<div class="wrap-wide inner">
<div>
<div class="eyebrow">{S.siteNameEn || 'VIEW SUPPORTERS'} · English</div>
<h1>{EN.shortName},<br /><span class="accent">plan your stay before you fly.</span></h1>
<p class="lede">{EN.shortName} is a {EN.kind} at {EN.areaLabel}{has(f.founded) && <>, founded in {f.founded}</>}. This site is run by supporters who answer the questions people ask before visiting. In English you can plan your recovery stay, find the way here and check clinic facts. Articles are in Korean.</p>
<div class="chips">
<span class="chip"><span class="dot"></span>Founded {v(f.founded)} · Sinnonhyeon Station Exit 3</span>
<span class="chip"><span class="dot"></span>Based on the clinic's published guidance</span>
</div>
<div style="display:flex;gap:0.8rem;flex-wrap:wrap;margin-top:1.6rem">
<a class="btn primary" href="/en/plan">Recovery Planner</a>
<a class="btn secondary" href="#visit">Getting here</a>
</div>
</div>
{has(S.heroImage?.src) && <div class="hero-img collage"><img src={S.heroImage.src} alt="View Plastic Surgery building exterior and interior collage: consultation center, operating room, surgery center corridor" width={S.heroImage.width} height={S.heroImage.height} /></div>}
</div>
</section>
<section class="section tint" style="padding:3.2rem 0"><div class="wrap-wide">
<div class="sec-head"><div class="eyebrow">Start Here</div><h2>Where Are You Now?</h2><p class="sub">Pick the step that matches where you are.</p></div>
<div class="grid">
<a class="card entry" href="/en/plan"><div class="cat">Surgery date set</div><h3>Plan arrival, departure and recovery days</h3><p>Choose your procedure and date. See when to arrive, the earliest you can fly home, which days you can go out, and hotels near the clinic.</p><span class="more">Open the Recovery Planner</span></a>
<a class="card entry" href="#visit"><div class="cat">Preparing to visit</div><h3>Airport to clinic, hours and parking</h3><p>Line 9 from Gimpo Airport with no transfer, opening hours by day, and where to go when you arrive.</p><span class="more">Getting here</span></a>
<a class="card entry" href="#clinic"><div class="cat">Checking the clinic</div><h3>Facts, building and reviews</h3><p>Founded {v(f.founded)}, 19-storey clinic building, specialties, and where reviews can be read.</p><span class="more">Clinic facts</span></a>
</div>
</div></section>
<section class="section dark"><div class="wrap-wide">
<div class="sec-head"><div class="eyebrow" style="color:var(--purple-300)">At A Glance</div><h2>Clinic In Numbers</h2><p class="sub">Figures from the clinic's public profiles. Dates checked are shown with each number.</p></div>
<div class="stats">
<div class="stat"><b>{v(f.founded)}</b><span class="label">Founded</span><span class="desc">{EN.areaLabel}. {EN.building}</span></div>
<div class="stat"><b>{v(gu.doctors)}</b><span class="label">Doctors listed</span><span class="desc">Gangnam Unni clinic profile, checked {v(gu.checked)}</span></div>
<div class="stat"><b>{v(yt.videos)}</b><span class="label">Doctor videos</span><span class="desc">Official YouTube channel (Korean), checked {v(yt.checked)}</span></div>
<div class="stat"><b>{v(gu.reviews)}</b><span class="label">Reviews on Gangnam Unni</span><span class="desc">We link to where reviews can be read and do not reproduce patient stories.</span></div>
</div>
</div></section>
<section class="section light" id="visit"><div class="wrap-wide">
<div class="sec-head"><div class="eyebrow">Visit</div><h2>Getting Here</h2><p class="sub">Address, transit, airport route, opening hours and what to do when you arrive.</p></div>
<div class="grid">
<div class="card"><div class="cat">Address</div><h3>{EN.address.full}</h3><p>{EN.transit}</p><p><a href={`https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(EN.address.mapQuery)}`} rel="noopener" target="_blank">Open in Google Maps</a></p></div>
<div class="card"><div class="cat">From the airport</div><h3>Incheon to Sinnonhyeon</h3><p>{EN.airport}</p></div>
<div class="card"><div class="cat">On arrival</div><h3>Where to go in the building</h3><p>{EN.arrival}</p><p>{EN.parking}</p></div>
</div>
<VisitMap lang="en" hideHead nameEn={EN.shortName} addressEn={EN.address.full} />
<h3 style="margin-top:2rem">Opening hours</h3>
<div class="table-wrap"><table><thead><tr><th>Day</th><th>Hours</th></tr></thead><tbody>
{(f.hours?.rows ?? []).map((r: any) => <tr><td>{hoursDays[r.days] ?? r.days}</td><td>{r.open ? `${r.open} to ${r.close}` : EN.hoursClosed}</td></tr>)}
</tbody></table></div>
<p style="font-size:0.88rem;color:var(--slate-500)">Source: {has(f.hours?.source) ? <a href={f.hours.source} rel="noopener">clinic profile</a> : 'clinic'}. Hours can change, so call or message before you travel.</p>
<p style="margin-top:1.2rem"><a class="btn primary" href={f.reservationUrl || f.url} rel="noopener">Book a consultation</a> {has(f.urlEn) && <a class="btn secondary" href={f.urlEn} rel="noopener">Official English website</a>}</p>
</div></section>
<section class="section tint" id="clinic"><div class="wrap-wide">
<div class="sec-head"><div class="eyebrow">Fact Sheet</div><h2>Clinic Facts</h2><p class="sub">What the clinic states publicly, with the date we checked.</p></div>
<div class="grid">
<div class="card"><div class="cat">Specialties</div><h3>What the clinic does</h3><ul style="margin:0;padding-left:1.1rem;font-size:0.93rem;color:var(--slate-600)">{EN.specialties.map((s) => <li>{s}</li>)}</ul></div>
<div class="card"><div class="cat">Contact</div><h3>{EN.name}</h3><p>Tel {v(f.phone)}{has(f.kakao) && <> · <a href={f.kakao} rel="noopener">KakaoTalk channel</a></>}</p><p>{has(f.url) && <a href={f.url} rel="noopener">Korean website</a>}{has(f.urlEn) && <> · <a href={f.urlEn} rel="noopener">English website</a></>}</p></div>
<div class="card"><div class="cat">Reviews</div><h3>Where to read them</h3><p>{has(gu.url) && <a href={gu.url} rel="noopener">Gangnam Unni</a>}{has(gu.rating) && <> rating {gu.rating}, {v(gu.reviews)} reviews</>}{has(gg.url) && <> · <a href={gg.url} rel="noopener">Google Maps</a>{has(gg.rating) && <> rating {gg.rating}</>}</>}. We do not quote individual patient stories.</p></div>
</div>
</div></section>
<section class="section dark"><div class="wrap-wide">
<div class="sec-head"><div class="eyebrow" style="color:var(--purple-300)">Principles</div><h2>What We Do, What We Don't</h2><p class="sub">Three rules so you can judge for yourself.</p></div>
<div class="grid">
<div class="card"><h3>How we answer</h3><p>One question, one article, the answer first. Medical content is reviewed by the clinic's attending surgeon and the review date is shown. Articles are in Korean.</p></div>
<div class="card"><h3>What we leave out</h3><p>Before-and-after photos, other patients' stories, comparisons with other clinics, and any promise of results. For reviews we only say where they can be read.</p></div>
<div class="card"><h3>What we disclose</h3><p>Who wrote each piece, whether a surgeon reviewed it, what sources were used, and that this site is supported by {EN.shortName}.</p></div>
</div>
</div></section>
</Base>
<style>
.card.entry { text-decoration: none; color: inherit; }
.card .more { font-size: 0.85rem; font-weight: 600; color: var(--accent); }
</style>

View File

@ -4,7 +4,7 @@ import Base from '../../layouts/Base.astro';
import Planner from '../../components/Planner.astro';
import { fact, SITE_NAME, clinicSchema, v } from '../../lib';
const f = fact as Record<string, any>;
const clinicEn = (fact as Record<string, any>).nameEn || (fact as Record<string, any>).shortNameEn || (fact as Record<string, any>).shortName || 'the clinic';
const clinicEn = 'View Plastic Surgery';
const site = Astro.site!.toString().replace(/\/$/, '');
const ld = [
{ '@type': 'WebPage', '@id': `${site}/en/plan#page`, name: `${clinicEn} Recovery Planner`, url: `${site}/en/plan`, inLanguage: 'en', isPartOf: { '@id': `${site}/#website` }, about: { '@id': `${fact.url}/#clinic` }, publisher: { '@type': 'Organization', name: SITE_NAME, url: site } },

View File

@ -17,7 +17,7 @@ const ld = [
clinicSchema(site),
];
---
<Base title={`${clinic}, ${(S.heroTitle || '궁금한 것부터 답합니다').replace(/\.$/, '')}`} description={`${clinic}${has(f.areaLabel) ? `(${f.areaLabel})` : ''}를 알아보는 분들이 실제로 묻는 질문을 골라, 원장 설명 영상과 병원 공개 자료를 근거로 답합니다. 글마다 작성자와 원장 감수 여부를 밝힙니다.`} jsonLd={ld}>
<Base title={`${clinic}, ${(S.heroTitle || '궁금한 것부터 답합니다').replace(/\.$/, '')}`} description={`${clinic}${has(f.areaLabel) ? `(${f.areaLabel})` : ''}를 알아보는 분들이 실제로 묻는 질문을 골라, 원장 설명 영상과 병원 공개 자료를 근거로 답합니다. 글마다 작성자와 원장 감수 여부를 밝힙니다.`} jsonLd={ld} alternates={[{ lang: 'ko', href: '/' }, { lang: 'en', href: '/en' }]}>
<section class="hero-light">
<div class="blob a"></div><div class="blob b"></div>
<div class="wrap-wide inner">

View File

@ -11,6 +11,7 @@ export const GET: APIRoute = async ({ site }) => {
{ loc: `${base}/posts`, lastmod: today },
{ loc: `${base}/clinic`, lastmod: today },
{ loc: `${base}/visit`, lastmod: today },
{ loc: `${base}/en`, lastmod: today },
{ loc: `${base}/plan`, lastmod: today },
{ loc: `${base}/en/plan`, lastmod: today },
{ loc: `${base}/newsroom`, lastmod: today },

View File

@ -3,6 +3,7 @@
import Base from '../layouts/Base.astro';
import Gallery from '../components/Gallery.astro';
import VisitMap from '../components/VisitMap.astro';
import '../styles/plan.css';
import { fact, site as S, SITE_NAME, clinicSchema, reservationUrl, v, has } from '../lib';
const f = fact as Record<string, any>;
const clinic = v(f.shortName, '병원');
@ -38,14 +39,17 @@ const ld = [
<h2>4. 도착하면</h2>
<p>{v(S.arrivalGuide, `도착 후 동선은 병원 확인 뒤 싣습니다. ${v(null)}.`)} 층별 구성 전체는 <a href="/clinic">병원 정보</a>에 있습니다.</p>
<div class="plan-entry">
<h2>외국에서 오신다면: 회복 일정 플래너</h2>
<p>시술과 수술일을 고르면 입국 권장일, 출국 가능 최소일, 회복기 동안 외출할 수 있는 날과 갈 만한 곳, 병원 근처 숙소를 한 화면에서 정리해 드립니다. 영어 화면도 있습니다.</p>
<a class="btn primary" href="/plan">일정표 만들기</a>
</div>
<h2>5. 상담 전에 읽어볼 글</h2>
<ul>
{(S.visitReads ?? []).map((r) => <li><a href={r.href}>{r.title}</a> {r.note}</li>)}
{!(S.visitReads ?? []).length && <li>검토를 마친 글부터 차례로 연결합니다.</li>}
</ul>
<h2>6. 해외에서 오시는 경우</h2>
<p>수술 전후에 머무는 동안의 숙박·식사·회복·관광 정보를 영문으로 정리했습니다. <a href="/en/plan" hreflang="en">Recovery Planner</a>.</p>
<p style="margin-top:2rem">{has(reservationUrl) && <a class="btn primary" href={reservationUrl} rel="noopener">{clinic} 상담 예약</a>}</p>
<p class="disclosure">{fact.sideEffectNotice}</p>
</article>

View File

@ -144,6 +144,7 @@ td { color: var(--slate-700); }
.site-footer .cols { display: grid; grid-template-columns: 1fr 1fr; gap: 2rem; }
.site-footer p { margin-bottom: 0.5rem; color: rgba(255,255,255,0.75); }
.site-footer strong { color: #fff; }
.site-footer .notice-pending { color: #fff; border-left: 2px solid var(--purple-300); padding-left: 0.7rem; margin-bottom: 0.6rem; }
.site-footer a { color: var(--purple-300); }
.site-footer .powered { margin-top: 2rem; padding-top: 1.2rem; border-top: 1px solid rgba(255,255,255,0.1); font-family: "Playfair Display", Georgia, serif; letter-spacing: 0.05em; color: var(--purple-300); font-size: 0.8rem; }
@media (max-width: 720px) {
@ -199,6 +200,8 @@ td { color: var(--slate-700); }
/* 헤더: INFINITH 헤더 규격 (흰 배경, 우측 그라디언트 pill CTA) */
.site-header .right { display: flex; align-items: center; gap: 1rem; }
.site-header .lang-switch { display: inline-grid; place-items: center; min-width: 2.4rem; height: 2rem; padding: 0 0.6rem; border-radius: 999px; border: 1px solid var(--slate-200); color: var(--slate-600); font-family: Inter, Pretendard, sans-serif; font-size: 0.78rem; font-weight: 700; letter-spacing: 0.06em; text-decoration: none; }
.site-header .lang-switch:hover { color: var(--primary-900); border-color: var(--primary-900); text-decoration: none; }
.site-header .cta { background: linear-gradient(to right, var(--grad-start), var(--grad-end)); color: #fff; border-radius: 999px; padding: 0.5rem 1.05rem; font-size: 0.86rem; font-weight: 600; }
.site-header .cta:hover { text-decoration: none; box-shadow: var(--shadow); }
.nav a, .site-header .cta, .brand-text { white-space: nowrap; }
@ -265,249 +268,15 @@ td { color: var(--slate-700); }
.totop:hover { box-shadow: 0 10px 28px rgba(2,19,65,0.40); }
@media (max-width: 720px) { .totop { right: 1rem; bottom: 1.1rem; width: 44px; height: 44px; } }
/* 값이 아직 없다는 것을 숨기지 않고 드러내는 문단. 병원 확인 대기 항목에 쓴다. */
.pending-note {
background: var(--status-warn-bg, #FFF6ED);
border: 1px solid var(--status-warn-border, #F5E0C5);
border-left-width: 3px;
color: var(--status-warn-text, #7C5C3A);
border-radius: 10px;
padding: 0.75rem 1rem;
font-size: 0.92rem;
}
.notice-pending { font-size: 0.82rem; opacity: 0.75; }
/* 영문 화면에서 한국어 페이지로 가는 링크에 붙인다. 눌러보고 알게 하지 않는다. */
.lang-tag {
display: inline-block;
margin-left: 0.28em;
padding: 0 0.3em;
border: 1px solid currentColor;
border-radius: 3px;
font-size: 0.62em;
font-weight: 600;
letter-spacing: 0.04em;
vertical-align: 0.18em;
opacity: 0.55;
}
/* 언어 전환. 머리말 오른쪽에 하나만 둔다. 항목마다 표시하지 않는다. */
.langswitch {
display: inline-flex;
align-items: center;
border: 1px solid var(--line, #E2E8F0);
border-radius: 999px;
overflow: hidden;
margin-right: 0.7rem;
flex-shrink: 0;
}
.langswitch a {
padding: 0.26rem 0.62rem;
font-size: 0.72rem;
font-weight: 700;
letter-spacing: 0.05em;
color: var(--slate-500, #64748B);
text-decoration: none;
line-height: 1.45;
transition: background 0.15s, color 0.15s;
}
.langswitch a:hover { background: var(--near, #F4F6FB); color: var(--primary-900, #0A1128); }
.langswitch a.on {
background: var(--primary-900, #0A1128);
color: #fff;
}
.langswitch a.on:hover { background: var(--primary-900, #0A1128); color: #fff; }
/* ── /en/stay ── */
.stay { padding-bottom: 4rem; }
.stay .lede { color: var(--slate-600, #475569); margin-top: 0.6rem; }
.stay section { margin-top: 3.4rem; }
.stay .sec-head { display: flex; align-items: baseline; justify-content: space-between; gap: 1rem; flex-wrap: wrap; }
.stay .sec-head h2 { margin: 0; }
.stay .upd { font-size: 0.8rem; color: var(--slate-500, #64748B); }
.stay .sub { color: var(--slate-600, #475569); margin: 0.4rem 0 1rem; }
.stay .src { font-size: 0.84rem; color: var(--slate-500, #64748B); margin-top: 1rem; }
.stay .chips { display: flex; flex-wrap: wrap; gap: 0.5rem; margin: 0.2rem 0 1.6rem; }
.stay .chip {
border: 1px solid var(--line, #E2E8F0); background: #fff; border-radius: 999px;
padding: 0.36rem 0.85rem; font: inherit; font-size: 0.86rem; color: var(--slate-600, #475569);
cursor: pointer; transition: background 0.15s, color 0.15s, border-color 0.15s;
}
.stay .chip b { font-weight: 700; opacity: 0.55; margin-left: 0.25em; }
.stay .chip:hover { border-color: var(--primary-900, #0A1128); }
.stay .chip.on { background: var(--primary-900, #0A1128); border-color: var(--primary-900, #0A1128); color: #fff; }
.stay .chip.on b { opacity: 0.7; }
.stay .grp { margin-bottom: 2.2rem; }
.stay .grp h3 { margin: 0 0 0.9rem; }
.stay .grp h3 small { font-weight: 400; font-size: 0.82rem; color: var(--slate-500, #64748B); margin-left: 0.45em; }
.stay .cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(248px, 1fr)); gap: 1rem; }
.stay .card {
background: #fff; border: 1px solid var(--line, #E2E8F0); border-radius: 14px;
overflow: hidden; display: flex; flex-direction: column;
box-shadow: 3px 4px 12px rgba(0, 0, 0, 0.05);
}
.stay .card .thumb { position: relative; height: 148px; background: #EEF1F6; display: flex; align-items: center; justify-content: center; }
.stay .card .thumb img { width: 100%; height: 148px; object-fit: cover; display: block; }
.stay .card .nophoto {
font-size: 1.02rem; font-weight: 700; color: var(--slate-500, #64748B);
padding: 0 1rem; text-align: center; line-height: 1.35; word-break: keep-all;
}
.stay .card .badge {
position: absolute; left: 0.6rem; bottom: 0.6rem;
background: rgba(10, 17, 40, 0.82); color: #fff; border-radius: 6px;
padding: 0.18rem 0.45rem; font-size: 0.74rem; font-weight: 600;
}
.stay .card .badge em { font-style: normal; opacity: 0.7; margin-left: 0.25em; }
.stay .card .badge.mono { letter-spacing: 0.06em; }
.stay .card .body { padding: 0.85rem 0.95rem 1rem; display: flex; flex-direction: column; flex: 1; }
.stay .card h4 { margin: 0 0 0.35rem; font-size: 0.98rem; }
.stay .card .when { font-size: 0.8rem; color: var(--slate-600, #475569); margin: 0 0 0.4rem; }
.stay .card .desc { font-size: 0.86rem; color: var(--slate-600, #475569); margin: 0 0 0.5rem; }
.stay .card .addr { font-size: 0.78rem; color: var(--slate-500, #64748B); margin: 0 0 0.6rem; }
.stay .card .go { font-size: 0.82rem; margin-top: auto; }
.stay .route { border: 1px solid var(--line, #E2E8F0); border-radius: 16px; padding: 1.3rem 1.4rem; margin-bottom: 1.4rem; background: #fff; }
.stay .route-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 1rem; flex-wrap: wrap; }
.stay .route-head h3 { margin: 0; }
.stay .route .who { font-size: 0.84rem; color: var(--slate-500, #64748B); margin: 0.15rem 0 0; }
.stay .route .clock { font-size: 0.86rem; font-weight: 600; color: var(--primary-900, #0A1128); white-space: nowrap; }
.stay .route .blurb { color: var(--slate-600, #475569); margin: 0.7rem 0 1rem; }
.stay .route .map { width: 100%; height: auto; display: block; border-radius: 12px; }
.stay .route .maphint { font-size: 0.76rem; color: var(--slate-500, #64748B); margin: 0.4rem 0 1rem; }
.stay .timeline { list-style: none; padding: 0; margin: 0; }
.stay .timeline .move { font-size: 0.8rem; color: var(--slate-500, #64748B); margin: 0.35rem 0 0.35rem 1.05rem; }
.stay .timeline .stop { display: flex; gap: 0.8rem; align-items: flex-start; }
.stay .timeline .n {
flex: none; width: 26px; height: 26px; border-radius: 50%;
background: var(--primary-900, #0A1128); color: #fff;
font-size: 0.8rem; font-weight: 700; display: grid; place-items: center; margin-top: 0.1rem;
}
.stay .timeline .stop-t { font-size: 0.8rem; color: var(--slate-500, #64748B); }
.stay .timeline h4 { margin: 0.1rem 0 0.2rem; font-size: 0.98rem; }
.stay .timeline p { margin: 0; font-size: 0.86rem; color: var(--slate-600, #475569); }
.stay .botnote { margin-top: 1.6rem; }
/* 시술 후 관리 안내(병원 원문 인용). 동선 카드(.route)·정차(.stop) 룩을 그대로 쓰고 접이식 동작만 더한다. 새 색·크기 없음. */
.stay details.recovery > summary.btn { list-style: none; cursor: pointer; }
.stay details.recovery > summary.btn::-webkit-details-marker { display: none; }
.stay details.recovery > summary.btn .hide { display: none; }
.stay details.recovery[open] > summary.btn .show { display: none; }
.stay details.recovery[open] > summary.btn .hide { display: inline; }
.stay details.recovery[open] > summary.btn { margin-bottom: 1.1rem; }
.stay details.recovery > .timeline { margin-top: 0.2rem; }
.stay .recovery .timeline > li { border-top: 1px solid var(--line, #E2E8F0); padding: 0.7rem 0; }
.stay .recovery .timeline > li:first-child { border-top: 0; padding-top: 0; }
.stay .recovery summary { cursor: pointer; list-style: none; }
.stay .recovery summary::-webkit-details-marker { display: none; }
.stay .recovery summary .stop { display: flex; }
.stay .recovery summary h4 { margin: 0.1rem 0 0; }
.stay .recovery details[open] summary h4 { text-decoration: underline; text-underline-offset: 0.2em; text-decoration-color: var(--slate-200, #E2E8F0); }
.stay .recovery details > ul { margin: 0.7rem 0 0.5rem 2.2rem; padding-left: 1.1rem; }
.stay .recovery details > ul li { font-size: 0.9rem; color: var(--slate-700, #334155); margin-bottom: 0.35rem; }
.stay .recovery details > p { margin: 0 0 0 2.2rem; font-size: 0.84rem; color: var(--slate-500, #64748B); }
@media (max-width: 640px) { .cards { grid-template-columns: 1fr; } }
/* 섹션 점프. 머리말 아래에 붙어 스크롤을 따라온다. 헤더(68px) 아래에 걸리게 top 을 맞춘다. */
.stay .jump {
position: sticky; top: 68px; z-index: 9;
display: flex; flex-wrap: wrap; gap: 0.45rem;
margin: 1.4rem 0 2.4rem;
padding: 0.62rem 0.68rem;
background: rgba(255, 255, 255, 0.58);
backdrop-filter: blur(16px) saturate(1.5);
-webkit-backdrop-filter: blur(16px) saturate(1.5);
border: 1px solid rgba(255, 255, 255, 0.6);
border-radius: 18px;
box-shadow: 0 8px 28px rgba(10, 17, 40, 0.09), inset 0 1px 0 rgba(255, 255, 255, 0.7);
}
.stay .jump a {
display: inline-flex; align-items: center; gap: 0.42rem;
padding: 0.46rem 0.9rem;
border-radius: 999px;
font-size: 0.86rem; font-weight: 600; letter-spacing: -0.005em;
color: var(--primary-900, #0A1128);
text-decoration: none; white-space: nowrap;
background: #fff;
border: 1px solid var(--line, #E2E8F0);
box-shadow: 0 1px 2px rgba(10, 17, 40, 0.06);
transition: transform 0.14s ease, box-shadow 0.14s ease, background 0.14s, border-color 0.14s, color 0.14s;
}
.stay .jump a:hover {
text-decoration: none;
transform: translateY(-1px);
border-color: #C5CBF5;
box-shadow: 0 4px 12px rgba(10, 17, 40, 0.12);
}
.stay .jump a:active { transform: translateY(0); box-shadow: 0 1px 2px rgba(10, 17, 40, 0.08); }
.stay .jump a b {
font-weight: 700; font-size: 0.72rem; line-height: 1;
padding: 0.2rem 0.4rem; border-radius: 999px;
background: #EFF0FF; color: #3A3F7C;
}
/* 지금 보고 있는 섹션 */
.stay .jump a.on {
background: linear-gradient(to right, #4F1DA1, #021341);
border-color: transparent; color: #fff;
box-shadow: 0 4px 14px rgba(79, 29, 161, 0.32);
}
.stay .jump a.on b { background: rgba(255, 255, 255, 0.22); color: #fff; }
/* 점프로 이동했을 때 제목이 스티키 바에 가리지 않게 */
.stay section, .stay .grp { scroll-margin-top: 152px; }
@media (max-width: 640px) {
.stay .jump { top: 60px; gap: 0.35rem; padding: 0.5rem; border-radius: 14px; }
.stay .jump a { padding: 0.4rem 0.72rem; font-size: 0.8rem; }
}
/* 필터 칩도 눌리는 것처럼 보이게 */
.stay .chip {
box-shadow: 0 1px 2px rgba(10, 17, 40, 0.05);
transition: transform 0.14s ease, box-shadow 0.14s ease, background 0.15s, color 0.15s, border-color 0.15s;
}
.stay .chip:hover { transform: translateY(-1px); box-shadow: 0 4px 12px rgba(10, 17, 40, 0.1); }
.stay .chip:active { transform: translateY(0); }
.stay .chip.on { box-shadow: 0 4px 14px rgba(10, 17, 40, 0.22); }
/* 오늘 날씨. 값을 못 받으면 hidden 이라 아예 그려지지 않는다. */
.stay .wx {
display: flex; align-items: center; justify-content: space-between;
gap: 1.2rem; flex-wrap: wrap;
margin-top: 1.6rem; padding: 1rem 1.2rem;
background: linear-gradient(to right, #fff3eb, #e4cfff, #f5f9ff);
border-radius: 16px;
}
.stay .wx-now { display: flex; align-items: center; gap: 0.9rem; }
.stay .wx-temp { font-family: 'Playfair Display', serif; font-size: 2.5rem; font-weight: 700; line-height: 1; color: var(--primary-900, #0A1128); }
.stay .wx-unit { font-size: 1.1rem; vertical-align: 0.9rem; margin-left: 0.06em; opacity: 0.6; }
.stay .wx-cond { font-weight: 700; color: var(--primary-900, #0A1128); }
.stay .wx-meta { font-size: 0.8rem; color: var(--slate-600, #475569); margin-top: 0.15rem; }
.stay .wx-note { margin: 0; font-size: 0.88rem; color: var(--slate-700, #334155); max-width: 30rem; }
/* 동선 지도. OSM 타일을 좌표로 깔고 그 위에 핀을 얹는다. 출처 표기는 OSM 정책상 필수다. */
.stay .route .map {
position: relative; width: 100%; max-width: 680px; height: 340px;
border-radius: 12px; overflow: hidden; background: #E8EDF3;
border: 1px solid var(--line, #E2E8F0);
}
.stay .route .map-tiles { position: absolute; inset: 0; }
.stay .route .map-tiles .tile { position: absolute; width: 256px; height: 256px; background-size: 256px 256px; background-repeat: no-repeat; }
.stay .route .map-pins { position: absolute; inset: 0; width: 100%; height: 100%; }
.stay .route .map-credit {
position: absolute; right: 0; bottom: 0;
background: rgba(255, 255, 255, 0.82); color: var(--slate-600, #475569);
font-size: 0.66rem; padding: 0.1rem 0.35rem; border-top-left-radius: 6px;
}
/* 뷰 사이트 헤더 규칙 이식 (2026-09-11) */
.site-header .lang-switch { display: inline-grid; place-items: center; min-width: 2.4rem; height: 2rem; padding: 0 0.6rem; border-radius: 999px; border: 1px solid var(--slate-200); color: var(--slate-600); font-family: Inter, Pretendard, sans-serif; font-size: 0.78rem; font-weight: 700; letter-spacing: 0.06em; text-decoration: none; }
.site-header .lang-switch:hover { color: var(--primary-900); border-color: var(--primary-900); text-decoration: none; }
/* 태블릿·모바일 헤더 (≤900px): 첫 줄 브랜드 + 상담 예약, 둘째 줄 메뉴 가로 스크롤. 메뉴 6개가 두 줄로 겹치던 문제를 DOM 변경 없이 CSS만으로 해결한다 (2026-09-10) */
@media (max-width: 900px) {
.site-header .bar { height: auto; flex-wrap: wrap; padding-top: 0.6rem; padding-bottom: 0; row-gap: 0.1rem; }
.site-header .brand { flex: 1; }
.site-header .right { display: contents; }
.site-header .lang-switch, .site-header .langswitch { order: 2; margin-right: 0.5rem; }
.site-header .lang-switch { order: 2; margin-right: 0.5rem; }
.site-header .cta { order: 2; }
.site-header .nav { order: 3; display: flex; gap: 1rem; overflow-x: auto; white-space: nowrap; -webkit-overflow-scrolling: touch; scrollbar-width: none; padding: 0.35rem 0 0.7rem; width: 100%; }
.site-header .nav::-webkit-scrollbar { display: none; }
.site-header .nav a { margin-left: 0; flex: none; font-size: 0.9rem; }
}