경제 뉴스 품질 평가 지수(EJQI) 기반 자동 분석 시스템과 데스크 챗봇. 한 페이지에 두 서비스가 들어 있음.
| 서비스 | 하는 일 |
|---|---|
| 🔬 품질 분석 시스템 | 기사 1건을 4차원 12항목으로 채점 → 3단계(항목별 진단 카드 / 비슷한 기사 중 위치 / 가중치를 바꿔도 흔들리지 않는 백분위 범위)로 보여 줌 |
| 💬 데스크 챗봇 (ENDC) | EJQI 기준·전문가 인터뷰·실측 수치를 근거로 초고에 대해 조언 |
네이버 뉴스 경제 섹션 30,178건(2024-07 ~ 2026-06, 층화 무작위 표집) 실측 기준표 위에서 작동함.
| 주소 | |
|---|---|
| GitHub Pages (정식) | https://jonghhhh.github.io/EJQI_Analyzer/ |
| Hugging Face Space | https://huggingface.co/spaces/jonghhhh/EJQI-Analyzer-ENDC |
두 곳에 같은 파일이 올라가 있음. 아무 쪽이나 써도 결과가 같음.
- 왼쪽 사이드바에 Gemini API 키 입력
- 키는 Google AI Studio에서 무료 발급 가능
품질 분석 시스템또는데스크 챗봇탭 선택- 기사 본문 붙여넣기 — 1건 분석에 약 5~15초, 0.0015달러(2원) 수준
- 이 서비스는 정적 페이지임. 서버가 없음.
- 모든 계산 — 문단 분할, 분석 창 산출, 인용 검증, 백분위 산출, 가중치 민감도 — 이 이용자의 브라우저 안에서 이루어짐. 브라우저가 Google Gemini API를 직접 호출하며 중계 서버가 없음
- 입력한 API 키는 저장되지 않음. '이 브라우저에 키 저장'을 직접 체크한 경우에만 브라우저 로컬 저장소에 남고, '지우기'로 즉시 삭제됨
- 기사 본문은 Google Gemini API로만 전송됨
- 외부 추적 스크립트·분석 도구를 넣지 않았음. 외부 라이브러리·CDN도 쓰지 않음
- 전체 소스는 이 저장소에서 그대로 확인 가능
| 차원 | 코드 | 항목 | 척도 | 방향 |
|---|---|---|---|---|
| A 분석 깊이 | A1 | 수치 맥락화 | 0–5 | 높을수록 좋음 |
| A2 | 인과·불확실성 | 0–5 | 높을수록 좋음 | |
| A3 | 검증·반론 | 0–5 | 높을수록 좋음 | |
| A4 | 영향 범위 | 0–5 | 높을수록 좋음 | |
| B 취재원·투명성 차원 평균 = B3 |
B3 | 이해관계 공시 | 0–5 | 높을수록 좋음 |
| C 이해 가능성 차원 평균 = C2·C4·C5 |
★ C1 | 이해 난이도 | 0–5 | ⚠ 높을수록 쉬움 (품질 아님) · ★ 차원 밖 단독 지표 |
| C2 | 설명 노력 | 0–5 | 높을수록 좋음 | |
| ★ C3 | 용어 해설률 | 0–100% | 높을수록 좋음 · ★ 차원 밖 단독 지표 | |
| C4 | 수치 체감화 | 0–5 | 높을수록 좋음 | |
| C5 | 사례·비유 | 0–5 | 높을수록 좋음 | |
| D 맥락 충실성 차원 평균 = D1·D2 |
D1 | 배경·시계열 | 0–5 | 높을수록 좋음 |
| D2 | 독자 함의 | 0–5 | 높을수록 좋음 |
- 0~5점을 다 쓰지는 않음 — A1
A4는 0·2·4·5점만, B3·C2·C4·C5·D1·D2는 0·3·5점만, C1은 0·2·3·4·5점만 정의됨. 채점자가 확신을 갖고 구별 가능한 단계만 남긴 것으로, 사실상 34단계짜리 순서 척도임 - ★ C1 이해 난이도와 C3 용어 해설률은 어느 차원 평균에도 넣지 않고 단독으로 읽음. 코드는 C로 시작하지만 C 차원 평균은 C2·C4·C5로만 냄 — C1은 품질이 아니라 '쉬움'을 재고, C3는 척도가 0–100이라 0–5 항목과 같은 평균에 섞을 수 없기 때문임.
- 낙관·비관 균형(0–5) — 5는 낙관 쪽과 비관 쪽 이야기가 고르게 실렸다는 뜻이고, 0에 가까울수록 어느 한쪽으로만 치우쳐 서술됐다는 뜻임(0 = 극단 편향). 점수에 합산되지 않음.
- C3 용어 해설률만 채점이 아니라 계산 결과임 — 모델은 용어를 뽑고 설명 수준(없음 0 · 사전적 0.5 · 맥락번역 0.85 · 중요성설명 1.0)만 판정하고, 비율 계산은 코드가 수행함. 예) 용어 4개가 '없음·없음·사전적·맥락번역'이면 (0+0+0.5+0.85) ÷ 4 = 33.75%
- 함께 나오는 부가 정보 — 표시만 하는 점검 3종(제목 과장·낙관비관 균형·홍보성), 뽑아 주는 자료 3종(취재원 16분류 · 전문용어와 해설 수준 · 비전문가가 막히는 문장 6유형)
- 30,178건 주성분 분석에서 **이해관계 공시(B3)**와 **이해 난이도(C1)**가 나머지 항목과 따로 노는 것으로 나타났음(제1 주성분 적재량 −0.026, −0.125)
- 두 항목을 평균에 넣으면 품질이 가장 낮은 기사군(홍보성 단신)의 점수가 부풀려짐
- 그래서 차원별로 분리해 보고함
- 선행 연구 — 뉴스 품질 지수, 경제 저널리즘 내용분석
- 전문가 심층 인터뷰 11명 — 종합 일간지 2, 경제 전문지 3, 방송사 3, 인터넷 매체 1, 애널리스트·자산운용 2
- 파일럿 300건 실측 검증 — 변별력·자기일관성·참조 코딩 타당도
- 본 측정 30,178건 — 16개 비교군(장르 × 길이대) 기준표 구축
- 이론적으로 그럴듯해도 실측에서 변별력이 없으면 버렸음
- 텍스트 가독성 공식(만점 72.7%), 질의응답식 이해도(비용 55%에 고유 기여 0.02), 기사 구성 항목(천장 81~89%)이 그렇게 탈락함
순위를 매기거나 사람을 평가하는 장치가 아님.
- 기사 1건의 점수는 확정적이지 않음 — 같은 기사를 다시 채점했을 때 항목 점수가 그대로 나올 확률이 약 50%임. 집합 비교(매체·분야·시기)에는 1회로 충분하나, 개인 평가·인사 고과 연동은 권장하지 않음
- 이해 가능성(C) 차원은 아직 타당성이 확립되지 않음 — 참고용 수치로만 읽을 것
- 사람 채점자와의 대조 검증이 아직 수행되지 않음 — 현재 결과는 "LLM이 채점 규칙을 적용한 결과"임
- 제목 과장 점검은 잘 작동하지 않음 — 실제 발생률의 100분의 1 수준만 잡아냄
- 점수가 높다고 좋은 기사인 것은 아님 — 통념을 뒤집는 역발상 기사가 낮게 나올 수 있음
- 기사 1건의 텍스트만으로 잴 수 없는 것은 아예 넣지 않았음 — 과거 전망의 사후 검증, 자본·권력으로부터의 독립성, 타 매체와의 차별성
index.html 단일 페이지 (안내 · 분석 시스템 · ENDC 챗봇)
css/style.css 스타일 (외부 폰트·CDN 없음)
js/
ejqi.js 문단 분할 · 분석 창 · 인용 검증 · 파생 지표 · 백분위 산출 · 가중치 구간
prompts.js 시스템 지시 + 본 지시 (파이썬 원본에서 자동 생성)
schema.js Gemini 구조화 출력 스키마
gemini.js REST 호출 (재시도 · 오류 분류)
endc.js ENDC 시스템 프롬프트 · 문맥 조립
app.js UI 로직
data/
norms_web.json 30,178건 기반 경량 기준표 (비교군 16개, 6.0MB → 0.53MB)
endc_knowledge.md ENDC 프롬프트에 주입되는 지식 베이스
scripts/ 포팅 검증 도구 (아래 참조)
app.py, ejqi/ Streamlit 판 (로컬 실행용)
Dockerfile Streamlit 판 컨테이너
deploy_gh.py GitHub Pages 배포
deploy_hf.py Hugging Face Space 배포
git clone https://github.com/jonghhhh/EJQI_Analyzer.git
cd EJQI_Analyzer
python -m http.server 8765 # → http://localhost:8765- 빌드 과정이 없음. 파일을 그대로 열면 됨
- Streamlit 판도 함께 두었음. 허깅페이스 무료 계정이 Docker/Gradio Space를 제한하므로 웹 배포본은 정적 페이지 쪽이지만, 로컬에서는 아래처럼 쓸 수 있음
pip install -r requirements.txt && streamlit run app.py- 앵커·스키마·검증 로직은 연구 파이프라인(
ejqi/verify.py등)을 자바스크립트로 옮긴 것임 - 한 글자라도 달라지면 30,178건 기준표와의 비교가 성립하지 않으므로 자동 검증을 둠
python scripts/make_parity_fixture.py --n 700 # 파이썬 원본으로 고정자료 생성
node scripts/parity_test.mjs # JS 포팅과 완전 일치 확인
python scripts/rest_smoke.py # 브라우저와 동일한 REST 요청 검증- 최근 실행 결과 — 실제 기사 700건 · 검사 61,156건 · 불일치 0건 (문단 분할, 분석 창, 인용 대조 exact/fuzzy/absent/empty 네 경로, 파생 지표 전부 포함)
- 포팅 과정에서 실제로 두 가지가 어긋났고, 이 검증이 잡아냈음
- 문장 분리에서 구두점을 소비하는 규칙의 경계 처리
- 파이썬
round()의 짝수 반올림(76.25 → 파이썬 76.2, 자바스크립트 76.3)
difflib.SequenceMatcher.ratio()도 파이썬 구현을 그대로 재현함- 프롬프트는 손으로 옮기지 않고 파이썬 원본에서 생성함
python scripts/gen_prompts_js.py # ejqi/prompts.py → js/prompts.js위 스크립트는 연구 저장소의 원본 코퍼스(
naver_econ_articles.jsonl)와ejqi/파이썬 패키지를 참조함. 이 저장소만으로는 실행되지 않으며, 검증 절차를 공개하기 위해 함께 수록함.
- 실행 — 정적 HTML + 바닐라 자바스크립트(ES 모듈). 빌드 과정도, 서버도, 외부 의존도 없음
- 모델 —
gemini-3.1-flash-lite(버전 고정,-latest별칭 미사용) - temperature — 0.0 (반복 채점 시 0.7)
- 구조화 출력 —
responseSchema강제 ·thinkingBudget: 0 - 인용 검증 — 모든 인용을 원문과 대조. 전량 측정 기준 지어낸 인용 비율 0.30%
- 분석 창 — 앞 1,200자를 목표로 문단 경계에서 절단. 용어 해설률(C3)에만 적용되며, 나머지 11개 항목과 취재원 목록은 기사 전체가 대상
- 두 곳에 같은 정적 파일을 올림
- 각 스크립트는 화이트리스트에 있는 파일만 업로드하므로
.env·API 키·테스트 고정자료가 섞여 올라가지 않음
python deploy_gh.py # GitHub Pages (.env 의 GITHUB_TOKEN)
python deploy_hf.py # Hugging Face (.env 의 HUGGINGFACE_TOKEN_WRITE)한국언론진흥재단 연구과제 · 「경제 뉴스 보도 현황과 전문성 향상 방안: LLM 기반 품질 평가 지수(EJQI) 개발과 AI 데스크 챗봇 설계」
라이선스: CC BY-NC 4.0