MovieRescorer.java
import java.io.File;
import java.io.IOException;

import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.impl.common.FastIDSet;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.recommender.Rescorer;
import org.apache.mahout.common.iterator.FileLineIterable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * #####################
 * # 영화 Rescore및 Filter
 * #####################
 * 
 * > Rescorer 인터페이스 구분
 * ---------------------------------------------------
 *   Doc URL : https://builds.apache.org/job/Mahout-Quality/ws/trunk/core/target/site/apidocs/index.html
 * 
 *  1) IDRescorer : 사용자 기반, rescore(long userId, double originalScore)
 *     A Rescorer which operates on long primitive IDs, rather than arbitrary Objects. 
 *     This is provided since most uses of this interface in the framework take IDs (as long) as an argument, 
 *     and so this can be used to avoid unnecessary boxing/unboxing. 
 *   
 *  2) Rescorer : 사용자 또는 아이템 기반, rescore(Object itemID, double originalScore)
 *     A Rescorer simply assigns a new "score" to a thing like an ID of an item or 
 *     user which a Recommender is considering returning as a top recommendation. 
 *     It may be used to arbitrarily re-rank the results according to application-specific logic before returning recommendations. 
 *     For example, an application may want to boost the score of items in a certain category just for one request. 
 *     
 *     A Rescorer can also exclude a thing from consideration entirely by returning true from isFiltered(Object). 
 */
public class MovieRescorer implements Rescorer{
    
    private static final Logger logger = LoggerFactory.getLogger(MovieRescorer.class);

    private final FastIDSet movieSetFilter;  // 필터 처리 데이터 셋
    private final FastIDSet movieSetWeighted;  // 가중치 적용 데이터 셋
    private final FastIDSet movieSetWeightedDate;  // 가중치 적용 데이터 셋
    private final FastIDSet movieSetGenre;  // 가중치 적용 데이터 셋
    private final FastIDSet movieSetGrade;  // 가중치 적용 데이터 셋

    public MovieRescorer(
            FastIDSet movieSetFilter,
            FastIDSet movieSetWeighted,
            FastIDSet movieSetWeightedDate,
            FastIDSet movieSetGenre,
            FastIDSet movieSetGrade,
            long movieSeq, 
            DataModel model) throws TasteException {
        this.movieSetFilter = movieSetFilter;
        this.movieSetWeighted = movieSetWeighted;
        this.movieSetWeightedDate = movieSetWeightedDate;
        this.movieSetGenre = movieSetGenre;
        this.movieSetGrade = movieSetGrade;
    }


    /**
     * # 영화 정보 데이터를 파싱, 각 FastIDSet에 저장
     */
    public static FastIDSet[] parseMovieSet(File movieFile) throws IOException {
        logger.info("# parseMovieSetFilter :"+movieFile);
        
        FastIDSet movieSetFilter = new FastIDSet(50000);  // 필터 처리 데이터 셋
        FastIDSet movieSetWeighted = new FastIDSet(50000); // 가중치 적용 데이터 셋

        for(String line : new FileLineIterable(movieFile)){
            String[] column = line.split(",");

            // 작업 구분 코드 : N(작업없음), F(필터링), W(가중치 적용)
            long itemID = Long.parseLong(column[0]); // 영화 번호
            String reco_openDate = column[1];  // 영화 개봉일
            String reco_type = column[2];  // 작업 구분 코드

            if(reco_type.equals("F")){ // F(Filter) 이면 필터처리 대상, movieSetFilter에 저장
                movieSetFilter.add(itemID);
            }else if(reco_type.equals("W")){ // W(Weighted) 이면 가중치 대상, movieSetWeighted에 저장
                movieSetWeighted.add(itemID);
            }
        }
        
        // 빠른 접속을 위해 최적화
        movieSetFilter.rehash();
        movieSetWeighted.rehash();
        return new FastIDSet[] { movieSetFilter, movieSetWeighted };
    }    


