2012-01-07 3 views
1

마호 우트에서는 GenericItemBasedRecommender에 대해 CandidateItemsStrategy을 정의 할 수 있습니다. 특정 카테고리의 GenericUserBasedRecommender을 사용할 때 이것은 불가능합니다. GenericUserBasedRecommender으로 어떻게이 작업을 수행 할 수 있습니까? IDRescorer을 사용하여이 작업을 수행 할 수있는 유일한 방법입니까? 가능한 경우 IDRescorer을 사용하지 않는 것이 좋습니다. 도와 줘서 고마워! 항목을 기반으로 추천인에 대한 Mahout의 GenericUserBasedRecommender에 대한 후보 전략

[편집]

나는 이런 식으로 그것을 할 : 사용자 기반 추천인에 대한

private final class OnlySpecificlItemsStrategy implements CandidateItemsStrategy { 
    private final JpaDataModel dataModel; 

    public OnlySpecificlItemsStrategy(JpaDataModel dataModel) { 
     this.dataModel = dataModel; 
    } 

    @Override 
    public FastIDSet getCandidateItems(long userID, PreferenceArray preferencesFromUser, DataModel dataModel) throws TasteException { 
     List<Long> specificlItemIDs = this.dataModel.getSpecificlItemIDs(); 
     FastIDSet candidateItemIDs = new FastIDSet(); 

     for (long itemID : specificlItemIDs) 
      candidateItemIDs.add(itemID); 

     for (int j = 0; j < preferencesFromUser.length(); j++) 
      candidateItemIDs.remove(preferencesFromUser.getItemID(j)); 

     return candidateItemIDs; 
    } 

} 

나는 Rescorer 함께 할 :

public class FilterIDsRescorer implements IDRescorer { 

    FastIDSet allowedIDs; 

    public FilterIDsRescorer(FastIDSet allowedIDs) { 
     this.allowedIDs = allowedIDs; 
    } 

    @Override 
    public double rescore(long id, double originalScore) { 
     return originalScore; 
    } 

    @Override 
    public boolean isFiltered(long id) { 
     return !this.allowedIDs.contains(id); 
    } 

} 

다음 다음과 같이 설정하십시오.

List<Long> specificItemIDsList = dataModel.getOtherSpecificlItemIDs(); 
FastIDSet specificItemIDs = new FastIDSet(specificItemIDsList.size()); 
for (Long id : specificItemIDsList) { 
    specificItemIDs.add(id); 
} 
this.filterIDsRescorer = new FilterIDsRescorer(specificItemIDs); 
userBasedRecommender.recommend(userID, howMany, this.filterIDsRescorer) 

특정 항목을 필터링/제외하기 위해 각 추천 자 유형에 대한 데이터 모델을 서브 클래스화할 수 있지만 성능에 영향을주는 동일한 데이터 모델 인스턴스를 공유 할 수 없습니다.

답변

1

이렇게하는 방법은 없습니다. 사용자 기반 및 항목 기반 알고리즘은 대칭 적이 지 않으며 대부분 목적에 부합합니다. 사용자 기반 시스템은 이미 이웃 아이디어라는 개념을 가지고 있습니다. IDRescorer과 관련이 없습니다.

+0

답변 해 주셔서 감사합니다. 어쩌면 제 질문이 충분히 명확하지 않을 수도 있습니다. 나는 내 질문을 편집하여 그 순간에 내가 어떻게하는지 볼 수있다. 나는 이것이 갈 길인지 또는 더 효율적이고 우아한 해결책이 있는지를 알고 싶다. 또 다른 솔루션은 내 데이터 모델을 서브 클래스 화하고 모든 항목 대신 "특정"항목 만 반환 할 수 있습니다. 어떻게 생각해? – Sbhklr

+0

아, 네가하고 싶다면 IDRescorer를 원한다. 모든 권장 사항에 적용됩니다. 귀하의 CandidateItenStrategy 버전은 실제로 항목 기반의 최적화이며 또한 작동해야합니다. –