나는 특징 테이블의 데이터베이스에서이 같은 데이터 구조 (해시) token_vector
라는이 :이두 해시의 내적을 효율적으로
Feature.find(1).token_vector = { "a" => 0.1, "b" => 0.2, "c" => 0.3 }
이러한 기능 중 25 가지가 있습니다. 첫째, 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
이라는 방법이 있습니다. 이 메소드는 두 개의 token_vectors 사이에 내적을 사용합니다. 해시의 내적은 다음과 같이 작동
hash1 = { "a" => 1, "b" => 2, "c" => 3 }
hash2 = { "a" => 4, "b" => 5, "c" => 6, "d" => 7 }
각 중첩 해시 키 (이 경우, A, B 및 C, 그리고 D)는 그 값이 다음에, 서로 쌍으로 곱해 가산있다. 이러한 1*4 = 4
를 얻을 수
hash1
에서 a
의 값이 1 인
hash2
에서
a
의 값은 4 곱하기입니다. 이러한
2*5 = 10
를 얻을 수
hash1
에서 b
의 값이 2
hash2
에서
b
의 값은 5 곱하기입니다. 이러한
3*6 = 18
얻을
hash1
c
에 대한 값이 3
hash2
c
에 대한 값은 6 곱하기이다.
hash1
d
에 대한 값이 존재하지 않는, hash2
d
의 값이이 경우에 제되면, 제 1 해시 대한 d = 0
세트. 이것들을 곱하면 0*7 = 0
이됩니다.
이제 곱한 값을 더합니다. 4 + 10 + 18 + 0 = 32
. 이것은 hash1과 hash2의 내적입니다.
Analysis.locate(hash1, hash2) # => 32
나는 종종 사용되는 방법이있다, Analysis#topicize
. 이 메소드는 매개 변수 인 token_vector
을 취하는데, 이것은 위에서와 비슷하게 단지 해시입니다. Analysis#topicize
은 token_vector
의 내적 값과 25 개의 피쳐 'token_vectors
각각을 가져 와서 feature_vector
이라는 25 개 점 상품의 새 벡터를 만듭니다. 은 단지 배열입니다.
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
당신이 볼 수 있듯이, 그것은 token_vector
의 내적을 받아 내가 위에서 레디 스에 입력하고, 배열로 값을 밀어 각 기능의 token_vector
: 다음과 같은 코드가 모습입니다.
제 문제는이 방법을 호출 할 때마다 약 18 초가 걸리는 것입니다. 내가 레디 스를 오용 한거야? 문제는 루비 데이터를 루비에로드해서는 안된다는 것입니다. Redis에게 데이터 (token_vector
)를 보내고 Ruby 코드로 작성하지 않고 dot_product
기능을 수행하는 Redis 함수를 작성해야합니까?
'feature_vector.push (locate (token_vector, REDIS.hgetall ("feature1")))'에 문제가있는 것 같습니다. 'token_vector'는'TokenVector' 클래스이고'REDIS.hgetall ("feature1")'클래스는'Hash' 클래스입니다. 'REDIS.hgetall ("feature1")'클래스가'TokenVector' 클래스가 될 필요가 있습니다. 'TokenVector'는 실제로'Hash'의 서브 클래스입니다. 'REDIS.hgetall ("feature1")'클래스를'Hash'에서'TokenVector'로 바꾸려면 어떻게해야합니까? – Eric
간단히 말해서 :'locate (token_vector, TokenVector [REDIS.hgetall feature1 "])'. TokenVector는 Hash의 서브 클래스이기 (위해) 때문에, 해시의 클래스 메소드'[]'를 상속합니다.이 메소드는, 해시를 인수로서 취할 수가 있습니다. http://www.ruby-doc.org/core/classes/Hash.src/M000716.html –
실제로 답변을 게시했지만 실제로는 이전 의견에 대한 답변입니다.좀 봐 줄래? 감사. – Eric