Skip to content

About

경제 뉴스 품질 평가 지수(EJQI) 자동 분석 시스템 + 데스크 챗봇(ENDC). 네이버 경제 섹션 30,178건 실측 규준 기반. 서버 없는 정적 페이지.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

📰 EJQI Analyzer

경제 뉴스 품질 평가 지수(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

두 곳에 같은 파일이 올라가 있음. 아무 쪽이나 써도 결과가 같음.


시작하기

  1. 왼쪽 사이드바에 Gemini API 키 입력
  2. 품질 분석 시스템 또는 데스크 챗봇 탭 선택
  3. 기사 본문 붙여넣기 — 1건 분석에 약 5~15초, 0.0015달러(2원) 수준

🔒 키와 본문은 어디로도 가지 않음

  • 이 서비스는 정적 페이지임. 서버가 없음.
  • 모든 계산 — 문단 분할, 분석 창 산출, 인용 검증, 백분위 산출, 가중치 민감도 — 이 이용자의 브라우저 안에서 이루어짐. 브라우저가 Google Gemini API를 직접 호출하며 중계 서버가 없음
  • 입력한 API 키는 저장되지 않음. '이 브라우저에 키 저장'을 직접 체크한 경우에만 브라우저 로컬 저장소에 남고, '지우기'로 즉시 삭제됨
  • 기사 본문은 Google Gemini API로만 전송됨
  • 외부 추적 스크립트·분석 도구를 넣지 않았음. 외부 라이브러리·CDN도 쓰지 않음
  • 전체 소스는 이 저장소에서 그대로 확인 가능

EJQI의 구성 — 4차원 12항목

차원 코드 항목 척도 방향
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점을 다 쓰지는 않음 — A1A4는 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)
  • 두 항목을 평균에 넣으면 품질이 가장 낮은 기사군(홍보성 단신)의 점수가 부풀려짐
  • 그래서 차원별로 분리해 보고함

만들어진 근거

  1. 선행 연구 — 뉴스 품질 지수, 경제 저널리즘 내용분석
  2. 전문가 심층 인터뷰 11명 — 종합 일간지 2, 경제 전문지 3, 방송사 3, 인터넷 매체 1, 애널리스트·자산운용 2
  3. 파일럿 300건 실측 검증 — 변별력·자기일관성·참조 코딩 타당도
  4. 본 측정 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

About

경제 뉴스 품질 평가 지수(EJQI) 자동 분석 시스템 + 데스크 챗봇(ENDC). 네이버 경제 섹션 30,178건 실측 규준 기반. 서버 없는 정적 페이지.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages