簡體   English   中英

使用Apache Mahout連接到MongoDB

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM