익명 사용자에게 추천하기
익명 사용자에게 추천하기
PlusAnonymousUserDataModel의 임시사용자 추천하기
추천 프레임워크는 PlusAnonymousUserDataModel 클래스를 사용해서 임시로 익명 사용자의 정보를 DataModel에 더하는 단순한 방법을 제공 한다. 이러한 접근에서는 추천할 때만 익명 사용자를 실제 ID를 가진 사용자처럼 취급한다. 익명 사용자의 정보는 실제로 지속적으로 관리할 근본적인 DataModel에는 추가하지 않는다. PlusAnonymousUserDataModel은 기존의 어떤 DataModel도 포함하고 단순하게 교체도 가능하다.
PlusAnonymousUserDataModel은 하나의 임시 사용자를 위한 것인데, 한 번에 한 명의 사용자의 선호를 저장한다. 따라서 이 클래스를 기반으로 하는 추천기는 반드시 익명의 사용자를 한 명씩 처리해야 한다.
기존의 LibimsetiRecommender를 익명 사용자 추천이 가능하도록 확장한 LibimdsetiWithAnonymousRecommender를 볼 수 있다. 당연히 LibimsetiWithAnonymousRecommender는 입력값으로 사용자 ID가 아니라 선호를 사용한다.
------------------------------------------------------------------------------------------
import java.io.IOException;
import java.util.List;
import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.impl.model.GenericUserPreferenceArray;
import org.apache.mahout.cf.taste.impl.model.PlusAnonymousUserDataModel;
import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.model.PreferenceArray;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
public class LibimsetiWithAnonymousRecommender extends LibimsetiRecommender {
private final PlusAnonymousUserDataModel plusAnonymousModel;
public LibimsetiWithAnonymousRecommender() throws TasteException, IOException{
this(new FileDataModel(readResourceToTempFile("C:/Users/JeonJongHee/Downloads/libimseti-complete/libimseti/ratings.dat")));
}
public LibimsetiWithAnonymousRecommender(DataModel model)
// 기본 DataModel 랩팽하기
throws TasteException, IOException {
super(new PlusAnonymousUserDataModel(model));
plusAnonymousModel = (PlusAnonymousUserDataModel) getDataModel();
// TODO Auto-generated constructor stub
}
public synchronized List<RecommendedItem> recommend(PreferenceArray anonymousUserPrefs, int howMany) throws TasteException{ // 동기화 사용하기
plusAnonymousModel.setTempPrefs(anonymousUserPrefs);
List<RecommendedItem> recommendations = recommend(PlusAnonymousUserDataModel.TEMP_USER_ID, howMany, null);
plusAnonymousModel.clearTempPrefs();
return recommendations;
}
/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
PreferenceArray anonymousPrefs = new GenericUserPreferenceArray(3);
// 익명의 사용자 선호 저장하기
anonymousPrefs.setUserID(0, PlusAnonymousUserDataModel.TEMP_USER_ID);
anonymousPrefs.setItemID(0, 123L);
anonymousPrefs.setValue(0, 1.0f);
anonymousPrefs.setItemID(1, 123L);
anonymousPrefs.setValue(1, 3.0f);
anonymousPrefs.setItemID(2, 123L);
anonymousPrefs.setValue(2, 2.0f);
LibimsetiWithAnonymousRecommender recommender =
new LibimsetiWithAnonymousRecommender();
List<RecommendedItem> recommendations =
recommender.recommend(anonymousPrefs, 10);
System.out.println(recommendations);
}
}