    /**
     * # 특정 대상 아이템에 가중치 적용
     * > 추출된 모든 대상이 rescore() 메서드를 거침
     */
    @Override
    public double rescore(Object itemID, double originalScore) {
        String[] itemIDArr = itemID.toString().replaceAll("[(|)]", "").split(",");
        double reScore = 1.0;
        long itemIDSet = Long.parseLong(itemIDArr[1]);

        // moiveSetWeighted 데이터 셋에 해당하는 아이템에 대해서 가중치 적용
        if(movieSetWeighted.contains(itemIDSet)){
            reScore += 0.2;
        }

        // 개봉일이 1년 미만에 해당하는 데이터 셋에 대해서 가중치 적용
        if(movieSetWeightedDate.contains(itemIDSet)){
            reScore += 0.1;
        }
        
        // 동일한 장르에 가중치 적용
        if(movieSetGenre.contains(itemIDSet)){
            reScore += 0.1;
        }
        
        // 동일한 관람 등급에 가중치 적용
        if(movieSetGrade.contains(itemIDSet)){
            reScore += 0.2;
        }
        
        reScore = originalScore * reScore;

        // 필터처리가 true이면 NaN으로 추출 제외하고, false이면 현재의 스코어를 대입하여 추출
        return isFiltered(itemID) ? Double.NaN : reScore; // 프로파일의 NaN(Not a Number)을 실행
    }


    /** 
     * # 특정 대상 아이템 필터링
     * > 추출된 모든 대상이 isFiltered() 메서드를 거침
     * 
     * 리턴값 : true(필터링 처리:비추출), false(필터링 제외:추출)
     */
    @Override
    public boolean isFiltered(Object itemID) {
        String[] itemIDArr = itemID.toString().replaceAll("[(|)]", "").split(",");

        // movieSetFilter에 해당 itemID가 존재할때 필터 처리
        if(movieSetFilter.contains(Long.parseLong(itemIDArr[1]))){
            logger.info("# isFiltered :"+itemID);
            return true;
        }else{
            return false;
        }
    }    

}

※ 위 내용은, 여러 자료를 참고하거나 제가 주관적으로 정리한 것입니다.
   잘못된 정보나 보완이 필요한 부분을, 댓글 또는 메일로 보내주시면 많은 도움이 되겠습니다.
04 17, 2014 17:53 04 17, 2014 17:53


Trackback URL : http://develop.sunshiny.co.kr/trackback/1004

Leave a comment
[로그인][오픈아이디란?]
오픈아이디로만 댓글을 남길 수 있습니다

« Previous : 1 : ... 40 : 41 : 42 : 43 : 44 : 45 : 46 : 47 : 48 : ... 648 : Next »

Recent Posts

  1. HDFS - Python Encoding 오류 처리
  2. HP - Vertica ROS Container 관련 오류...
  3. HDFS - Hive 실행시 System Time 오류
  4. HP - Vertica 사용자 쿼리 이력 테이블...
  5. Client에서 HDFS 환경의 데이터 처리시...

Recent Comments

  1. 안녕하세요^^ 배그핵
  2. 안녕하세요^^ 도움이 되셨다니, 저... sunshiny
  3. 정말 큰 도움이 되었습니다.. 감사합... 사랑은
  4. 네, 안녕하세요. 댓글 남겨 주셔서... sunshiny
  5. 감사합니다 많은 도움 되었습니다!ㅎㅎ 프리시퀸스

Recent Trackbacks

  1. phoenix seo phoenix seo %M
  2. animal mobility services animal mobility services %M
  3. face masks face masks %M
  4. healer healer 5 07
  5. small dog wheelchair small dog wheelchair 5 07

Calendar

«   07 2020   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

Bookmarks

  1. 위키피디아
  2. MysqlKorea
  3. 오라클 클럽
  4. API - Java
  5. Apache Hadoop API
  6. Apache Software Foundation
  7. HDFS 생태계 솔루션
  8. DNSBL - Spam Database Lookup
  9. Ready System
  10. Solaris Freeware
  11. Linux-Site
  12. 윈디하나의 솔라나라

Site Stats

TOTAL 3000408 HIT
TODAY 860 HIT
YESTERDAY 401 HIT