我正在使用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,它将把您的字符串转换为整数,并将映射(String,Id)保留在内存中;在推荐之后,您可以从ID获取字符串。
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)
IDMigrator
,但我也建议在外部将其翻译为数字 ID。 - Sean Owen