2017-11-30 13 views
0

Google word2vec에서 중복 된 단어를 찾으려고합니다. 예를 들어 word2vec에는 'Hello'와 'hello'에 대한 두 단어 임베딩이 있습니다. 여기 내 코드는 간단하지만 효율적이지 않습니다. 사전 교육을받은 구글 word2vec 3 만 개 단어를 가지고로목록을 반복하는 효율적인 방법은 무엇입니까?

def load_w2v(): 
openfile = '../Pretrained/word2vec/GoogleNews-vectors-negative300.bin' 
model = gensim.models.KeyedVectors.load_word2vec_format(openfile, binary=True) 
return model.vocab.keys() 

if __name__ == '__main__': 
    pre_trained_words = load_w2v() 
    ready_have = [] 
    duplicated_words = [] 
    for word in pre_trained_words: 
     if word.lower() not in ready_have: 
      ready_have.append(word.lower()) 
     else: 
      duplicated_words.append(word) 
      continue 

그러나, 내 컴퓨터는 중복 된 단어를 얻을 수있는 몇 가지 effiencient 방법이 18 시간 동안들이받은하지 완료, 그래서 궁금 해서요되었습니다?

+0

효율성 문제인지 아니면 무한 루프에 빠질지 확신하십니까? 프로세스를 디버깅 했습니까? –

+0

중복을 정의하십시오. "안녕하세요"와 "여보세요"는 중복되지만 두 번 이상 복제가 발생하는 "안녕하세요"입니까? – VPfB

답변

4

에 대한 귀하의 in 회원 테스트는 각 호출마다 O (N) 시간의 복잡성을 가지므로 접근이 느리다는 것은 놀라운 일이 아닙니다. 당신은 단순히 (read_have의 순서는 중요하지 않습니다 가정) ready_have 세트를 만들고 ready_have.add(word.lower())를 사용하여이 속도를 높일 수있다, 또는 collections.Counter 사용하는 청소기 수 있습니다 : 나는 Counter 솔루션을 믿고있어

from collections import Counter 

my_counter = Counter(word.lower() for word in load_w2v()) 
ready_have, duplicated_words = [], [] 
for word, count in my_counter.items(): 
    read_have.append(word) 
    if count != 1: 
     duplicated_words.append(word) 

주 중복 된 단어는 한 번만 추가하기를 원하지만이 단어는 간단히 변경할 수 있습니다.

+0

몇 메가 바이트의 메모리를 절약하기 위해 생성자 표현식 'lower_case_words = (...)'를 제안합니다. – VPfB

+0

@VPfB 동의 함, 사실 나는 그저 'Counter'에 직접 감사를드립니다. –

+0

Thx 너무 많이, 정말 도움이되고 5 분 안에 끝낼 수 있습니다. –