Elasticsearch(三)實現一個推薦系統


大體思路

分解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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM