カスタム入力ファイルを読み込み、FileDataModelはフォーマットでデータを受け入れることが判明するにMahoutのは:私はMahoutので遊んでいた
userId,itemId,pref(long,long,Double).
私は、以下の形式でいくつかのデータを持っている
String,long,double
何Mahoutのこのデータセットで作業する最も簡単な方法ですか?
カスタム入力ファイルを読み込み、FileDataModelはフォーマットでデータを受け入れることが判明するにMahoutのは:私はMahoutので遊んでいた
userId,itemId,pref(long,long,Double).
私は、以下の形式でいくつかのデータを持っている
String,long,double
何Mahoutのこのデータセットで作業する最も簡単な方法ですか?
入力がメモリに収まると仮定すると、それをループスルーします。辞書内の各文字列のIDを追跡します。それがメモリに収まらない場合は、sortを使ってグループ化し、同じアイデアを達成してください。 Pythonで
:
輸入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)メソッドをオーバーライドして変換を行う必要があります。 Seanが示唆するように、IDMigratorの実装の1つを使用できます。あなたも、逆マッピングを行うためにmemoryIDMigratorを使用することができ
@Override
protected long readUserIDFromString(String stringID) {
long result = memoryIDMigrator.toLongID(stringID);
memoryIDMigrator.storeMapping(result, stringID);
return result;
}
この方法:たとえば
は、あなたがMemoryIDMigratorを初期化していると仮定すると、あなたはこれを行うことができます。あなたがそれを必要としないならば、あなたはそれが実装(それはAbstractIDMigratorにある)で行われたようにそれをハッシュすることができます。
userIdとitemIdはstringにすることができるので、文字列を整数に変換し、マップ(String、Id)をメモリに保持します。this is the CustomFileDataModel推薦の後、あなたはidから文字列を得ることができます。
このリンクは質問に答えるかもしれませんが、答えの本質的な部分をここに含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 –
@ moskito-xありがとうございました。 – KlwntSingh
Mahoutには、この種のことを自動的に行う「IDMigrator」というコンポーネントがありますが、数値IDへの外部変換もお勧めします。 –