token_vector私は(ハッシュ)と呼ばれる機能テーブルのデータベースにこのようなデータ構造を持っています:
Feature.find(1).token_vector = { "a" => 0.1, "b" => 0.2, "c" => 0.3 }
これらの機能は25個あります。まず、次のようにデータをRedisに入力しましたscript/console。
REDIS.set( "feature1",
"#{ TokenVector.to_json Feature.find(1).token_vector }"
)
# ...
REDIS.set( "feature25",
"#{ TokenVector.to_json Feature.find(25).token_vector }"
)
TokenVector.to_json最初にハッシュをJSON形式に変換します。Redisに保存されている25個のJSONハッシュは約8MBを占めます。
と呼ばれるメソッドがありAnalysis#locateます。このメソッドは、2つのtoken_vector間の内積を取ります。ハッシュのドット積は次のように機能します。
hash1 = { "a" => 1, "b" => 2, "c" => 3 }
hash2 = { "a" => 4, "b" => 5, "c" => 6, "d" => 7 }
ハッシュ内の重複する各キー(この場合は、dではなくa、b、およびc)の値がペアごとに乗算され、合計されます。
ainの値hash1は1、inの値aはhash24です。これらを乗算して。を取得します1*4 = 4。
binの値hash1は2、inの値bはhash25です。これらを乗算して。を取得します2*5 = 10。
cinの値hash1は3、inの値cはhash26です。これらを乗算して。を取得します3*6 = 18。
dinの値hash1は存在せず、inの値dはhash27です。この場合、d = 0最初のハッシュに設定されます。これらを乗算してを取得します0*7 = 0。
次に、乗算された値を合計します。4 + 10 + 18 + 0 = 32。これは、hash1とhash2の内積です。
Analysis.locate( hash1, hash2 ) # => 32
よく使われる方法がありAnalysis#topicizeます。token_vectorこのメソッドは、上記と同様に、単なるハッシュであるパラメーターを取ります。と25個の特徴のそれぞれのAnalysis#topicize内積を取り、それらの25個の内積の新しいベクトルを作成します。Aは単なる配列です。コードは次のようになります。token_vectortoken_vectorsfeature_vectorfeature_vector
def self.topicize token_vector
feature_vector = FeatureVector.new
feature_vector.push(
locate( token_vector, TokenVector.from_json( REDIS.get "feature1" ) )
)
# ...
feature_vector.push(
locate( token_vector, TokenVector.from_json( REDIS.get "feature25" ) )
)
feature_vector
end
ご覧のとおり、上記のRedisに入力した内積token_vectorと各機能を取得し、値を配列にプッシュします。token_vector
私の問題は、メソッドを呼び出すたびに約18秒かかることです。Redisを誤用していますか?問題は、RedisデータをRubyにロードしてはいけないということだと思います。Rubyコードで記述するのではなく、Redisにデータ(token_vector)を送信し、Redis関数を記述して関数を実行させることになっていますか?dot_product