공지사항을 보여주는 데, 상위 5개의 공지사항을 보여주고자 한다.
근데 어떤식으로 선정하면 좋을까? 라는 고민을 하게 되었다.
추천/비추천 기능이 있다면 조금 더 직관적으로 개발할 수 있었겠지만
이건 조회수, 공지 등록일, 공지 업데이트일, 북마크수가 전부이기 때문이다.
이걸 기준으로 순위를 매겨야하는데 다음과 같은 고민을 거쳤다.
1. 공지 업데이트일을 신경써야하나?
왜냐하면, 매일마다 공지를 업데이트하여 상위에 노출하는 분이 계셨기 때문이다.
그러면 해당 공지는 당연히 조회수가 많아질 수 밖에 없고 항상 Top 5안에 들지 않을까 라는 생각이 들었다.
(또한, 이게 악용된다면 모든 공지사항은 매일마다 Top 5에 들기위해 업데이트 될 수도 있다는 생각이 들었다.)
그래서 공지 등록일과 업데이트일 사이의 차이를 구해서 마이너스 요소로 넣을지, 아니면 업데이트 횟수를 구할 지 등을 고민했지만
너무 많은 변수를 다루면 이후에 문제가 발생되었을 때 더 꼬일것이라고 생각했다.
따라서 과감히 공지 업데이트일은 빼기로 하였다.
2. 그러면 어떻게 해결할 것인가?
아까 말했듯, 공지를 상위 노출하면 조회수 증가로 이어진다. 그러면 막 올라온 조회수 10인 공지와, 업데이트 된 조회수 10000인 공지가 있을 때 당연히 업데이트 된 공지가 더 주목될 것이다.
그렇다면 1/x함수와 오늘 날짜와 공지 등록일 사이의 days를 적절히 혼합하여 사용하면 업데이트 되더라도 오래된 것이기 때문에 더 많은 패널티를 받을 것이라고 생각하였다.
3. 마지막으로 북마크수는?
조회수가 높은 공지도 두 가지 종류가 있다고 생각한다.
계속 수정이 되어 확인해야 할 정도로(신청을 받는다거나... 등등) 조회수가 높은 공지와, 일회성 공지라고 생각했다.
그럼 계속 수정이 된다는 것은 결국 북마크를 해둘 필요가 있다고 생각이 들었고(그렇지 않으면 일일이 찾아야 하니깐)
북마크가 된다는건 일회성 공지와의 차이점이 생긴다는 것이니까 플러스 요소로 적용해야 등록일로부터 많이 지나도 우위가 생길 수 있다고 생각했다.
그래서 이것은 log함수와 적절히 혼합하여 사용하고자 했다.
그 이유는 막 올라온 공지가 주목받을 수 있다는 장점이 있으며,
오래된 공지인 경우에는 북마크가 좀 쌓였다는 가정하에 북마크가 늘어날수록 차이가 작아져야 한다고 생각했기 때문이다.
따라서 내가 내린 함수식은 다음과 같다.
score = (views + 500*log_2(bookmark_count + 1)) / (1.5)^(now - created_at)
1 북마크 = 500 조회수와 같으며
그 이후로는
10 북마크 = 1660 조회수처럼 증가폭을 천천히 줄여나가는 식으로 하였다.
이러면 초반에 나온 공지가 주목받을 확률이 높다고 생각하였다.
또한 1/1.5^(now - created_at)를 곱하여 날이 갈수록 비중이 점점 줄어들도록 하였다.
예를 들어 어제 올라온 공지 중 조회수는 2000, 북마크수는 1이라면 값은 1667이지만
3일전에 올라온 공지 중 조회수는 5000, 북마크수는 3이라면 1776으로 서로 비슷한 값을 가져갈 수 있다고 생각했기 때문이다.
참고로 log안에 북마크+1인 이유는
북마크의 값이 0이상이기 때문에 log0이 되는걸 막기위해 1만큼 더해주었다.
물론 아직 적용하지 않아서 결과가 어떻게 나올지 모르겠다.
날이 지나도 공지가 계속 상위에 있다면 1.5에서 값을 조금씩 올려서 조정할 계획이고
bookmark의 의미가 적다면 아마도 곱하는 값을 줄인다거나, 밑의 값을 변경할 계획이다.
'💻 소프트웨어(SW) > 혼자 만든 프로젝트' 카테고리의 다른 글
[백준] 자동으로 문제 선정해서 가져오기 - 2 (1) | 2024.02.09 |
---|---|
[백준] 자동으로 문제 선정해서 가져오기 - 1 (0) | 2024.02.08 |