【问题标题】:Connect To MongoDB using Apache Mahout使用 Apache Mahout 连接到 MongoDB
【发布时间】:2016-03-16 21:40:27
【问题描述】:

我正在尝试使用 Apache Mahout 生成建议,同时使用 MongoDB 根据 MongoDBDataModel 创建数据模型。我的代码如下:

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 }

【问题讨论】:

  • 你解决了吗?如果是,我有类似的问题。我没有遇到异常,但是当我使用 MongoDBDataModel 时,我可以获得任何推荐的项目。谢谢。
  • 目前还没有解决方案。你的程序执行多远?我无法通过 MongoDBDataModel model = new MongoDBDataModel 行。

标签: java mongodb mahout mongodb-java mahout-recommender


【解决方案1】:

我成功地将 MongoDB 数据集成到 mahout。

mongoDB 中数据的结构取决于您使用的相似度算法。例如,

用户相似度

MongoDBDataModel datamodel = new MongoDBDataModel("127.0.0.1", 27017, "testing", "ratings", true, true, null); 其中 user_id、item_id 是整数值,偏好是浮点值,created_at 作为时间戳

SVD推荐器

user_id、item_id 是 MongoDB 对象,preference 是浮点值,created_at 作为时间戳

您可以做的明显故障排除是 MongoDB 服务器是否正在运行。根据它正在运行的异常。我认为问题在于您的数据结构..

使用 user_id 代替 userId、item_id 代替 itemId、preference 代替 rating。我不知道这是否会有所作为。我在网上使用了其中一个教程,但暂时找不到。

当我有超过 10000 个用户和 1000 个项目时,它工作但太慢了。

【讨论】:

    【解决方案2】:

    我认为问题在于,当涉及到需要驻留在 mongoDB 中的某些字段时,mahout 假定了一些默认值,即项目 ID、用户 ID 和首选项,即 user_id、item_id 和首选项,因此解决方案可能在于使用另一个 MongoDBDataModel 构造函数,它可以让您将 mongoDB 实例中这些字段的名称作为参数传递或重新设计您的 Collections Schema。

    我希望这是有道理的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      • 2017-08-20
      • 2020-07-03
      • 2016-01-14
      相关资源
      最近更新 更多