word2vecの学習(その2 学習と作ったモデルで近い単語を検索)

書いてる理由

  • itemのレコメンドをやりたい。
  • せっかくword2vecの記事も書いたし自分で学習そういえばしてない。
  • 日本語のデータセットで単語をベクトルにしたろ。

概要

word2vecの学習と作ったモデルで近い単語検索。

参考

https://own-search-and-study.xyz/2017/10/08/mecab%E3%81%A8gensim%E3%81%A7word2vec%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E5%AD%A6%E7%BF%92%E3%81%99%E3%82%8B/

qiita.com

radimrehurek.com

コード

https://github.com/ys201810/pytorch_work/blob/master/nlp/word2vec/train.py
gensimのバージョンは3.8.1

詳細

前回データを準備したので今日は学習。

コードと説明

学習は1行で終わり。train_word_listは[[1ファイル目の名詞のリスト], [2ファイルの名詞のリスト], [3ファイルの名詞のリスト], ・・・]という感じのリストのリスト。
オプションは、sg=1でskip-gramの利用、size=200は中間層の次元数、min_count=5は出現頻度の下限、window=5は前後何単語を学習に利用するか、iter=10は学習回数。他にもオプションがありここに書かれてる。

これめっちゃ早い。
用意したテキストファイルが800程度なんだけど、iter=5で10秒くらいで完了する。まぁゆうて中間層1つのニューラルネットだからか。

model = word2vec.Word2Vec(train_word_list, sg=1, size=200, min_count=5, window=5, iter=10)
model.save("it_life_hach.vec")

学習した単語は、model.wv.index2wordでリストで確認できる。

    print(model.wv.index2word)
