net.myrrix.online.MultiRescorerProvider Maven / Gradle / Ivy
/*
* Copyright Myrrix Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.myrrix.online;
import java.util.List;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import org.apache.mahout.cf.taste.recommender.IDRescorer;
import org.apache.mahout.cf.taste.recommender.Rescorer;
import org.apache.mahout.common.LongPair;
import net.myrrix.common.MyrrixRecommender;
/**
* Convenience implementation that will aggregate the behavior of multiple {@link RescorerProvider}s.
* It will filter an item if any of the given instances filter it, and will rescore by applying
* the rescorings in the given order.
*
* @author Sean Owen
* @since 1.0
* @see MultiRescorer
* @see MultiLongPairRescorer
*/
public final class MultiRescorerProvider extends AbstractRescorerProvider {
private final RescorerProvider[] providers;
public MultiRescorerProvider(RescorerProvider... providers) {
Preconditions.checkNotNull(providers);
Preconditions.checkArgument(providers.length > 0, "providers is empty");
this.providers = providers;
}
public MultiRescorerProvider(List providers) {
Preconditions.checkNotNull(providers);
Preconditions.checkArgument(!providers.isEmpty());
this.providers = providers.toArray(new RescorerProvider[providers.size()]);
}
@Override
public IDRescorer getRecommendRescorer(long[] userIDs, MyrrixRecommender recommender, String... args) {
List rescorers = Lists.newArrayListWithCapacity(providers.length);
for (RescorerProvider provider : providers) {
IDRescorer rescorer = provider.getRecommendRescorer(userIDs, recommender, args);
if (rescorer != null) {
rescorers.add(rescorer);
}
}
return buildRescorer(rescorers);
}
@Override
public IDRescorer getRecommendToAnonymousRescorer(long[] itemIDs, MyrrixRecommender recommender, String... args) {
List rescorers = Lists.newArrayListWithCapacity(providers.length);
for (RescorerProvider provider : providers) {
IDRescorer rescorer = provider.getRecommendToAnonymousRescorer(itemIDs, recommender, args);
if (rescorer != null) {
rescorers.add(rescorer);
}
}
return buildRescorer(rescorers);
}
@Override
public IDRescorer getMostPopularItemsRescorer(MyrrixRecommender recommender, String... args) {
List rescorers = Lists.newArrayListWithCapacity(providers.length);
for (RescorerProvider provider : providers) {
IDRescorer rescorer = provider.getMostPopularItemsRescorer(recommender, args);
if (rescorer != null) {
rescorers.add(rescorer);
}
}
return buildRescorer(rescorers);
}
private static IDRescorer buildRescorer(List rescorers) {
int numRescorers = rescorers.size();
if (numRescorers == 0) {
return null;
}
if (numRescorers == 1) {
return rescorers.get(0);
}
return new MultiRescorer(rescorers);
}
@Override
public Rescorer getMostSimilarItemsRescorer(MyrrixRecommender recommender, String... args) {
List> rescorers = Lists.newArrayListWithCapacity(providers.length);
for (RescorerProvider provider : providers) {
Rescorer rescorer = provider.getMostSimilarItemsRescorer(recommender, args);
if (rescorer != null) {
rescorers.add(rescorer);
}
}
int numRescorers = rescorers.size();
if (numRescorers == 0) {
return null;
}
if (numRescorers == 1) {
return rescorers.get(0);
}
return new MultiLongPairRescorer(rescorers);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy