我與象夫玩,發現FileDataModel格式接受數據亨利馬烏:要讀取一個自定義的輸入文件
userId,itemId,pref(long,long,Double).
我有一些數據的格式爲
String,long,double
什麼是Mahout上使用此數據集的最佳/最簡單的方法?
我與象夫玩,發現FileDataModel格式接受數據亨利馬烏:要讀取一個自定義的輸入文件
userId,itemId,pref(long,long,Double).
我有一些數據的格式爲
String,long,double
什麼是Mahout上使用此數據集的最佳/最簡單的方法?
假設您輸入裝入內存,通過它循環。跟蹤字典中每個字符串的ID。如果它不適合內存,使用排序,然後分組來完成相同的想法。
在蟒蛇:
進口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)
的一種方法是通過創建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)所做的那樣。
帳戶及的itemId可以是字符串,所以this is the CustomFileDataModel將您的字符串轉換成整數,將保留地圖(字符串,ID)在內存中;建議之後,您可以從id獲取字符串。
儘管這個鏈接可能回答這個問題,但最好在這裏包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 –
@ moskito-X感謝建議。 – KlwntSingh
有一個在亨利馬烏其中做這種自動的,叫做'IDMigrator'一個組成部分,但我也建議翻譯成數字ID外部。 –