package com.lovego.cloud.perception.mahout;
import java.net.UnknownHostException;
import java.util.Collection;
import java.util.Map;
import org.apache.mahout.cf.taste.impl.common.FastByIDMap;
import org.apache.mahout.cf.taste.impl.model.GenericDataModel;
import org.apache.mahout.cf.taste.impl.model.GenericPreference;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.model.Preference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.Lists;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.Mongo;
public final class MongoModel {
private static final Logger log = LoggerFactory.getLogger(MongoModel.class);
private static final String DEFAULT_USER_FIELD = "user";
private static final String DEFAULT_ITEM_FIELD = "item";
private static final String DEFAULT_RATING_FIELD = "score";
private static final String DEFAULT_IPADDR = "127.0.0.1";
private static final int DEFAULT_PORT = 27017;
private static final String DEFAULT_DBNMAE = "recommend";
private static final String DEFAULT_TABLE_NMAE = "preference";
private String m_strHost;
private int m_iPort;
private String m_strDBName;
private String m_strTableName;
private String m_strUserFieldName;
private String m_strItemFileldName;
private String m_strScoreFieldName;
private DataModel m_oDataModel;
public MongoModel(String strHost, int port, String strDBName, String strTableName, String strUserFiledName,
String strItemFiledName, String strScoreFiledName) throws UnknownHostException {
m_strHost = strHost != "" ? strHost : DEFAULT_IPADDR;
m_iPort = port > 0 ? port : DEFAULT_PORT;
m_strDBName = strDBName != "" ? strDBName : DEFAULT_DBNMAE;
m_strTableName = strTableName != "" ? strTableName : DEFAULT_TABLE_NMAE;
m_strUserFieldName = strUserFiledName != "" ? strUserFiledName : DEFAULT_USER_FIELD;
m_strItemFileldName = strItemFiledName != "" ? strItemFiledName : DEFAULT_ITEM_FIELD;
m_strScoreFieldName = strScoreFiledName != "" ? strScoreFiledName : DEFAULT_RATING_FIELD;
BuildModel() ;
}
private void BuildModel() throws UnknownHostException {
Mongo mongoDDBB = new Mongo(m_strHost, m_iPort);
DB db = mongoDDBB.getDB(m_strDBName);
DBCollection collection = db.getCollection(m_strTableName);
DBCursor cursor = collection.find();
FastByIDMap<Collection<Preference>> userIDPrefMap = new FastByIDMap<Collection<Preference>>();
while (cursor.hasNext()) {
Map<String, Object> a = (Map<String, Object>) cursor.next().toMap();
long uid = Object2Long(a.get( m_strUserFieldName ));
long item = Object2Long(a.get(m_strItemFileldName ));
float ratingValue = getPreference(a.get(m_strScoreFieldName));
// log.info(String.valueOf(uid) + "\t\t" + String.valueOf(item) + "\t\t" + String.valueOf(ratingValue));
//System.out.println(String.valueOf(uid) + "\t\t" + String.valueOf(item) + "\t\t" + String.valueOf(ratingValue));
Collection<Preference> userPrefs = userIDPrefMap.get(uid);
if (userPrefs == null) {
userPrefs = Lists.newArrayListWithCapacity(2);
userIDPrefMap.put(uid, userPrefs);
}
userPrefs.add(new GenericPreference(uid, item, ratingValue));
}
m_oDataModel = new GenericDataModel(GenericDataModel.toDataMap(userIDPrefMap, true));
}
public DataModel DataModel() {
return m_oDataModel;
}
private static long Object2Long(Object o) {
if (o != null) {
return Double.valueOf(o.toString()).longValue();
}
return 0;
}
private static float getPreference(Object value) {
if (value != null) {
if (value.getClass().getName().contains("String")) {
return Float.parseFloat(value.toString());
} else {
return Double.valueOf(value.toString()).floatValue();
}
} else {
return 0.5f;
}
}
}
package com.lovego.cloud.perception.mahout;
import java.util.List;
import org.apache.mahout.cf.taste.impl.recommender.GenericItemBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.similarity.ItemSimilarity;
/**
* 基于物品的协同过滤
* @author Administrator
*
*/
public class ItemCFMongo {
final static int RECOMMENDER_NUM = 3; //推荐物品数目
public static void main(String[] args) throws Exception {
long start = System.currentTimeMillis();
/*MongoDBDataModel model = new MongoDBDataModel("127.0.0.1", 27017, "test",
"user_behavior", false, false, null,"userId","spuId","actionType","user_behavior");*/
MongoModel _d = new MongoModel("127.0.0.1", 27017 , "test" ,"user_behavior" , "userId","spuId","actionType") ;
DataModel model = _d.DataModel() ;
long end = System.currentTimeMillis();
System.out.println("模型加載耗时>>>>>>>>>>>>>>>>>>>>>>>>>>"+ (end -start));
//使用皮尔松算法 计算内容之间的相似度
ItemSimilarity itemSimilarity = new PearsonCorrelationSimilarity(model);
//构造推荐引擎 基于物品的推荐
GenericItemBasedRecommender r = new GenericItemBasedRecommender(model, itemSimilarity);
//迭代获取用户的id
//获得推荐结果,给userID推荐howMany个Item
List<RecommendedItem> list = r.mostSimilarItems(18438, RECOMMENDER_NUM);
for(RecommendedItem items : list){
System.out.printf("(%s,%f)",items.getItemID(),items.getValue());
}
System.out.println();
}
}