Django 웹 프로젝트를 하면서 인기글을 구현해야 하는 상황이 생겼다. 처음 생각한 방법은 저장, 댓글, 조회수를 기준으로 점수를 매기는 것을 생각하였다. 그런데 조금만 생각해 보면 여기에는 문제가 있다는 것을 알 수 있다.
우선, 오래된 인기글일 수록 점수가 높게 측정된다는 것이다. 또한 이미 인기글이 있는 상태에서 새로 작성한 글이 인기글로 올라가기는 시간이 지날수록 불가능해진다는 것이다.
이러한 현상이 생기는 이유는 상위에 있는 인기 글들이 계속 상단에 노출되어 점수는 계속 얻어가는 것에 반해 새로 작성된 글의 경우는 점수가 아직 생성되지않아 아래쪽에 배치되고 결국 노출자체가 어려워지기 때문이다.
이러한 문제를 해결하기 위해 생각해낸 방법이 여러 가지가 있다.
1. 최근 일주일동안 작성한 게시글만 인기글로 등록이 가능하게 설정한다.
2. 인기글에 한번 올라가고 나면 며칠 후 인기글에서 내려가고 며칠 동안 인기글에 들어오지 못하게 한다.
3. 인기글에 시간 점수를 매겨 시간이 지날수록 점수가 줄어들도록 설정한다.
이 중 내가 선택한 방법은 3번째 방법인데, 우선 첫번째의 경우는 양적으로나 질적으로나 좋은 글이지만 다시 인기글로 등록이 불가능해져서 결국 묻히게 되는 경우가 있을 것 같다고 생각했고 2번의 경우는 인기글에 올랐던 글이 중복해서 계속 올라오는 경우도 생길 수 있다고 생각했다. (몇 개의 그룹으로 나눠서 번갈아가며 올라오는 경우도 있을 것 같았다.)
그래서 검색해보니 Aging 기법이라는 게 있었다.
Aging 기법
Aging 기법은 점수를 시간으로 나누는 방법이다.
Score = (likes + views + comments) / times
우리 프로젝트에서는 좋아요, 조회수, 댓글 수를 비율을 섞어서 사용하였기 때문에 위처럼 표현하였다.
이렇게 하면 컨텐츠가 오래될수록 점수가 줄어든다. 점수가 늘어나게 시간이 늘어나는 것보다 빠르다면 계속 인기글로 남아 있겠지만. 오래된 콘텐츠는 점점 아래로 내려가게 될 것이다.
물론 like, view, comment에 -1을 함으로써 자신의 올린 점수를 제외할 수도 있고 times에 더하거나 제곱을 해줘서 수정 할 수도 있다.
참고
https://seungjjun.tistory.com/282
[개발일지] 230607 Ranking Algorithm(순위 알고리즘)
실시간 급상승 검색어 기능을 위한 Ranking Algorithm에 대한 조사 우선 공개된 Ranking Algorithm을 살펴보면 게시글의 추천수를 기반으로 인기 게시글을 선별해 사용자에게 추천해 주는 알고리즘, 추천/
seungjjun.tistory.com
https://destiny738.tistory.com/581
[Ranking Algorithm] 인기순 알고리즘 (음원사이트 & Reddit basic & Hacker News)
1. 여는글 어떻게 하면 질리지 않고(똑같은 화면이 반복되지 않고), 인기순을 최대한 반영해주는 페이지를 보여줄수 있을까? 컨텐츠를 관리하는 입장에서 한번씩 막히는 부분이 위와 같은 의문
destiny738.tistory.com
'Django > DRF' 카테고리의 다른 글
DRF JWT를 이용하여 유저 정보 GET/POST (0) | 2023.10.11 |
---|---|
DRF Image DB 저장, 스웨거 적용 (0) | 2023.10.10 |
클라우드 타입으로 Django, postgreSQL 서버 배포 (1) | 2023.08.09 |
Django의 OneToOneField와 ForeignKey의 차이점 (0) | 2023.05.23 |
Django 모델 관계에 대한 이해 - 양방향 참조와 단방향 참조 (0) | 2023.05.23 |