2017-03-27 8 views
1

特定のドキュメントに類似した上位n個のドキュメントを表示できるアルゴリズムを作成しようとしています。 私はgensim doc2vecを使っています。コードはベローズである:Gensim docvecs.most_similarは、存在しないIdを返します。

model = gensim.models.doc2vec.Doc2Vec(size=400, window=8, min_count=5, workers = 11, 
dm=0,alpha = 0.025, min_alpha = 0.025, dbow_words = 1) 

model.build_vocab(train_corpus) 

for x in xrange(10): 
    model.train(train_corpus) 
    model.alpha -= 0.002 
    model.min_alpha = model.alpha 
    model.train(train_corpus) 

model.save('model_EN_BigTrain') 

sims = model.docvecs.most_similar([408], topn=10) 

シムのVaRは、最初の要素のドキュメントID及び第二のスコアである、私は10個のタプルを与えるべきです。 問題は、一部のIDがトレーニングデータのドキュメントに対応していないことです。

私は訓練データに含まれていないIDの意味を理解しようとしていますが、ロジックはありません。

Psが:これは私が私のtrain_corpus

def readData(train_corpus, jData): 

print("The response contains {0} properties".format(len(jData))) 
print("\n") 
for i in xrange(len(jData)): 
    print "> Reading offers from Aux array" 
    if i % 10 == 0: 
     print ">>", i, "offers processed..." 

     train_corpus.append(gensim.models.doc2vec.TaggedDocument(gensim.utils.simple_preprocess(jData[i][1]), tags=[jData[i][0]])) 
print "> Finished processing offers" 

(私はIDになりたいという)の位置0はint型である魔女でAUX配列1つの配列の各位置ビーイングを作成するために使用するコードです位置1の説明

ありがとうございます。

答えて

1

tagsとして平方整数IDを使用していますが、0から035までのすべての整数を正確に使用していませんか?MAX_DOC_IDは何ですか?

もしそうなら、その範囲内のタグの外観を説明することができます。プレーンなintを使用すると、gensim Doc2Vecは、内部ベクトル配列内のインデックス位置に与えられたdictマッピングのタグを作成することを避け、int自身を使用します。

したがって、MAX_DOC_ID + 1行を含むように内部ベクトル配列を割り当てる必要があります。未使用のIDに対応する行は、すべての位置と同様にランダムなベクトルとして初期化されますが、実際のテキストの例からは意味のある相対的な位置に移動することはありません。したがって、これらのランダムに初期化された訓練されていないベクトルは後でmost_similar()の結果に現れる可能性があります。

これを避けるには、必要な最後のIDまで0から連続したintだけを使用してください。または、文字列からインデックスへのマッピングのメモリコストがある場合は、プレーンintではなく文字列タグを使用します。または、有効なIDの追加レコードを保持し、結果から不要なIDを手動でフィルタリングします。

別に:あなたのDoc2Vecモデルの初期化でiter=1を指定しないことで、iter=5のデフォルトはtrain()に各呼び出しを意味し、有効になりますあなたのデータの上に5回の反復を行います。奇妙なことに、あなたのxrange(10) for-loopには、それぞれの反復に対してtrain()への2回の別々の呼び出しが含まれています(1番目は、alpha/min_alphaがすでに使用されているものを使用しています)。実際には、奇妙な学習率のスケジュールで、データを10 * 2 * 5 = 100回通過しています。

10パスにちょうどiter=10を設定したい場合は、デフォルトのalpha/min_alphaのままにしてから、train()を1回だけ呼び出してください。モデルは10回のパスを行い、アルファを開始値から終了値までスムーズに管理します。私はそれにいくつかのwonkインデックスを持っていたデータフレームを渡した

for idx,doc in data.iterrows(): 
    alldocs.append(TruthDocument(doc['clean_text'], [idx], doc['label'])) 

+0

こんにちはgojomo、高速応答のための まず感謝。 ここで説明していたことに気付きました。最初のIDが408の場合、ベクターには409のポジションがありました。それを解決するために、私はデータベースから文字列として得たIDを使用し、問題は解決されました。 doc2vecのモデルに関しては、iterを1に指定しましたが、このコードではiterを変更するのを忘れました。 このサイクルはdoc2vecのチュートリアルで見ましたが、そこではより良い結果が得られたと言われました。それについて意見はありますか? iterを10または0としてモデルを使ってサイクルまたは電車を行うことは有益でしょうか? – JoaoSilva

+1

緩やかな学習率低下で、自分でループを繰り返すだけで、より良い結果が得られる可能性は低いです。間違って10回しかやっていないと思ったときに100回反復してしまうと、誤ってiter = 10と比較して(そして余分な時間を無視して)改善が見られるかもしれません。明示的なalpha/min_alphaの微調整で 'train()'を複数回呼び出すのは、通常、エラーを起こしやすい複雑さです。いずれの場合も、1回の繰り返しにつき2つの 'train()'は迷った誤編集のようです。だから私はそのパターンを避けるだろう。 – gojomo

+0

明示的な 'iter = 10'を指定すると、デフォルトの' alpha'/'min_alpha'をそのまま残すことができます。 – gojomo

0

は、私は次のように私のdoc2vecを初期化して、同様にこの問題を抱えていました。私がしなければならなかったのはすべてだった。

df.reset_index(inplace=True) 
関連する問題