실시간 급상승 검색어 기능을 위한 Ranking Algorithm에 대한 조사
우선 공개된 Ranking Algorithm을 살펴보면 게시글의 추천수를 기반으로 인기 게시글을 선별해 사용자에게 추천해 주는 알고리즘, 추천/비추천을 이용해 순위를 매기는 알고리즘, 평점을 기반으로 하는 순위 알고리즘 등등 여러 알고리즘이 존재한다.
Hacker News Ranking Algorithm
Hacker News에서 사용하는 ranking algorithm은 생각보다 간단하다.
p = 게시글에 대한 추천 수 (-1을 한 이유는 글 작성자의 추천도를 고려한 것)
t = 글을 게시한 시간과 현재 시간 사이의 시간(시간 단위). 예를 들어, 2시간 전에 게시된 글은 t = 2
G = 중력계수 (news.arc에서는 기본값으로 1.8을 사용한다.)
Hacker News의 랭킹 알고리즘은 단순히 단시간에 더 많이 추천을 받을 수록 높은 점수를 받아 순위가 높아진다. 시간이 지날수록 순위는 내려간다.
중력계수의 값을 조정해서 시간이 지날수록 점수를 빠르게 감소할지 느리게 감소할지 정할 수 있다. 각 애플리케이션의 상황에 맞게 정하면 된다.
Reddit Ranking Algorithm
Reddit의 랭킹 알고리즘은 Hacker News에 비해 조금 더 복잡하다.
sign(x=(추천수 - 비추천수)) → x가 0보다 크면 1, 0보다 작으면 -1, 그 외(같으면) 0
log함수에 절댓값 추천수 - 비추천수를 하는 이유는 reddit에서 상위에 노출되는 글은 비논쟁적인 글을 노출되도록 하기 위함이라고 한다. -> 추천수가 높으면서 비추천수가 낮은 글이 상위에 있도록
log함수를 적용한 이유 -> 이미 인기가 높은 글에 대해서는 추천수가 더 높아져도 점수를 크게 반영하지 않게 하기 위함이다.
Reddit Ranking Algorithm은 Hacker News Ranking Algorithm와 다르게 최근 글일수록 더 높은 점수를 갖게 했다. (Haker News Ranking Algorithm은 글의 포스팅시간이 오래될수록 점수가 낮아진다.)
seconds: 글 업로드 시간 - reddit의 첫 오픈 일자
1134028003은 고정값으로 reddit의 오픈 시간을 unix timestamp 형식으로 나타낸것으로 변환을 해보면 (2005, 8, 12 07:46 (UTC))
분모의 45000(초)은 12시간 30분과 같다. 즉, 오픈 일자로부터 12시간 30분이 지날 때마다 1점이 추가된다.
Highly Rated
이번엔 steam의 평점(리뷰) 기반 추천 알고리즘이다.
해당 알고리즘은 리뷰수에 따라 점수를 보정한다. 이게 무슨말이냐면 리뷰수(TotalReviews)가 많아지면 긍정적으로 평가한 리뷰를 그대로 점수에 반영한다. 그 이유는 전체 리뷰수가 많아지면 *2^-ln(TotalReviews + 1)이 부분에서 -log 함수에 의해 전체 값이 0에 가까워지기 때문에 앞에서 계산하는 값이 그대로 반영이 된다.
내일은 이러한 알고리즘을 이용해 실시간 검색어 기능 구현 알고리즘에 어떻게 활용할 수 있을지 고민해봐야 겠다.
References
https://medium.com/hacking-and-gonzo/how-hacker-news-ranking-algorithm-works-1d9b0cf2c08d
https://steamdb.info/blog/steamdb-rating/
'성장이야기 > TIL' 카테고리의 다른 글
[개발일지] 230609 GraphQL을 알아보자 (GraphQL과 REST API) (0) | 2023.06.09 |
---|---|
[개발일지] 230608 실시간 급상승 검색어 알고리즘 (1) | 2023.06.08 |
[개발일지] 230602 Java Varargs(가변인자)란? (0) | 2023.06.02 |
[개발일지] 230531 직렬화 중 만난 Jackson 버전 문제 (0) | 2023.05.31 |
[개발일지] 230529 인스턴스화를 막기 위해 private 생성자를 사용하자 (0) | 2023.05.29 |