2017-03-02 6 views
1

this paper (Improving document ranking with dual word embeddings)과 같이 word2vec의 출력 임베딩을 사용하고 싶습니다.gensim word2vec에서 출력 임베딩 (출력 벡터)에 액세스하려면 어떻게해야합니까?

입력 벡터가 syn0에 있고 출력 벡터가 syn1에 있고 syn1neg가 음수 샘플링 인 경우 알 수 있습니다.

그러나 출력 벡터로 most_similar를 계산할 때 syn1 또는 syn1neg를 제거하여 일부 범위에서 동일한 결과를 얻었습니다.

여기가 있습니다.

IN[1]: model = Word2Vec.load('test_model.model') 

IN[2]: model.most_similar([model.syn1neg[0]]) 

OUT[2]: [('of', -0.04402521997690201), 
('has', -0.16387106478214264), 
('in', -0.16650712490081787), 
('is', -0.18117375671863556), 
('by', -0.2527652978897095), 
('was', -0.254993200302124), 
('from', -0.2659570872783661), 
('the', -0.26878535747528076), 
('on', -0.27521973848342896), 
('his', -0.2930959463119507)] 

그러나 다른 syn1neg numpy 벡터는 이미 비슷한 출력입니다.

IN[3]: model.most_similar([model.syn1neg[50]]) 

OUT[3]: [('of', -0.07884830236434937), 
('has', -0.16942456364631653), 
('the', -0.1771494299173355), 
('his', -0.2043554037809372), 
('is', -0.23265135288238525), 
('in', -0.24725285172462463), 
('by', -0.27772971987724304), 
('was', -0.2979024648666382), 
('time', -0.3547973036766052), 
('he', -0.36455872654914856)] 

나는 훈련 중에 보존 된 출력 numpy 배열 (음수 또는 음수)을 가져오고 싶습니다.

순수 syn1 또는 syn1neg 또는 코드에 액세스하거나 word2vec 모듈 중 일부가 출력 포함을 가져올 수 있음을 알려주십시오.

답변

4

음수 샘플링의 경우 syn1neg의 가중치는 단어 단위이며, syn0과 같은 순서입니다.

두 예제가 유사한 결과를 제공한다는 단순한 사실만으로도 잘못된 것은 없음을 의미하지는 않습니다. 단어는 기본적으로 빈도별로 정렬되어 있으므로 초기 단어 (위치 0과 50에있는 단어 포함)는 아주 일반적인 단어의 빈번한 공동 발생 기반의 의미입니다 (모두 서로 가깝습니다).

좀 더 뚜렷한 의미를 가진 중간 빈도 단어를 선택하면보다 의미있는 결과를 얻을 수 있습니다 ('이중 단어 삽입'논문의 코퍼스/설정/요구 사항과 충분히 유사 할 경우). 예를 들어, 당신은 비교 할 수 있습니다 :

model.most_similar('cousin') 

을 ...에 ... 그러나

model.most_similar(positive=[model.syn1neg[model.vocab['cousin'].index]) 

, 모든 경우에 기존의 most_similar() 메소드는 syn0에 비슷한 벡터를 찾습니다 -은 ' IN '이라는 용어를 사용한다. 그래서 위의 코드는 실제로 종이가 'OUT-IN'유사성이라고 부르는 것을 계산할 것이라고 생각합니다. IN 벡터가 주어진 OUT 벡터와 가장 유사한 목록입니다. 그들은 실제로 반전 된 'IN-OUT'유사성을 유용한 것으로 홍보하는 것처럼 보입니다. (이는 주어진 IN 벡터와 가장 유사한 OUT 벡터입니다.)

최신 버전의 gensim은 특정 Word2Vec 모델과 별도로 문자열로 키 집합 된 단어 벡터 집합을 나타내는 KeyedVectors 클래스를 도입하거나 다른 훈련 방법. 대체로 syn0syn1neg으로 대체하는 추가 KeyedVectors 인스턴스를 만들어 대상 벡터와 유사한 OUT 벡터 목록을 얻을 수 있습니다. 따라서 상위 n 'IN-OUT'유사성 또는 'OUT-OUT'유사성을 계산할 수 있습니다.

는 예를 들어,이 일 (나는 그것을 테스트하지 않았습니다) 있습니다 계층 샘플링을 사용하는 경우

outv = KeyedVectors() 
outv.vocab = model.wv.vocab # same 
outv.index2word = model.wv.index2word # same 
outv.syn0 = model.syn1neg # different 
inout_similars = outv.most_similar(positive=[model['cousin']]) 

syn1에만 존재하며, 덜 분명 개인에 대한 어떤에 "출력 삽입" 단어가있을 것입니다.(임의의 한 단어를 예측하는 것에 대응하는 출력 노드가 여러 개 있으며, 한 단어를 예측하기 위해 각각의 적절한 0/1 값에 더 가까워 야합니다.) 그래서`syn1neg '와는 달리 벡터를 읽을 곳이 하나도 없습니다 단일 단어의 출력. 다중 출력 노드를 올바른 값으로 유도하는 숨김 -> 출력 가중치를 계산/근사해야 할 수도 있습니다.

+0

코드가 멋지게 작동합니다! 답장을 보내 주셔서 대단히 감사드립니다. –