単語ベクトルを合計して結果を比較する単純なアプローチを使用して、文比較の問題を解決しようとしています。私の目標は興味のある人にマッチさせることです。そのため、データセットは、趣味を説明する名前と短い文で構成されています。バッチはかなり小さく、数百人の人がいるので、私は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類似係数は基本的にすべてのもの)。 [
誰かが間違っていたと思う人がいるのだろうか?私のアプローチはまったく有効ですか?
お返事ありがとうございます!私はsyn0機能に関して混乱していました。これは、いくつかのGoogleグループのディスカッションでこのアップデート勧告を見たためです。私は類似性の計算のためにscipy.spatial.distance.cosine()を試す助言を得て、それは私のためにうまくいった。 – Nick