2016-10-28 9 views
1

つぶやきを使用してDoc2Vecモデルを準備しています。各つぶやきの単語列を別の文書としてみなされ、「SENT_1」と表示され、SENT_2" SENT_2を 『などDoc2Vecに使用されている単語を抽出するには

 
taggeddocs = [] 
for index,i in enumerate(cleaned_tweets): 
    if len(i) > 2: # Non empty tweets 
     sentence = TaggedDocument(words=gensim.utils.to_unicode(i).split(), tags=[u'SENT_{:d}'.format(index)]) 
     taggeddocs.append(sentence) 

# build the model 
model = gensim.models.Doc2Vec(taggeddocs, dm=0, alpha=0.025, size=20, min_alpha=0.025, min_count=0) 

for epoch in range(200): 
    if epoch % 20 == 0: 
     print('Now training epoch %s' % epoch) 
    model.train(taggeddocs) 
    model.alpha -= 0.002 # decrease the learning rate 
    model.min_alpha = model.alpha # fix the learning rate, no decay 

私が言う、与えられたつぶやきに似たつぶやきを見つけたい』。どう?

私は同様のツイートのラベルを取得します:

 
SENT_4372 
SENT_1143 
SENT_4024 
SENT_4759 
SENT_3497 
SENT_5749 
SENT_3189 
SENT_1581 
SENT_5127 
SENT_3798 

しかし、与えられた:それのように印刷さ

 
sims = model.docvecs.most_similar('SENT_2') 
for label, score in sims: 
    print(label) 

ラベル、元のつぶやきの言葉/文を取得するにはどうすればいいですか?例えば。 「SENT_3497」のつぶやき言葉は何ですか?これをDoc2Vecモデルに問い合わせることはできますか?

答えて

1

GensimのWord2Vec/Doc2Vecモデルは、コーパスデータを格納しません。コーパスデータを複数パスで調べてモデルを学習します。元のテキストを取得する必要がある場合は、Python dict(すべての例がメモリに収まる場合など)のような、独自のルック・アップ・キーのデータ構造を作成する必要があります。

最近のバージョンのgensimでは、あなたのコードは実際にtaggeddocsよりも1,005トレーニングパスを実行します。多くの場合、無意味/破壊的に負の値alphaの値が含まれます。コンストラクタに渡すことで

  • 、あなたはiter=5パスのデフォルト数が含まれ、あなたのパラメータとデフォルト値を使用して、自分自身を訓練するためのモデルを言っています。

  • 次に、さらにループを200回実行します。 train()への各呼び出しは、デフォルトの5回のパスを行います。そしてalphaを0.025から0.00299倍減らすことによって、最後のループは0.025-(200 * 0.002)= - 0.375の有効なalphaを使用して、本質的に、それぞれ反対方向に大きな補正を行うようにモデルに指示するトレーニング例。

iterパラメータを使用して、必要なパス数を選択するだけです。クラスがalpha変更自体を管理するようにします。モデルをインスタンス化するときにコーパスを提供する場合、それ以上のステップは必要ありません。しかし、インスタンス化時にコーパスを提供しない場合は、model.build_vocab(tagged_docs)を一度実行し、次にmodel.train(tagged_docs)を1回実行する必要があります。

関連する問題