wikipediaのデータでdoc2vec

doc2vecでWikipediaを学習する - TadaoYamaokaの日記

を参考に、wikipediaのデータをdoc2vecでトレーニングし、類似単語を調べてみました。

総単語数 2,890,010
頻度10以下 2,364,440
残り単語数 525,570

doc2vecは、トレーニングした単語をmodel.wv.vocabで参照することができます。 単語数が、残り単語数の約半分になっているのは、出現頻度が少ない単語が出現している文を削除した時に別の単語も削除しているからでしょう。

>>> len(model.wv.vocab)
266732

トレーニングした単語は、word_vector(keyedvectors)に辞書形式で保存されます。

>>> model.wv.vocab
'カウンダ': <gensim.models.keyedvectors.Vocab object at 0x1143776d8>,
'持ち場': <gensim.models.keyedvectors.Vocab object at 0x10d97e208>,

結果は、(当然ですが)参考にした記事とほぼ同じになりました。

>>> model.most_similar('リンゴ')
[('花', 0.6139837503433228),
 ('トマト', 0.6134904623031616),
 ('ワイン', 0.6084833145141602),
 ('酒', 0.5981301665306091),
 ('果物', 0.5930838584899902),
 ('コーヒー', 0.5895085334777832),
 ('子供', 0.5830855965614319),
 ('果実', 0.5804908275604248),
 ('ビール', 0.5784652233123779),
 ('食べ物', 0.5778894424438477)]

>>> model.most_similar(positive=["ザク", "ガンダム"])
[('ms', 0.7442907094955444),
 ('モビルスーツ', 0.6582286357879639),
 ('モンスター', 0.652472734451294),
 ('x', 0.6502348184585571),
 ('機体', 0.6486747860908508),
 ('マシン', 0.6468290090560913),
 ('ロボット', 0.6423962712287903),
 ('cpu', 0.6389658451080322),
 ('戦闘機', 0.6290717124938965),
 ('ゲーム', 0.6265822649002075)]

>>> model.most_similar(positive=["猫"], negative=["フレンズ"])
[('動物', 0.6338815689086914),
 ('子供', 0.6299443244934082),
 ('人間', 0.6273439526557922),
 ('親', 0.6224128007888794),
 ('ネズミ', 0.6112015247344971),
 ('犬', 0.6050996780395508),
 ('自分', 0.598896324634552),
 ('魚', 0.5975416302680969),
 ('家族', 0.5973026752471924),
 ('が', 0.5970552563667297)]

ひらがなにすると結果が異なるもが興味深いです。リンゴの場合、カタカナ表記する語彙(トマト、ワイン、コーヒー、ビール)を使うコンテキストで用いられるのでしょうか?

>>> model.most_similar('りんご')
[('みかん', 0.5127906203269958), 
 ('桃', 0.479043573141098), 
 ('さくら', 0.45111995935440063), 
 ('リンゴ', 0.44701433181762695), 
 ('ラーメン', 0.42265254259109497), 
 ('梅', 0.4148010015487671), 
 ('ひまわり', 0.41388049721717834), 
 ('夏祭り', 0.3995071053504944), 
 ('弥生', 0.396240234375), 
 ('祭り', 0.3920435905456543)]

リンク