2017-09-12 9 views
0

単語ベクトルを合計して結果を比較する単純なアプローチを使用して、文比較の問題を解決しようとしています。私の目標は興味のある人にマッチさせることです。そのため、データセットは、趣味を説明する名前と短い文で構成されています。バッチはかなり小さく、数百人の人がいるので、私はdoc2vecを掘り下げる前に試してみたかったのです。gensimとの文の一致word2vec:手動入力モデルが機能しない

私はデータを完全に掃除し、ストップワードを除去し、トークン化し、lemmatizingすることでデータを準備します。私は、いくつかのテスト単語の類似点を見つけるときに適切な結果を返す単語ベクトルの事前訓練モデルを使用します。また、元のモデルの類似点を見つけるために文の単語を集計してみました - マッチは合理的です。類似点は、フレーズの一般的な意味の周りにあります。私は次のことをしようとしている文のマッチングのために

:名前(または人のidの)のうち

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

ビルド単語空のモデルを作成し、トレーニングなし

#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) 

SUMM各文の単語ベクトル対応する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の印刷ではクラスタリングがまったく表示されません。同様の方法を見つけることはまた、一致を見つけることができない(< 0.2類似係数は基本的にすべてのもの)。 []plot of the entire model[1]

誰かが間違っていたと思う人がいるのだろうか?私のアプローチはまったく有効ですか?

答えて

0

あなたのコードは、示されているように、ワードベクトル(ローカルテキストを使用)のいずれもtrain()も、他の場所からのベクトルもあらかじめロードしていません。だから、存在しているベクトル(build_vocab()の呼び出しによって作成されたもの)は、まだランダムに初期化された開始位置にあり、意味的な目的のためには役に立たないでしょう。

提案:

  • (a)のテキストの良い量を持っている場合は理にかなっているテキスト、から独自のベクトルを訓練のいずれか。または(b)他の場所からの荷重ベクトル。しかし、両方をやろうとしないでください。
  • build_vocab()のオプションは、経験豊富な実験的なオプションとみなされます。これは、既に単純なモードで作業していた場合にのみ価値があり、あなたがそれを必要としていることを確認し、すべての意味を理解してください。
  • 通常の使用では、Word2Vecモデルのsyn0プロパティに新しい値を明示的に再割り当てすることはありません。これらはクラスのトレーニングルーチンによって管理されるため、ゼロをゼロにするか変更する必要はありません。あなた自身のデータ構造内のモデルの外で、単語ベクトルに基づいて独自のテキスト要約ベクトルを集計する必要があります。
+0

お返事ありがとうございます!私はsyn0機能に関して混乱していました。これは、いくつかのGoogleグループのディスカッションでこのアップデート勧告を見たためです。私は類似性の計算のためにscipy.spatial.distance.cosine()を試す助言を得て、それは私のためにうまくいった。 – Nick

関連する問題