[개발일지] 230608 실시간 급상승 검색어 알고리즘

실시간 급상승 검색어 알고리즘


이전에 알아봤던 랭킹 알고리즘을 바탕으로 실시간 급상승 검색어 랭킹 알고리즘을 만들어야 하는데 지금까지 구상한걸 기록해보려고 한다.

 

우선 실시간 급상승 검색어 기능에서 고려해야 하는 점은 아래와 같다.

  1. 평소 검색 유입량에 대비 많은 유입량을 보이는 검색어를 탐지
  2. 시간 가중치(최근에 검색된 검색어에 더 높은 점수를 적용하기 위함)
  3. 검색한 시간대에 따른 점수 보정 (새벽시간대에 검색한 검색어의 점수는 낮게 측정되게 하기 위함)
  4. 전체 검색량에 따른 점수 보정 (평소에 검색량이 많았던 키워드일 수록 점수를 낮게 측정하기 위함)

 

시간 가중치: 실시간 검색어 랭킹에서 최신 정보를 반영하기 위해 시간 가중치를 부여할 수 있다. 최근에 검색된 검색어에는 더 높은 가중치를 적용하여 기대 점수를 산출한다.

 

랭킹 알고리즘에서 추천/비추천 수를 대체할 지표가 없어 평점 기반 랭킹 알고리즘을 활용했다.

 

평점 기반 알고리즘은 아래와 같다.

 

 

위 평점 기반 알고리즘을 바탕으로 1시간 주기로 랭킹이 변하는 검색어 랭킹 알고리즘을 구상해봤다.

검색한 시간대에 따른 점수 보정, 시간 가중치를 적용 하기 위해 x(time) (시간대에 따른 점수 보정) 과 w(time) (시간 가중치)을 적용했다.

 

score = 최근 1시간 검색 횟수 / 24시간 동안의 검색량

totalScore = (score - x(time)) * 2^-ln(일주일 검색량) * w(time)

 

score는 24시간 동안의 검색량 대비 최근 검색량(최근 1시간)의 비율을 나타낸다. 점수가 높을수록 지난 24시간에 비해 최근 검색 빈도가 상대적으로 높다는 것을 나타낼 수 있다.

 

x(time)은 시간대에 따라 값을 다르게 설정해줘야 한다. 예를 들어 검색량이 적은 새벽 시간대는 x의 값을 높여 점수를 낮게 나오도록 하고, 오후 시간대에는 x의 값을 낮춰 점수를 높게한다.

 

w(time)은 검색이 이루어진 시간부터 현재까지의 시간 간격에 비례하도록 설정한다. 1/(현재시간 - 검색한 시간)

 

2^-ln(일주일 검색량) 이 부분이 전체 검색량(과거 일주일)에 따른 점수를 보정한다. -ln함수로 인해 검색량이 많은 키워드의 점수를 보정할 수 있게 된다.

 

 

여기서 좀 더 정확한 값을 위해 "최근 1시간 검색 횟수 / 과거 일주일 동안의 평균 검색 횟수" 값을 적용했다.

 

이 값은 최근 검색 빈도(최근 1시간)와 지난 일주일 동안의 평균 검색 빈도의 비율로, 이 값이 높을수록 과거 일주일 평균에 비해 최근 1시간 동안의 검색 빈도가 높음을 나타낼 수 있다.

 

최종 로직은 아래와 같다.

 

dayScore = "최근 1시간 검색 횟수 / 과거 24시간 검색 횟수"
weekScore = "최근 1시간 검색 횟수 / 과거 일주일 동안의 평균 검색 횟수"
x(time) = 시간대에 따른 보정값
w(time) = 시간에 따른 가중치 "(현재시간 - 검색시간)의 역수"

score = (dayScore * weekScore - x(time)) * 2^-ln(일주일 검색량) * w(time)

 

dayScore와 weekScore를 함께 곱해 최근 검색 빈도가 과거 평균(과거 표준)에서 얼마나 벗어났는지에 따라 점수를 더 정확히 측정할 수 있다.

즉, 최근 한 시간 동안 평소보다 더 자주 검색된 키워드는 더 높은 점수를 받게 되어 인기가 높아졌다는 것을 알 수 있다.

 

이제 고민되는 건 x(time)의 시간대에 따른 값을 얼마로 잡느냐 이 부분은 여러 데이터를 통해 테스트 해보고 정해야 할 것 같다.

 

아직 제대로된 데이터로 테스트해보지는 않아서 위 로직이 정말로 검색어 순위를 정할 수 있을지는 모르겠지만 나름 재밌었다.