엔진이 매일 하는 첫 일은 "오늘 뭘 쓸까"를 정하는 것이다. 사실 제일 공을 들인 데가 여기다. 글은 모델이 쓰지만, 무엇을 어디서 가져와 다룰지는 전부 코드가 정한다.
먼저 갈래를 둘로 나눴다. 개발(tech)과 데이터 시각화(dataviz). 관심이 그 두 곳에 걸쳐 있기도 하고, 한데 섞어두면 결국 잦은 쪽으로 쏠릴 게 뻔해서다. 주기도 다르게 뒀다. 개발 쪽은 움직임이 잦으니 하루 한 편, 시각화 쪽은 매일 새것이 나오진 않으니 주 1회(월요일). 없는 날 억지로 채우지 않는 건 뒤에서 다시 이야기한다.
찾는 곳과 인용하는 곳은 다르다
소스는 두 갈래로 구분지었다. 소식을 발견하는 자리와, 그걸 근거로 인용하는 자리. 이 둘은 다르다.
발견하는 쪽은 레이더다. "뭔가 났다"는 신호만 잡는 용도라, 여기서 뜬 링크는 그대로 인용하지 않는다. 해커뉴스 앞면 같은 뉴스 애그리게이터, 개발자 커뮤니티 게시판, 머신러닝 포럼, 논문 인덱스가 여기 든다. 화제가 뭔지까지만 알려주고, 본문 근거로는 올라오지 못한다.
인용하는 쪽은 따로다. 공식 발표, 릴리스 노트, 논문 원문 같은 1차 출처. 글에 들어가는 주장은 하나하나 이 1차 출처로 되짚는다. 그래서 소스를 등급으로 나눠 관리한다. 인용해도 되는 1차, 맥락으로만 쓰는 2차, 신호만 주고 본문엔 못 들어오는 발굴용. 개발 쪽 1차는 주로 핵심 저장소의 릴리스 노트(타입스크립트·리액트·D3처럼 지켜볼 만한 것들)를 본다. 시각화 쪽은 arXiv의 관련 분야나 IEEE VIS·EuroVis 같은 학회 발표를 보려 한다.
묶고, 거르고, 고르기
소스에서 신호를 모으고 나면, 여기서부터가 알고리즘의 일이다.
묶기. 같은 사건을 여러 곳이 동시에 말할 때가 많다. 제목의 단어가 충분히 겹치는 항목끼리 하나로 묶어 한 건으로 만든다. 그러면서 서로 다른 출처가 몇 곳이나 같은 걸 말하는지를 센다. 이 교차 확인된 정도가 뒤에서 등급을 정할 때 쓰인다.
거르기. 이미 나간 것과 비슷하면 떨어뜨린다. 비슷한 정도는 제목과 한 줄 평의 단어 겹침으로 재고, 기준은 두 단이다.
maxSim > 0.92 // 사실상 같은 글 → 막는다
0.82 ≤ maxSim ≤ 0.92 // 새로운 사실이 있다고 표시할 때만 통과 (정당한 후속편)
"이미 나간 것"의 목록은 매번 사이트에서 새로 읽는다. 엔진이 상태를 따로 들고 있으면 언젠가 사이트와 어긋나기 마련이라, 아예 안 들게 했다.
고르기. 여기가 idea-bank를 죽였던 자리라, 제일 크게 바꿨다. 소수점 점수를 매기지 않는다. 대신 세 등급 — 꼭 볼 것, 볼 만한 것, 그냥 기록 — 으로 나누고 그 분포를 강제한다. 후보가 등급 자리보다 많으면, 아무리 다 좋아 보여도 전부 위 등급에 들 수는 없다. 점수가 다 비슷해지던 자기채점의 병을, 애초에 그럴 수 없는 구조로 막은 것이다.
여기에 안전장치를 몇 개 더 걸었다. 한 곳만 말하는 소식은 위 등급으로 못 올라간다(서로 다른 출처 둘 이상을 요구한다). 최근에 다룬 것과 결이 겹치면 점수를 깎아 다양성을 지킨다. 그리고 오늘 마땅한 게 없으면 짧게 몇 개 묶거나 아예 건너뛴다.
여기까지가 "오늘은 이걸, 이 출처로 쓴다"가 정해지는 과정이다. 다음은 그걸 실제로 글로 옮기는 이야기다.