Mahout: для чтения пользовательского входного файла - PullRequest
6 голосов
/ 26 августа 2011

Я играл с Mahout и обнаружил, что FileDataModel принимает данные в формате

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

У меня есть некоторые данные в формате

     String,long,double 

Что лучше /самый простой способ работы с этим набором данных на Mahout?

Ответы [ 3 ]

3 голосов
/ 15 марта 2012

Один из способов сделать это - создать расширение FileDataModel .Вам нужно переопределить метод readUserIDFromString (String value) , чтобы использовать какой-либо преобразователь для преобразования.Вы можете использовать одну из реализаций IDMigrator , как предлагает Шон.

Например, если у вас есть инициализированный MemoryIDMigrator , вы можете сделать это:

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

Таким образом, вы можете использовать memoryIDMigrator и для обратного отображения.Если вам это не нужно, вы можете просто хешировать его так, как это делается в их реализации (это в AbstractIDMigrator ).

3 голосов
/ 17 апреля 2015

userId и itemId могут быть строковыми, поэтому это CustomFileDataModel , которая преобразует вашу строку в целое число и сохранит карту (String, Id) в памяти;после рекомендаций вы можете получить строку с идентификатором.

1 голос
/ 26 августа 2011

Предполагая, что ваш вход помещается в память, переберите его.Отслеживайте идентификатор для каждой строки в словаре.Если он не помещается в памяти, используйте sort и затем group by для реализации той же идеи.

В 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)
...