6

我在玩 Mahout,发现 FileDataModel 接受格式为

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

我有一些格式的数据

     String,long,double 

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

4

3 回答 3

3

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

于 2015-04-17T02:57:45.630 回答
3

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

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

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

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

于 2012-03-15T11:51:56.090 回答
1

假设您的输入适合内存,循环遍历它。跟踪字典中每个字符串的 ID。如果它不适合内存,请使用 sort 然后 group by 来完成相同的想法。

在蟒蛇中:

导入系统

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)
于 2011-08-26T19:40:19.963 回答