인터넷정보

인기도 점수 뽑아오는 클래스(추천 비추천 코멘트 히트수)

알 수 없는 사용자 2007. 10. 11. 23:29
사용자 삽입 이미지


해당 게시물의 인기도를 뽑아오는 클래스 입니다.

클래스 부분은 그냥 복사해서 적당한 파일로 만들어서 서버에 올리고

해당 페이지에선 인클루드 하여 사용합니다.

이하 클래스
______________________________________________________________________

<?

//게시물의 인기도를 측정하는 클래스
class favor_point {

  var $point_good;
  var $point_nogood;
  var $point_comment;
  var $point_defalut_full;

  var $set_default;
  var $set_good;
  var $set_comment;

  function favor_point($point_good=100, $point_comment=30, $point_defalut_full=5000, $set_default=70, $set_good=15, $set_comment=15){

    $this->set_point($point_good, $point_comment, $point_defalut_full);
    $this->set_setting($set_default, $set_good, $set_comment);

    if (empty($this->point_good) || empty($this->point_nogood) || empty($this->point_comment) || empty($this->point_defalut_full) || empty($this->set_default) || empty($this->set_good) || empty($this->set_comment)) {

      die('favor_point : 제대로 된 변수값이 설정되지 않았습니다.');
    }
  }

  function set_point($point_good, $point_comment, $point_defalut_full){

    if ($point_good < 1 || $point_comment < 1 || $point_defalut_full < 1 || !is_numeric($point_good) || !is_numeric($point_comment) || !is_numeric($point_defalut_full)) return;
    $this->point_good =  $point_good;
    $this->point_nogood = ceil($point_good * (-1.1));
    $this->point_comment = $point_comment;
    $this->point_defalut_full = $point_defalut_full;
  }

  function set_setting($set_default, $set_good, $set_comment){

    if ($set_default < 1 || $set_good < 1 || $set_comment < 1 || !is_numeric($set_default) || !is_numeric($set_good) || !is_numeric($set_comment)) return;

    if ($set_default + $set_good + $set_comment != 100) return;

    $this->set_default = $set_default;
    $this->set_good = $set_good;
    $this->set_comment = $set_comment;
  }

  function get_favor_point($good, $nogood, $comment, $hit, $date=''){

    $return = Array();

    if (empty($date)) $date = date("Y-m-d");
    $day = ceil((time() - strtotime($date)) / 86400);
    $rule = $this->autochange_rule($day);

    $return['default'] = ceil((($good * $rule['point_good']) + ($nogood * $rule['point_nogood']) + ($comment * $rule['point_comment']) + $hit) / $rule['point_defalut_full'] * $rule['set_default']);

    if ($return['default'] > $rule['set_default']) $return['default'] = $rule['set_default'];
    else if ($return['default'] < 0) $return['default'] = 0;

    if ($good > 0 && $good > $nogood) {

      $return['good'] = ceil((1 - ($hit / (($good * $rule['point_good']) + ($nogood * $rule['point_nogood'])))) * $rule['set_good']);

      if ($return['good'] > $rule['set_good']) $return['good'] = $rule['set_good'];
      else if ($return['good'] < 0) $return['good'] = 0;
    }
    else {

      $return['good'] = 0;
    }

    if ($comment > 0) {

      $return['comment'] = ceil((1 - ($hit / ($comment * $rule['point_comment']))) * $rule['set_comment']);

      if ($return['comment'] > $rule['set_comment']) $return['comment'] = $rule['set_comment'];
      else if ($return['comment'] < 0) $return['comment'] = 0;
    }
    else {

      $return['comment'] = 0;
    }

    $return['total'] = $return['default'] + $return['good'] + $return['comment'];
    return $return;
  }

  //글작성일에 따른 포인트 자동 변환
  function autochange_rule($day){

    $return = Array();
    $return['point_good'] = $this->point_good;
    $return['point_nogood'] = $this->point_nogood;
    $return['point_comment'] = $this->point_comment;
    $return['point_defalut_full'] = $this->point_defalut_full;

    $return['set_default'] = $this->set_default;
    $return['set_good'] = $this->set_good;
    $return['set_comment'] = $this->set_comment;

    if ($day >=31 && $day < 91) {//31일에서 90일 사이 5프로 적용

      $return = $this->calculation(5);
    }
    else if ($day >=91 && $day < 181) {//91일에서 180일 사이 10프로 적용

      $return = $this->calculation(10);
    }
    else if ($day >=181) {//181일 이상 15프로 적용

      $return = $this->calculation(15);
    }

    return $return;
  }

  function calculation($per){

    $return = Array();
    $per1 = (float)(1.00 + ($per * 0.01));
    $per2 = (float)(1.00 - ($per * 0.01));

    $return['point_good'] = ceil($this->point_good * ($per1));
    $return['point_nogood'] = ceil($return['point_good'] * (-1.1));
    $return['point_comment'] = ceil($this->point_comment * ($per1));
    $return['point_defalut_full'] = ceil($this->point_defalut_full * ($per1));

    $return['set_default'] = ceil($this->set_default * ($per2));//기본 점수 분포를 지정된 퍼센트로 낮춤
   
    $temp = (100 - $return['set_default'] - $this->set_good - $this->set_comment);
    $temp2 = ceil($temp / 2);
    $temp3 = (2 * $temp2) - $temp;
    $add_set_good = $temp2;
    $add_set_comment = $temp2 - $temp3;

    $return['set_good'] = $this->set_good + $add_set_good;
    $return['set_comment'] = $this->set_comment + $add_set_comment;

    return $return;
  }
}