> ['0', '00', 'こと', 'の', '0000', '000', 'よう', '人', '日', '写真', '機能', '月', 'アプリ', '製品', '通', 'iPhone', 'PC', '画面', '年', '対応', '的', '記事', 'サービス', ・・・

学習済みのモデルのロードは以下でOK。

        model = word2vec.Word2Vec.load('it_life_hach.vec')

学習した単語と近い意味をもつ単語の検索は、model.most_similar(positive='', negative=[''], topn=10)みたいな感じですぐできる。positiveが足す単語、negativeが引く単語、topnは似ている上位n件の指定。

    print(model.most_similar(positive='PC', topn=10))
> [('パソコン', 0.542239785194397), ('マシン', 0.5198276042938232), ('パーツ', 0.5117242932319641), ('Lenovo', 0.5105873942375183), ('PCSurface', 0.510017454624176), ('ホット', 0.48552387952804565), ('livedoorAllrightsreserved', 0.4766610562801361), ('BUFFALO', 0.47551679611206055), ('ADS', 0.47022581100463867), ('自作', 0.4686732888221741)]

例えば上のように、"PC"に近い単語10件取ってきてってやると、"パソコン"、"マシン"、"パーツ"、"Lenovo"とかまぁそれっぽくなってる。
色々やって見たので、結果を下に残しとく。

    print(model.most_similar(positive='USB', topn=10))
> [('ハブ', 0.7374204397201538), ('DisplayDockUSBDD', 0.7224056720733643), ('ポート', 0.719234049320221), ('USBAC', 0.6983264684677124), ('DisplayDock', 0.6923604011535645), ('給電', 0.6907951831817627), ('DVI', 0.6888191103935242), ('バス', 0.6828231811523438), ('DisplayPort', 0.6816741228103638), ('microUSB', 0.6776746511459351)]
    print(model.most_similar(positive='自作', topn=10))
> [('吉田', 0.8314720392227173), ('自演', 0.754409670829773), ('パワーアップ', 0.7220309972763062), ('Kepler', 0.686199426651001), ('お披露目', 0.6804928183555603), ('ハイ', 0.675638735294342), ('Atom', 0.6636908054351807), ('IVYBridge', 0.6567273139953613), ('ハイエンド', 0.6537321209907532), ('ZALMANTECH', 0.6521504521369934)]
    print(model.most_similar(positive='動画', topn=10))
> [('YouTube', 0.565751314163208), ('Youtube', 0.5606816411018372), ('Zero', 0.5444880723953247), ('再生', 0.5260715484619141), ('niconico', 0.5242639780044556), ('静止', 0.5154920220375061), ('DropBox', 0.5099486708641052), ('トリミング', 0.5087630748748779), ('ムダ', 0.5000234246253967), ('仲間', 0.49992501735687256)]
    print(model.most_similar(positive='ドワンゴ', topn=10))
> [('ディー・エヌ・エー', 0.8797209858894348), ('離島', 0.8648012280464172), ('ニワンゴ', 0.8633261919021606), ('ニッポン', 0.8607363700866699), ('ツアー', 0.8603464365005493), ('八丈島', 0.8534375429153442), ('甲子園', 0.8529332876205444), ('主催', 0.8493121862411499), ('協賛', 0.8488054871559143), ('両社', 0.8449000120162964)]
    print(model.most_similar(positive='ゲーム', topn=10))
> [('ドラクエ', 0.631476640701294), ('RPG', 0.6216651797294617), ('通貨', 0.6093518733978271), ('クエスト', 0.5999715924263), ('機', 0.5964876413345337), ('有利', 0.5940253138542175), ('Wii', 0.5877978801727295), ('ドラゴン', 0.5833920836448669), ('MMORPG', 0.5785256624221802), ('X', 0.5780864953994751)]
    print(model.most_similar(positive='価格', topn=10))
> [('税込', 0.6903715133666992), ('円', 0.6476924419403076), ('送料', 0.6229853630065918), ('プライス', 0.6183621883392334), ('売', 0.597088634967804), ('弱', 0.5957299470901489), (',', 0.5839619040489197), ('手頃', 0.5818260908126831), ('税', 0.5642960071563721), ('特価', 0.5609167218208313)]
    print(model.most_similar(negative=['価格'], topn=10))
> [('センター', 0.040699366480112076), ('祭', 0.02994706481695175), ('目', 0.028005525469779968), ('メッセージ', 0.023733625188469887), ('山本', 0.023150630295276642), ('三宅', 0.012243770062923431), ('局', 0.009874465875327587), ('式', 0.003436043858528137), ('プレゼン', 0.0030822306871414185), ('お知らせ', 0.00019585248082876205)]
    print(model.most_similar(positive=['YouTube', 'niconico'], negative=['再生'], topn=10))
> [('特設', 0.6948738098144531), ('スポンサー', 0.6483626365661621), ('ツアー', 0.6459519267082214), ('級', 0.6418225765228271), ('コミックキューガール', 0.6330103874206543), ('ニワンゴ', 0.619797945022583), ('NHNJapan', 0.6170900464057922), ('突入', 0.6129345893859863), ('グルメ', 0.6117421388626099), ('ドワンゴ', 0.6107887029647827)]

まぁ概ねそれっぽい。negativeがいまいちうまく機能していない気がする。
"自作"に一番近い"吉田"は自作界の神ですか???

"吉田"で学習元のテキストの出現を確認したところ、昔の日本のインテルの社長の吉田和正かぁー なるほど。
こういう発見ができるのも良さかも。意味が近いとはちょっと違う気もするけど・・・・。

インテル社長の自作PCまとめ 吉田社長の個性的な自作機【デジ通】
インテルは最新世代のプロセッサーをリリースするタイミングなどで、吉田社長が自作したPCを公開するのが恒例になっている。吉田社長の自作PCは、インテル製で固めているとは言え、最新世代を一般発売前に、ハイエンドな構成で自作することが多い。IVY bridgeも出たことだし、良い機会なので、その時々のトレンドなども盛り込まれていて興味深い点などもあり、その歴史を勝手にまとめてみた。
筆者が取材した範囲では、吉田社長がPCを自作していることを公表したのが、2006年12月に行われた会見だ。この時はCore 2 DuoやCore 2 Quadを手伝ってもらいながら自作してみたということで、自作を始めたばかりだったようだ。この頃のCPUはCore 2 Duo E6400 (Conroe)などの時代だ。
この時に公開されたのが、吉田社長の趣味の音楽を中心にした構成の「Entertainment Music Station」。
インテルの吉田和正社長
・インテル社長の自作PCまとめ 吉田社長の個性的な自作機【デジ通】
高性能で低消費電力!インテル吉田社長が語る、IVY Bridgeの魅力
「インテル社長の自作PCまとめ 吉田社長の個性的な自作機【デジ通】」で紹介したように、インテルの吉田社長は第三世代Core i プロセッサー(コードネーム:IVY bridge)を使用した自作PCを製作した。
吉田社長にこの新型プロセッサーの魅力を語っていただいたので、ここで紹介しよう。
■3次元構造のトランジスタ技術を採用 - インテル 吉田社長
吉田社長は、第三世代のCore iシリーズに関して次のように語った。「皆様に紹介したい第三世代Core i プロセッサーに関してなんですけれども、特徴といたしましては、やはり高性能、そして低消費電力となります。とくにメディア機能系の処理性能が飛躍的にあがっています。また内蔵グラフィックス関係では、従来と比べて約2倍の性能の向上がみられますので、これは本当に体感していただけるレベルではないかと思います。...」
インテル吉田社長の自作PCをパワーアップ!“超”社長PCを作ってみた
「インテル社長の自作PCまとめ 吉田社長の個性的な自作機【デジ通】」で紹介したように、インテルの吉田社長は同社の最新プロセッサーをリリースするタイミングで、自作したPCをお披露目するのが恒例となっている。
そんな吉田社長の最新作は、第3世代インテルCoreプロセッサー(Ivy Bridge)の発表に合わせて製作した自作PCだが、そのPCをパワーアップさせた社長PCを超える“超”社長PCとでも言えるPCをDr.クリス氏が作ったとの報告を受けたので、ここで紹介しよう。
■吉田社長の自作PCを超えた「“超”社長PC」
PCケースは、吉田社長と同じキューブ型ケース「Abee acubic B20G ACE-B20G-SK」を採用した。クリス氏いわく「なかなか、吉田社長もセンスがいいですね。」とのこと。
マザーボードは、吉田社長の自作PCとは異なり、より豪華になっている無線LANを備えた「ARSOCK  Z77E-ITX」を採用した。
少し見えづらいが、本体下部には、スリムタイプのブルーレイドライブ「Panasonic UJ-260」を備える。これも吉田社長のスペックそのままだ。

でこれがなんで商品のレコメンドに繋がるかというと、単語のリストを商品のリストに変えれば、似ている商品の検索ができるから。
なのでこれと同じようにやってあげればレコメンドになると。

gensimでの学習マジで簡単だった。。。
あとはいい感じのレコメンドデータが欲しいんだよなーー どっかにないかなー あったら、他の手法との比較とかできるのに。
商品の閲覧データとかどっかないかなー 探そう。