Mahout - Как прочитать пользовательский входной файл? - PullRequest
0 голосов
/ 03 апреля 2020

Я следую этой топи c и использую MemoryIDMigrator для получения длинного идентификатора для моих продуктов: Mahout: для чтения пользовательского входного файла

Но я не могу инициализировать 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;
}

Как я могу дать этот параметр, чтобы вернуть мой String ID? Мне нужно что-то вроде этого:

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

1 Ответ

0 голосов
/ 06 апреля 2020

Я только что нашел решение! На мой взгляд, это не лучший способ сделать это, но он работает.

Когда моя функция переопределения пытается прочитать элемент, я запрещаю создание новой карты, если она уже была создана:

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;
    }
}

Аналогичным образом, если вы хотите использовать пользовательский идентификатор пользователя, вы можете переопределить функцию readUserIDFromString().

И затем, чтобы восстановить мой идентификатор строки, я продолжаю так:

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()));
    }
}
...