レコメンドシステム—— Item2Vec (GensimでEmbeddingをトレーニング)
シリーズの目次
レコメンドシステムのシリーズをここにまとめています。
無料相談コース(未経験OK)
- 機械学習やレコメンド分野でお悩みの方
- 機械学習やレコメンド分野に携わりたい方(理論から実装まで)
ぜひ下記の無料コースへお申し込みください!
機械学習エンジニア、レコメンドエンジニアになるためのサポート
はじめに
Item2Vecは、自然言語処理分野で広く活用されているWord2Vecの考え方を推薦システムに応用した革新的な技術です。例えばECサイトでの商品推薦において、Word2Vecにおける「単語」を「商品」に、「文章」を「ユーザーの購買・評価履歴」に置き換えることで、商品の分散表現(Embedding)を学習することができます。この学習された分散表現を用いることで、商品間の意味的な類似性を数値化し、より精度の高いレコメンデーションを実現することが可能となります。
Item2Vecについての詳細な技術解説は、以下のリンクをご参照ください:
本記事では、Pythonの代表的な自然言語処理ライブラリである「Gensim」を使用して、実際にアイテムのEmbeddingを生成する方法について、具体的な実装手順とともに解説していきます。
コード実例
インストール
pip install gensim
gensimにはword2vec、doc2vecなどのモデルが実装されていますが、word2vecにはCBOW(Continuous bag-of-words)とskip-gramの2つのモデルがあります。
データ前処理
Libの導入
import logging
import os
import gensim
from gensim.models import word2vec
# All the data could be downloaded from: https://1drv.ms/f/s!Ao2ItRTtXaxehiA2DdroBpFMIqL_
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
import nltk
## Need to download packages in advance.
# nltk.download('all')
article = open("/Users/hayden/Documents/data/1984.txt","r").read()
token_list = []
sentence = nltk.sent_tokenize(article)
for s in sentence:
words = nltk.word_tokenize(s)
token_list.append(words)
## Split with blank simplely.
# sentences = word2vec.LineSentence('data/1984.txt')
len(token_list)
token_list[100]
6702
['This', 'was', 'not', 'illegal', '(', 'nothing', 'was', 'illegal', ',' , 'since', 'there', 'were', 'no','longer', 'any','laws',')', ',', 'but', 'if', 'detected', 'it', 'was', 'reasonably', 'certain', 'that', 'it', 'would', 'be', 'punished', 'by', 'death', ',', 'or', 'at', 'least', 'by', 'twenty-five', 'years', 'in', 'a', 'forced-labour', 'camp', '.']
token_listは二次元のリストになり、sentencesとwordsということです。
モデルのトレーニング
model = word2vec.Word2Vec(token_list, sg=0,hs=1,min_count=4,window=10,vector_size=50,workers=4)
Gensimパラメータの詳細解説
基本パラメータ
-
sentences
:トレーニングデータとなるコーパスを指定します。イテラブルなリスト形式で与えることができ、大規模なデータセットの場合はディスクやネットワークからストリーミング形式で供給することも可能です。 -
sg
:モデルの学習方式を指定します- sg=1:Skip-gram方式
- sg=0:CBOW(Continuous Bag of Words)方式(デフォルト)
-
size
(int型):生成される分散表現ベクトルの次元数を指定します- デフォルト値:100
- 推奨設定:
- コーパスが100MB未満:デフォルト値(100)で十分
- 大規模コーパス:100〜300の範囲で設定
- 注意点:
- 小さすぎる次元数:ベクトル空間での衝突により精度低下
- 大きすぎる次元数:計算コストとメモリ使用量の増大
学習制御パラメータ
-
window
(int型):文脈窓のサイズを指定- デフォルト値:5
- 大きな値:より広い範囲の文脈関係を捉える(ただし計算コスト増)
-
min_count
:出現頻度の下限値- デフォルト値:5
- この値未満の出現頻度の単語は学習対象から除外
-
workers
:並列処理に使用するスレッド数- デフォルト:実行環境のCPUコア数
高度なパラメータ
-
negative
とsample
:通常はデフォルト値のまま使用- 学習結果に応じて微調整が可能
-
sample
:高頻度語のダウンサンプリングの閾値
-
hs
(Hierarchical Softmax):- hs=1:階層的ソフトマックスを使用
- hs=0(デフォルト):負例サンプリングを使用(negativeが0以外の場合)
詳細の説明は下記のオフィシャルサイトに見てください。
Embeddingの扱い
アイテムのEmbedding
model.wv['you']
array([-0.5462636 , 1.4320626 , -0.4568431 , 0.8021699 , -0.5455619 ,
-0.05609033, -0.7483306 , -0.00387839, -1.1634578 , 0.49402925,
1.451362 , -1.026659 , 1.5925962 , 0.50039256, -0.68487597,
-0.5655675 , 0.04943949, 1.0824729 , -0.9539901 , 0.93983656,
0.92929626, 0.34397632, 1.6380502 , 1.0974818 , 0.8904612 ,
0.5492748 , -0.1004713 , -1.436136 , 1.1982089 , 2.9891722 ,
-1.6135296 , -1.8696574 , -0.02344712, -1.6066076 , -1.219439 ,
1.5865974 , 0.97423553, 0.0551686 , 0.33960804, -0.22320561,
3.0165079 , -0.49505797, -0.22032976, 0.91331065, 1.4776955 ,
-0.7764727 , 1.0840627 , -0.6499999 , 0.98748434, -0.6491677 ],
dtype=float32)
Top Nのアイテム
model.wv.most_similar('you', topn =10)
[('want', 0.9507809281349182),
('You', 0.9488500952720642),
('we', 0.945176899433136),
('say', 0.9215162992477417),
('think', 0.9140624403953552),
('tell', 0.9118809700012207),
('suppose', 0.9098665118217468),
('I', 0.9038820862770081),
('?', 0.9027588367462158),
('do', 0.9024166464805603)]
類似度の計算
model.wv.similarity('country', 'you')
0.5865977
異なる種類のアイテムを選び出す
model.wv.doesnt_match("country political private you".split())
'you'
おわりに
Embeddingを活用したリコメンデーション
Item2Vecは、主にレコメンドシステムのリコール(候補アイテムの抽出)フェーズで活用されています。具体的には、ターゲットとなるアイテムに対して、Embeddingの類似度計算に基づいて上位N件の類似アイテムを抽出する手法が一般的です。
高速な類似アイテム検索の実現
実運用環境では、リアルタイムでの高速な類似アイテム検索が求められます。この要件に対応するため、以下のような選択肢があります:
- Faissライブラリの活用:高次元ベクトルの効率的な近似近傍探索を実現
- ベクターデータベースの利用:大規模なベクトルデータの管理と高速な検索を両立
Item2Vecの現状と展望
Item2Vecは、その数理的な複雑さにもかかわらず、現代のレコメンデーションシステムにおいて不可欠な技術として定着しています。その効果的な特徴表現能力により、Eコマース、動画配信、音楽配信など、様々な領域で広く採用されています。
Discussion