원문 → 토픽 → 지도 → 화면
분석은 사이트가 뜨기 전, 오프라인에서 끝납니다. 여러분이 보는 페이지는 그 결과물(JSON 3개)을 읽어 그리는 얇은 껍데기일 뿐입니다.
원문에서 토픽으로
topics.json)로만 존재12,507개의 메시지를 흐름이 끊기는 지점마다 잘라 138개의 토픽으로 묶습니다. 토픽 하나는 평균 약 90개 메시지, 한 시간대(span)에 오간 하나의 이야기 덩어리입니다.
각 토픽은 8개의 필드로 요약됩니다 — 분류 / 제목 / 핵심 물음(hook) / 요지(gist) / 흐름(flow) / 갈라진 입장(positions) / 남은 물음(open) / 참여자. 특히 positions는 "누가 무엇을 주장했나"를 화자별로 분리해 한 물음 안의 대립을 보존합니다.
모든 토픽은 여섯 갈래 중 하나로 분류됩니다. 한쪽으로 쏠리지 않은 전방위의 사색이 이 분포에서 드러납니다:
가릴 것은 가린다
126명이 나눈 대화지만, 사람으로서 드러나는 것은 공개에 동의한 17명뿐입니다. 모든 이름은 marks 테이블에서 두 등급으로 통제됩니다:
대화 내용은 익명 라벨로 남아 보존되지만, ‘이 사람은 누구인가’ 식의 인물 분석은 동의자에게만 적용됩니다. 생각의 지도에서는 사람 노드 자체를 아예 만들지 않습니다(mapShow.person = false).
생각의 지도를 엮다
graph.json — 237개 노드, 403개 연결지도는 세 종류의 점으로 이루어집니다 — 분류 6개 · 토픽 138개 · 개념 93개. 연결선은 두 종류입니다: 토픽이 어느 분류에 속하는지(categorized, 138개), 그리고 토픽이 어떤 개념을 언급했는지(mentions, 265개).
핵심은 별도의 군집 알고리즘이 없다는 점입니다. ‘AI’ ‘언어’ ‘죽음’ 같은 개념이 허브 역할을 하고, 같은 개념을 언급한 토픽들이 자연스레 그 주위로 당겨집니다. 군집은 force-directed 물리엔진(cytoscape + cola, 실패 시 cose로 폴백)이 점들을 밀고 당겨 저절로 만들어냅니다. 점의 크기는 토픽이면 메시지 수, 개념이면 그것을 언급한 토픽 수입니다.
화면에서 다시 살아나다
app.js — 이 레포의 실제 코드브라우저가 하는 일은 결과 JSON을 읽어 그리는 것입니다. 그 안의 작은 장치들:
markNames() — 본문 속 화자명을 인라인 강조. 긴 이름부터 매칭해 부분 겹침을 막습니다.avColor() — 이름을 해시(h*31+charCode)해 사람마다 늘 같은 색을 줍니다.buildMuse() — 모든 토픽의 ‘남은 물음’을 한 풀에 모아 무작위로 하나 띄웁니다.#home #archive #map … 한 페이지 안에서 화면을 전환합니다./t/<id>.html → 해당 토픽으로 진입 + OG 카드(제목·물음·이미지) 미리보기.세 개의 데이터 파일
화면 뒤에는 단 세 개의 JSON이 있습니다. 사이트는 이걸 읽기만 합니다 — 쓰지 않습니다.
한 물음에는 평균 3.5개의 입장이 부딪혔고, 가장 흔한 형태는 3~4명이 갈라선 토픽이었습니다. 대화는 끝났지만, 그 갈라짐과 남은 물음은 여기 그대로 있습니다.
← 아카이브로 돌아가기