【问题标题】:Mahout - How to read a custom input file?Mahout - 如何读取自定义输入文件?
【发布时间】:2020-04-03 18:38:22
【问题描述】:

我关注此主题并使用 MemoryIDMigrator 为我的产品获取长 ID: Mahout : To read a custom input file

但我不能像这样初始化 IDMigrator,因为父构造函数需要先出现:

public MemoryIDMigrator memoryIDMigrator;

public CustomFileDataModel(File dataFile) throws IOException {

    this.memoryIDMigrator = new MemoryIDMigrator();
    super(dataFile);
}

@Override
protected long readItemIDFromString(String stringID) {

    long result = this.memoryIDMigrator.toLongID(stringID);
    this.memoryIDMigrator.storeMapping(result, stringID);
    return result;
}

我怎样才能给这个参数来取回我的字符串 ID ?我需要这样的东西:

    List<RecommendedItem> recommendations = recommender.recommend(2, 5);
    for (RecommendedItem recommendation : recommendations) {
        System.out.println(memoryIDMigrator.toStringID(recommendation.getItemID());
    }

【问题讨论】:

  • 其实这是 Mahout 的问题。它在内部使用数字 id 来处理几乎所有事情。预计您将提供自己的从 Mahout ID 到您的 ID 的翻译,反之亦然。我建议使用 BiMap 之类的东西,它是一个 2 向哈希图。您可以使用一组 (YourId, MahoutId) 对对其进行初始化,然后从其中一个映射到另一个。在 Mahout (Mahout Samsara) 的 Scala 版本中,有一个 BiDictionary 类可用于此目的。

标签: java maven mahout-recommender


【解决方案1】:

我刚刚找到了解决方案!在我看来,这不是最好的方法,但它确实有效。

当我的覆盖函数尝试读取一个项目时,如果新地图已经创建,我会阻止它的创建:

public class CustomFileDataModel extends FileDataModel {

    public MemoryIDMigrator memoryIDMigrator;
    private boolean loaded;

    public CustomFileDataModel(File dataFile) throws IOException {
        super(dataFile);
    }

    @Override
    protected long readItemIDFromString(String stringID) {
        if (!this.loaded) {
            this.memoryIDMigrator = new MemoryIDMigrator();
            this.loaded = true;
        }
        long result = this.memoryIDMigrator.toLongID(stringID);
        this.memoryIDMigrator.storeMapping(result, stringID);
        return result;
    }
}

同样,如果您想使用自定义用户 ID,您可以覆盖 readUserIDFromString() 函数。

然后要恢复我的字符串 ID,我会这样进行:

public static void main( String[] args ) throws IOException, TasteException {

    CustomFileDataModel model = new CustomFileDataModel(new File("path/to/data.csv"));

    UserSimilarity similarity = new PearsonCorrelationSimilarity(model);

    UserNeighborhood neighborhood = new ThresholdUserNeighborhood(0.1, similarity, model);

    UserBasedRecommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity);

    List<RecommendedItem> recommendations = recommender.recommend(2, 5);
    for (RecommendedItem recommendation : recommendations) {
        System.out.println(model.memoryIDMigrator.toStringID(recommendation.getItemID()));
    }
}

【讨论】:

    猜你喜欢
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 2019-01-29
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多