Mahout:如何读取自定义输入文件

6
我正在使用Mahout进行编程,并发现FileDataModel接受的数据格式为:
     userId,itemId,pref(long,long,Double).

我有一些数据,格式如下:

     String,long,double 

在Mahout上处理这个数据集的最佳/最简单方法是什么?

3个回答

3

一种方法是创建 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中有说明)。


3

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


1
假设您的输入适合内存,请通过循环遍历它。使用字典跟踪每个字符串的ID。如果它不适合内存,则使用排序,然后按组执行相同的操作。
在Python中:
import sys
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)

2
Mahout 中有一个组件可以自动完成这个任务,叫做 IDMigrator,但我也建议在外部将其翻译为数字 ID。 - Sean Owen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接