앞 단계에서 후보 수백 건에만 점수를 매기기로 했습니다. 그 점수를 무엇으로 만드는지, 그리고 점수가 시간에 따라 변한다는 사실이 무엇을 강제하는지가 이 절입니다.
점수는 몇 가지의 합이다
작성자와 얼마나 가까운가
반응이 얼마나 많은가
얼마나 새 글인가
내가 이런 종류를 눌러 왔는가
각 항목에 무게를 주고 합칩니다. 처음에는 무게를 사람이 정합니다. 요구사항에 학습 모델이 없으므로 규칙으로 시작하고 재 보면서 고칩니다.
무게를 정할 때 중요한 것은 한 항목이 다른 항목을 압도하지 않게 하는 것입니다. 반응 수는 값의 범위가 크므로(0에서 수만) 그대로 더하면 다른 항목이 의미를 잃습니다. 범위를 좁혀서 더합니다.
신선도가 없으면 오래된 글이 남는다
반응 수만 보면 어제 크게 터진 글이 오늘도 1위입니다. 반응은 시간이 지나며 쌓이므로 오래된 글이 유리합니다.
그래서 시간이 지나면 점수를 내립니다. 새 글이 하루 500만 개 올라오는데 어제 글이 계속 상위에 있으면, 사용자는 새로 볼 것이 없다고 느낍니다.
그런데 점수가 변하면 미리 정렬할 수 없다
여기에 앞 절과 충돌하는 지점이 있습니다. 읽기가 60배라서 미리 만들어 두기로 했는데, 점수가 시간에 따라 계속 변하면 미리 정렬한 순서가 낡습니다.
모든 글의 점수를 매 순간 다시 계산할 수는 없습니다. 그래서 점수를 두 부분으로 나눕니다.
| 부분 | 언제 계산 |
|---|---|
| 시간과 무관한 부분 (친밀도, 반응 수, 종류) | 미리 계산해 둔다 |
| 시간에 따라 변하는 부분 (감쇠) | 꺼낼 때 적용한다 |
감쇠는 글의 나이만 알면 계산되므로 꺼낼 때 붙이는 비용이 낮습니다. 변하는 부분만 늦게 계산하는 것이 사전 계산과 신선도를 함께 얻는 방법입니다.
반응 수는 나중에 늘어난다
미리 계산해 둔 부분도 완전히 고정은 아닙니다. 글이 올라온 뒤에도 반응은 계속 붙습니다.
올린 직후에 계산한 점수는 반응이 0인 상태의 점수다
이것을 그대로 두면 좋은 글이 초반에 낮은 점수로 굳습니다. 그래서 반응 수가 크게 바뀐 글만 점수를 다시 계산합니다. 전체를 다시 하는 것이 아니라 변한 것만 다시 합니다.
기준을 정해야 합니다. 반응이 10개에서 11개가 된 것은 순서를 바꾸지 않지만, 10개에서 500개가 된 것은 바꿉니다. 순서를 바꿀 만큼 변했을 때만 다시 계산합니다.