I threw together a Mahout/Taste based item-item based recommender last night.
public static void itemItemRecommendations(String path, String file) {
File f = new File(path, file);
try {
DataModel model = new FileDataModel(f);
model.refresh(null);
ItemSimilarity itemSimilarity = new LogLikelihoodSimilarity(model);
ItemBasedRecommender itemRecommender = new GenericItemBasedRecommender(model, itemSimilarity);
for ( Item i : model.getItems() )
for ( RecommendedItem j : itemRecommender.mostSimilarItems(i.getID(), 50) )
if ( j.getValue() >= 0.7 )
System.out.println(i.getID() + "\t" + j.getItem().getID() + "\t" + String.format("%.3f", j.getValue()));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TasteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
This outputs item1 –recommends–>item2 pairs with a weight. I’m taking this and putting it into a solr document so I can display related item2s alongside item1 when it’s viewed.
Input data are comma-delimited tuples like so:
1fe7401b81eed49353d0cbeba5383848,5212,0.6
3c1832954a6e8781836fed670bb37b24,5212,1
70273e4c7c77700ee97acb8d0306c405,5213,0.8
1f057ccde135acbc881008bbf466e7e1,5213,1
51d44c7baca65ad39d11ba87bf2d438b,5213,1
adc924559b37114cd97d1f5cf7c71419,5213,1
78e254b4a11e61d76ff63cea02de4de8,5213,1
5c373ec7d9ad4a6f392c291d8ccba5ce,5213,0.2
fab8537564094fa8885f6214e6b682e1,5213,1
127f46aabcdbc2d2d04da8398a996c75,5213,1
Works great. Thanks Sean.