?>

_______________________________________________________________________

용어는 적절하지 않을수 있습니다.

인기도를 산출하는 방식은

기본점수 와 추천점수 와 코멘트점수의 합으로서 산출합니다.


기본점수는 다음과 같은 방식으로 산출합니다.

추천 한개당 점수 산정 200 (즉 평균 페이지뷰 몇번에 추천한개 일어나는가)
비추천 한개당 점수 산정 -220 (추천한개당 점수에서 패널티를 10프로 적용해서 자동 적용)
코멘트 한개 점수 산정 100 (즉 평균 페이지뷰 몇번에 코멘트한개 일어나는가)
페이지뷰 한개 점수 1 (고정)
기본점수 만점 2000 (추천 코멘트 없이 페이지뷰가 2000이면 기본점수 만점이다라는 뜻)
기본점수 분포 70 전체 인기도 점수중 기본점수를 몇프로로 칠것인가를 지정
기본점수 = (추천점수 합 + 비추천점수 합 + 코멘트점수 합 + 히트수) / 기본점수 만점 * 기본점수 분포
기본점수는 시간이 지날수록 증가하는 값입니다. 그러나 기본점수분포를 넘을수 없습니다.


추천점수는 다음과 같은 방식으로 산출합니다.
추천점수 분포 15 전체 인기도 점수중 추천점수를 몇프로로 칠것인가를 지정
추천점수 = (1 - (전체 페이지뷰 / (추천점수 합 + 비추천점수 합))) * 추천점수 분포
추천점수의 의미는 게시물의 질을 나타냅니다.
추천점수는 시간이 지날수록 감소할수 있는 값입니다.


코멘트점수는 다음과 같은 방식으로 산출합니다.
코멘트점수 분포 15 전체 인기도 점수중 코멘트점수를 몇프로로 칠것인가를 지정
코멘트점수 = (1 - (전체 페이지뷰 / 코멘트점수 합)) * 코멘트점수 분포
코멘트점수의 의미는 게시물의 질을 나타냅니다.
코멘트점수는 시간이 지날수록 감소할수 있는 값입니다.


1개월 미만은 그대로
3개월 미만은 5프로
6개월 미만은 10프로
그이상은 15프로를 적용하여
기본점수 분포를 낮추고, 반대로 추천점수 분포와 코멘트 점수 분포를 자동으로 계산으로 올립니다.



사용법은 해당 클래스를 해당 페이지에서 인클루드 한다음
객체를 생성합니다.

//그누보드 리스트 스킨에서 사용예
//인기도 관련 클래스 인클루드
include_once("$g4[path]/lib/favor_point.lib.php");
$favor_point = new favor_point(200, 100, 2000, 70, 15, 15);

이런식으로........
이것은 페이지에서 딱 한번 실행하면 됩니다.
$favor_point = new favor_point(200, 100, 2000, 70, 15, 15);
여기의 수치에 대한 것은
200 은 추천 하나에 대한 점수입니다.
100 은 코멘트 하나에 대한 점수입니다.
2000 은 기본 점수 만점입니다.
70은 기본점수 분포입니다.
15는 추천점수 분포입니다.
15는 코멘트점수 분포입니다.
마지막 세개의 인자는 합이 100 이어야 하고 모두 양의 정수만 사용해야 합니다.


출력해줄 곳에서는

<? $return = $favor_point->get_favor_point($list[$i]['wr_good'], $list[$i]['wr_nogood'], $list[$i]['wr_comment'], $list[$i]['wr_hit'], $list[$i]['wr_datetime']); ?>
<td>
  <table cellpadding=0 cellspacing=0 border=0 width=81 height=13 background='<?=$board_skin_path?>/img/star_s_bg.gif' title='<?=$return['total']?>%' style='margin: 2 0 2 0;'>
    <tr>
      <td>
        <table cellpadding=0 cellspacing=0 border=0 width=<?=$return['total']?>% height=13 background='<?=$board_skin_path?>/img/star_s.gif'><tr><td></td></tr></table>
      </td>
    </tr>
  </table>
</td>

이런식으로 사용하면 됩니다.


<? $return = $favor_point->get_favor_point($list[$i]['wr_good'], $list[$i]['wr_nogood'], $list[$i]['wr_comment'], $list[$i]['wr_hit'], $list[$i]['wr_datetime']); ?>
이것에 대한 설명은
인자가 순서대로 추천수, 비추천수, 코멘트수, 히트수, 작성일 입니다.
작성일은 date 형식이나 datetime형식이나 관계없습니다.


점수나 분포는 자신에 맞게 설정하여 사용하세요.

반응형