2011-08-26 5 views
6

カスタム入力ファイルを読み込み、FileDataModelはフォーマットでデータを受け入れることが判明するにMahoutのは:私はMahoutので遊んでいた

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

私は、以下の形式でいくつかのデータを持っている

 String,long,double 

何Mahoutのこのデータセットで作業する最も簡単な方法ですか?

答えて

1

入力がメモリに収まると仮定すると、それをループスルーします。辞書内の各文字列の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) 
+2

Mahoutには、この種のことを自動的に行う「IDMigrator」というコンポーネントがありますが、数値IDへの外部変換もお勧めします。 –

3

一つの方法は、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にある)で行われたようにそれをハッシュすることができます。

3

userIdとitemIdはstringにすることができるので、文字列を整数に変換し、マップ(String、Id)をメモリに保持します。this is the CustomFileDataModel推薦の後、あなたはidから文字列を得ることができます。

+0

このリンクは質問に答えるかもしれませんが、答えの本質的な部分をここに含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 –

+0

@ moskito-xありがとうございました。 – KlwntSingh

関連する問題