[英]Connect To MongoDB using Apache Mahout
我試圖在使用MongoDB根據MongoDBDataModel創建數據模型時使用Apache Mahout生成建議。 我的代碼如下:
import java.net.UnknownHostException;
import java.util.List;
import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.impl.model.mongodb.MongoDBDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.ThresholdUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericItemBasedRecommender;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.UserBasedRecommender;
import org.apache.mahout.cf.taste.similarity.ItemSimilarity;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;
import com.mongodb.MongoException;
public class usingMongo {
public static void main(String[] args) throws UnknownHostException, Mong oException
,TasteException {
final long startTime = System.nanoTime();
MongoDBDataModel model = new MongoDBDataModel("AdamsLaptop", 27017,
"test", "ratings100k", false, false, null);
System.out.println("connected to mongo ");
UserSimilarity UserSim = new PearsonCorrelationSimilarity(model);
UserNeighborhood neighborhood = new ThresholdUserNeighborhood(0.5, UserSim, model);
UserBasedRecommender UserRecommender = new GenericUserBasedRecommender(model, neighborhood, UserSim);
List<RecommendedItem>UserRecommendations = UserRecommender.recommend(1, 3);
for (RecommendedItem recommendation : UserRecommendations) {
System.out.println("You may like movie " + recommendation.getItemID() + " as a user similar to you also rated it " + recommendation.getValue() + " USER");
}
ItemSimilarity ItemSim = new PearsonCorrelationSimilarity(model);//LogLikelihoodSimilarity(model);
GenericItemBasedRecommender ItemRecommender = new GenericItemBasedRecommender(model, ItemSim);
List<RecommendedItem>ItemRecommendations = ItemRecommender.recommend(1, 3);
for (RecommendedItem recommendation : ItemRecommendations) {
System.out.println("You may like movie " + recommendation.getItemID() + " as a user similar to you also rated it " + recommendation.getValue() + " ITEM");
}
final long duration = System.nanoTime() - startTime;
System.out.println(duration);
}
}
我看不到哪里出了問題,但是經過多次更改和大量的反復試驗,錯誤消息仍然相同:
Exception in thread "main" java.lang.NullPointerException
at org.apache.mahout.cf.taste.impl.model.mongodb.MongoDBDataModel.getID(MongoDBDataModel.java:743)
at org.apache.mahout.cf.taste.impl.model.mongodb.MongoDBDataModel.buildModel(MongoDBDataModel.java:570)
at org.apache.mahout.cf.taste.impl.model.mongodb.MongoDBDataModel.<init>(MongoDBDataModel.java:245)
at recommender.usingMongo.main(usingMongo.java:24)
有什么建議么? 這是我在MongoDB中的數據的示例:
{ "_id" : ObjectId("56ddf61f5960960c333f3dcb"),"userId" : 1, "movieId" : 292, "rating" : 4, "timestamp" : 847116936 }
我成功地將MongoDB數據集成到了mahout中。
mongoDB中的數據結構取決於您使用的相似性算法。例如,
用戶相似度
MongoDBDataModel datamodel = new MongoDBDataModel(“ 127.0.0.1”,27017,“測試”,“評級”,true,true,null); 其中user_id,item_id是整數值,preference是浮點值,並且created_at作為時間戳
SVD推薦
user_id,item_id是MongoDB對象,preference是浮點值,created_at作為時間戳
您可以做的明顯的故障排除是MongoDB服務器是否正在運行。 作為例外,它正在運行。 我認為問題出在您的數據結構中。
使用user_id代替userId,使用item_id代替itemId,使用偏好代替等級。 我不知道這是否會有所作為。 我在線使用了其中一本教程,但目前找不到。
當我有超過10000個用戶擁有1000個項目時,它可以正常工作,但是速度太慢。
我認為問題在於mahout在需要駐留在mongoDB中的某些字段時會采用一些默認值,即項目ID,用戶ID以及user_id,item_id和preferences的首選項,因此解決方案可能取決於使用另一個MongoDBDataModel構造函數這樣您就可以在mongoDB實例中傳遞這些字段的名稱作為參數,或者重新設計Collections Schema。
我希望這是有道理的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.