Я играл с Mahout и обнаружил, что FileDataModel принимает данные в формате
userId,itemId,pref(long,long,Double).
У меня есть некоторые данные в формате
String,long,double
Что лучше /самый простой способ работы с этим набором данных на Mahout?
Один из способов сделать это - создать расширение 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 ).
userId и itemId могут быть строковыми, поэтому это CustomFileDataModel , которая преобразует вашу строку в целое число и сохранит карту (String, Id) в памяти;после рекомендаций вы можете получить строку с идентификатором.
Предполагая, что ваш вход помещается в память, переберите его.Отслеживайте идентификатор для каждой строки в словаре.Если он не помещается в памяти, используйте 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)