2017-09-12 10 views
0

단어 벡터 합계 및 결과 비교라는 순진한 접근 방식을 사용하여 문장 비교 문제를 해결하려고합니다. 내 목표는 사람들을 관심 분야별로 매치시키는 것이므로 데이터 세트는 이름과 취미를 설명하는 짧은 문장으로 구성됩니다. 일괄 처리는 매우 작고 수백 명에 불과하므로 doc2vec를 파헤 치기 전에 시도해보고 싶었습니다.gensim과 문장 일치 word2vec : 수동으로 채워진 모델이 작동하지 않습니다.

데이터를 완전히 청소하고, 중지 단어를 제거하고, 토큰 화하고, lemmatizing하여 데이터를 준비합니다. 일부 테스트 단어에 대해 유사성을 찾을 때 적절한 결과를 반환하는 단어 벡터에 대해 사전 훈련 된 모델을 사용합니다. 또한 원래 모델의 유사점을 찾기 위해 문장 단어를 합산 해 보았습니다. 일치는 의미가 있습니다. 유사점은 문구의 일반적인 의미 주위에있을 것입니다.

는 문장 일치를 위해 나는 다음과 같은 노력하고있어 :

b = gs.models.Word2Vec(min_count=1, size=300, sample=0, hs=0) 

빌드 Vocab의 이름 (또는 사람 아이디의), 별도의 교육

#first create vocab with an empty vector 
test = [['test']] 
b.build_vocab(test) 
b.wv.syn0[b.wv.vocab['test'].index] = b.wv.syn0[b.wv.vocab['test'].index]*0 

#populate vocab from an array 
b.build_vocab([personIds], update=True) 

써머 각 문장의 단어 벡터에서 빈 모델을 생성 해당 id에 대한 모델에 결과를 저장하십시오.

#sentences are pulled from pandas dataset df. 'a' is a pre-trained model i use to get vectors for each word 

def summ(phrase, start_model): 
    ''' 
    vector addition function 
    ''' 
    #starting with a vector of 0's 
    sum_vec = start_model.word_vec("cat_NOUN")*0 
    for word in phrase: 
     sum_vec += start_model.word_vec(word) 
    return sum_vec 

for i, row in df.iterrows(): 
    try: 
     personId = row["ID"] 
     summVec = summ(df.iloc[i,1],a) 
     #updating syn0 for each name/id in vocabulary 
     b.wv.syn0[b.wv.vocab[personId].index] = summVec 
    except: 
     pass 

여기서 많은 정확성을 기대할 수는 없지만 t-SNE 인쇄에는 클러스터링이 전혀 표시되지 않습니다. 유사성 방법을 찾는 것은 또한 일치를 찾지 못합니다 (기본적으로 모든 것에 대한 유사성 계수는 ​​<입니다). []plot of the entire model[1]

어디에서 잘못 됐는지 생각하는 사람이 있습니까? 내 접근법은 전혀 유효합니까?

답변

0

코드는 그림과 같이 단어 벡터의 train() (로컬 텍스트 사용)도 아니며 다른 곳의 벡터도 사전로드하지 않습니다. 따라서 존재하는 벡터는 build_vocab() 호출에 의해 만들어지며 여전히 임의로 초기화 된 시작 위치에있게되며 의미 론적 목적으로는 쓸모가 없습니다.

제안 :

  • 중 (a)는 텍스트의 좋은 양이있는 경우 의미가 텍스트에서 자신의 벡터를 훈련; 또는 (b) 다른 곳에서 벡터를로드하십시오. 그러나 둘 다하려고하지 마십시오. (위의 코드의 경우에도 마찬가지입니다.)
  • build_vocab()의 옵션은 전문가의 실험적 옵션으로 간주해야합니다. 이미 간단한 모드에서 작업 한 적이있는 경우에만 수정해야하며, 당신이 그것을 필요로하고 모든 함의를 이해했는지 확인하십시오.
  • 일반 사용에서는 Word2Vec 모델 syn0 속성에 새 값을 명시 적으로 다시 할당하지 않습니다. 즉, 클래스의 교육 루틴에 의해 관리되므로 새 값을 0으로 만들거나 수정할 필요가 없습니다. 자신의 데이터 구조에서 모델 외부의 단어 벡터를 기반으로 자신 만의 텍스트 요약 벡터를 계산해야합니다.
+0

답변 해 주셔서 감사합니다. syn0 기능과 관련하여 혼란 스러웠습니다. 일부 Google 그룹 토론에서이 업데이트 권장 사항을 보았 기 때문입니다. 나는 유사성 계산을 위해 scipy.spatial.distance.cosine()을 시도하는 조언을 받았고 그것은 저를 위해 잘 작동했습니다. – Nick