Mahout:读取自定义输入文件

我正在玩Mahout,发现FileDataModel接受格式的数据

userId,itemId,pref(long,long,Double). 

我有一些格式的数据

  String,long,double 

在Mahout上使用此数据集的最佳/最简单方法是什么?

一种方法是创建FileDataModel的扩展。 您需要覆盖readUserIDFromString(String value)方法以使用某种解析器进行转换。 您可以使用IDMigrator的其中一个实现,正如Sean所建议的那样。

例如,假设您有一个初始化的MemoryIDMigrator ,您可以这样做:

 @Override protected long readUserIDFromString(String stringID) { long result = memoryIDMigrator.toLongID(stringID); memoryIDMigrator.storeMapping(result, stringID); return result; } 

这样你也可以使用memoryIDMigrator进行反向映射。 如果你不需要它,你可以按照它们的实现方式(就在AbstractIDMigrator中 )对它进行哈希处理。

userId和itemId可以是字符串,因此这是CustomFileDataModel ,它将您的字符串转换为整数,并将map(String,Id)保留在内存中; 建议后你可以从id获取字符串。

假设你的输入适合内存,循环它。 跟踪字典中每个字符串的ID。 如果它不适合内存,请使用sort然后分组来实现相同的想法。

在python中:

导入系统

 import sys next_id = 0 str_to_id = {} for line in sys.stdin: fields = line.strip().split(',') this_id = str_to_id.get(fields[0]) if this_id is None: next_id += 1 this_id = next_id str_to_id[fields[0]] = this_id fields[0] = str(this_id) print ','.join(fields)