📚

レコメンドシステム—— Item2Vec (GensimでEmbeddingをトレーニング)

2023/09/26に公開

シリーズの目次

レコメンドシステムのシリーズをここにまとめています。
https://zenn.dev/datasciencekun/articles/dc0f61c0ca7f8d

無料相談コース(未経験OK)

  • 機械学習やレコメンド分野でお悩みの方
  • 機械学習やレコメンド分野に携わりたい方(理論から実装まで)

ぜひ下記の無料コースへお申し込みください!
機械学習エンジニア、レコメンドエンジニアになるためのサポート

はじめに

Item2Vecは、自然言語処理分野で広く活用されているWord2Vecの考え方を推薦システムに応用した革新的な技術です。例えばECサイトでの商品推薦において、Word2Vecにおける「単語」を「商品」に、「文章」を「ユーザーの購買・評価履歴」に置き換えることで、商品の分散表現(Embedding)を学習することができます。この学習された分散表現を用いることで、商品間の意味的な類似性を数値化し、より精度の高いレコメンデーションを実現することが可能となります。

Item2Vecについての詳細な技術解説は、以下のリンクをご参照ください:
https://qiita.com/dcm_kkubota/items/4c0a87e3a947c2f3e14b

本記事では、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コア数

高度なパラメータ

  • negativesample:通常はデフォルト値のまま使用

    • 学習結果に応じて微調整が可能
    • sample:高頻度語のダウンサンプリングの閾値
  • hs(Hierarchical Softmax):

    • hs=1:階層的ソフトマックスを使用
    • hs=0(デフォルト):負例サンプリングを使用(negativeが0以外の場合)

詳細の説明は下記のオフィシャルサイトに見てください。
https://radimrehurek.com/gensim/models/word2vec.html

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