大體思路
分解user-item矩陣,將user和item embedding到低維稠密的(維度默認為20)空間,然后利用ES的dense vector字段來計算user和item的相關性分數,或item和item之間的相似度分數。
步驟
准備數據
訓練模型
模型導入es
生成推薦結果
依賴軟件的版本
Python3
Elasticsearch 7.11.1
准備數據
在https://grouplens.org/datasets/movielens/1m/下載movie lens作為訓練模型的數據
將movie lens數據放在D:\ml-data\movielens\ml-1m
創建一個目錄D:\ml-data\movielens\ml-1m\libmf, 后面生成的所有數據都會放在這個目錄中。
git clone git@github.com:ralgond/elasticsearch-recommender.git
cd elasticsearch-recommender
將movie lens的數據格式轉化成libmf格式
cd scripts
python movielens_format_libmf.py
執行成功后你能在D:\ml-data\movielens\ml-1m\libmf中找到一個ratings.libmf文件
切割文件
python movielens_data_split.py
執行成功后ratings.libfm文件會被切割成2個文件:
ratings_train.libmf
ratings_test.libmf
訓練模型
到https://www.csie.ntu.edu.tw/~cjlin/libmf/下載libmf-2.01.zip
解壓libmf-2.01.zip至D:\Software\libmf-2.01
將D:\Software\libmf-2.01\windows加入到環境變量PATH中
打開cmd
進入目錄D:\ml-data\movielens\ml-1m\libmf
執行
mf-train -k 20 ratings_train.libmf
會得到模型文件
ratings_train.libmf.model
將模型導入ES
首先創建users和movies索引,回到目錄elasticsearch-recommender
cd scripts
python movielens_create_indices.py
然后生成用戶評分歷史文件,主要是用在推薦時過濾掉那些已經看過的電影
python movielens_user_rate_history.py
然后push用戶數據到ES
python movielens_push_user_data.py
接着push movie數據到ES
python movielens_push_movie_data.py
利用es的搜索功能實現推薦
獲取和id為1(電影名為Toy Story (1995))的電影的相似度最高的10部電影
python movielens_rec_similar_movie.py 1
得到如下結果:
Toy Story 2 (1999)
Bug's Life, A (1998)
Bull Durham (1988)
Big (1988)
Parenthood (1989)
Heaven Can Wait (1978)
Fantasia 2000 (1999)
Sting, The (1973)
Glory (1989)
When Harry Met Sally... (1989)
為用戶1推薦最相關的10部電影
python movielens_rec_for_user.py 1
得到如下結果:
Marcello Mastroianni: I Remember Yes, I Remember (1997)
Smashing Time (1967)
Shawshank Redemption, The (1994)
Foreign Student (1994)
Leather Jacket Love Story (1997)
Raiders of the Lost Ark (1981)
It's a Wonderful Life (1946)
Sanjuro (1962)
Inherit the Wind (1960)
Bridge on the River Kwai, The (1957)