2017-11-30 8 views
0

は、私はGoogleのword2vecで重複した単語を見つけようとしています、例えば、word2vecに、2つのワードの埋め込みは、「こんにちは」と「こんにちは」のためにそこにあります。ここで私のコードですが、単純ですが効率的ではありません。事前に訓練されたGoogleの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 

しかし、私のコンピュータは18時間runingてなく終了したので、私は思っていたされた重複した単語を取得するための、いくつかeffiencient方法はありますか?

+0

あなたはそれが効率の問題だ確信し、または多分あなたは無限ループに陥るされています。あなたはプロセスをデバッグしましたか? –

+0

重複を定義してください。 "こんにちは"と "こんにちは"は重複していますが、重複して2回以上出現する "こんにちは"ですか? – VPfB

答えて

4

のメンバーシップテストは、それぞれの呼び出しが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分で終えることができます –

関連する問題