Я только что нашел решение! На мой взгляд, это не лучший способ сделать это, но он работает.
Когда моя функция переопределения пытается прочитать элемент, я запрещаю создание новой карты, если она уже была создана:
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()));
}
}