From d9bfa512f76098622ec65d1fd94ef6d846dfdf1b Mon Sep 17 00:00:00 2001 From: taytroye <1582706091@qq.com> Date: Wed, 1 Nov 2023 22:47:50 +0800 Subject: [PATCH] FIX:(update docs) --- asset/dataset_list.json | 931 +++++++++--------- asset/model_list.json | 83 +- docs/source/asset/eulernet.png | Bin 0 -> 66401 bytes docs/source/conf.py | 4 +- docs/source/index.rst | 10 +- ...del.context_aware_recommender.eulernet.rst | 4 + ...ecbole.model.context_aware_recommender.rst | 4 + ...bole.model.general_recommender.diffrec.rst | 4 + ...ole.model.general_recommender.ldiffrec.rst | 4 + ...cbole.model.general_recommender.random.rst | 4 + .../recbole.model.general_recommender.rst | 13 +- ...bole.model.knowledge_aware_recommender.rst | 2 + ...le.model.sequential_recommender.fearec.rst | 4 + .../recbole.model.sequential_recommender.rst | 1 + docs/source/user_guide/data_intro.rst | 2 +- .../user_guide/model/context/eulernet.rst | 78 ++ .../user_guide/model/sequential/fearec.rst | 6 +- docs/source/user_guide/model_intro.rst | 4 +- recbole/model/general_recommender/__init__.py | 1 - .../model/sequential_recommender/fearec.py | 2 - 20 files changed, 666 insertions(+), 495 deletions(-) create mode 100644 docs/source/asset/eulernet.png create mode 100644 docs/source/recbole/recbole.model.context_aware_recommender.eulernet.rst create mode 100644 docs/source/recbole/recbole.model.general_recommender.diffrec.rst create mode 100644 docs/source/recbole/recbole.model.general_recommender.ldiffrec.rst create mode 100644 docs/source/recbole/recbole.model.general_recommender.random.rst create mode 100644 docs/source/recbole/recbole.model.sequential_recommender.fearec.rst create mode 100644 docs/source/user_guide/model/context/eulernet.rst diff --git a/asset/dataset_list.json b/asset/dataset_list.json index 7f3fe07e5..9550df70e 100644 --- a/asset/dataset_list.json +++ b/asset/dataset_list.json @@ -1,455 +1,478 @@ { - "data": [ - { - "dataset": "MovieLens", - "dataset_link": "https://github.com/RUCAIBox/RecDatasets/tree/master/dataset_info/MovieLens", - "user_num": "-", - "item_num": "-", - "inter_num": "-", - "sparsity": "-", - "type": "Rating", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/MovieLens.md" - }, - { - "dataset": "Anime", - "dataset_link": "", - "user_num": "73,515", - "item_num": "11,200", - "inter_num": "7,813,737", - "sparsity": "99.05%", - "type": "Rating [-1, 1-10]", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Anime.md" - }, - { - "dataset": "Epinions", - "dataset_link": "", - "user_num": "116,260", - "item_num": "41,269", - "inter_num": "188,478", - "sparsity": "99.99%", - "type": "Rating [1-5]", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Epinions.md" - }, - { - "dataset": "Yelp", - "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/Yelp", - "user_num": "-", - "item_num": "-", - "inter_num": "-", - "sparsity": "-", - "type": "Rating", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Yelp.md" - }, - { - "dataset": "Netflix", - "dataset_link": "", - "user_num": "480,189", - "item_num": "17,770", - "inter_num": "100,480,507", - "sparsity": "98.82%", - "type": "Rating [1-5]", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Netflix.md" - }, - { - "dataset": "Book-Crossing", - "dataset_link": "", - "user_num": "105,284", - "item_num": "340,557", - "inter_num": "1,149,780", - "sparsity": "99.99%", - "type": "Rating [0-10]", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Book-Crossing.md" - }, - { - "dataset": "Jester", - "dataset_link": "", - "user_num": "73,421", - "item_num": "101", - "inter_num": "4,136,360", - "sparsity": "44.22%", - "type": "Rating [-10, 10]", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Jester.md" - }, - { - "dataset": "Douban", - "dataset_link": "", - "user_num": "738,701", - "item_num": "28", - "inter_num": "2,125,056", - "sparsity": "89.73%", - "type": "Rating [0, 5]", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Douban.md" - }, - { - "dataset": "Yahoo Music", - "dataset_link": "", - "user_num": "1,948,882", - "item_num": "98,211", - "inter_num": "111,557,943", - "sparsity": "99.99%", - "type": "Rating [0, 100]", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/YahooMusic.md" - }, - { - "dataset": "KDD2010", - "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/KDD2010", - "user_num": "-", - "item_num": "-", - "inter_num": "-", - "sparsity": "-", - "type": "Rating", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/KDD2010.md" - }, - { - "dataset": "Amazon", - "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/Amazon", - "user_num": "-", - "item_num": "-", - "inter_num": "-", - "sparsity": "-", - "type": "Rating [0, 5]", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Amazon.md" - }, - { - "dataset": "Pinterest", - "dataset_link": "", - "user_num": "55,187", - "item_num": "9,911", - "inter_num": "1,445,622", - "sparsity": "99.74%", - "type": "-", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Pinterest.md" - }, - { - "dataset": "Gowalla", - "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/Gowalla", - "user_num": "107,092", - "item_num": "1,280,969", - "inter_num": "6,442,892", - "sparsity": "99.99%", - "type": "Check-in", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Gowalla.md" - }, - { - "dataset": "Last.FM", - "dataset_link": "", - "user_num": "1,892", - "item_num": "17,632", - "inter_num": "92,834", - "sparsity": "99.72%", - "type": "Click", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/LastFM.md" - }, - { - "dataset": "DIGINETICA", - "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/DIGINETICA", - "user_num": "204,789", - "item_num": "184,047", - "inter_num": "993,483", - "sparsity": "99.99%", - "type": "Click", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/DIGINETICA.md" - }, - { - "dataset": "Steam", - "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/Steam", - "user_num": "2,567,538", - "item_num": "32,135", - "inter_num": "7,793,069", - "sparsity": "99.99%", - "type": "Buy", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Steam.md" - }, - { - "dataset": "Ta Feng", - "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/TaFeng", - "user_num": "32,266", - "item_num": "23,812", - "inter_num": "817,741", - "sparsity": "99.89%", - "type": "Click", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/TaFeng.md" - }, - { - "dataset": "Foursquare", - "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/Foursquare", - "user_num": "-", - "item_num": "-", - "inter_num": "-", - "sparsity": "-", - "type": "Check-in", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Foursquare.md" - }, - { - "dataset": "Tmall", - "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/Tmall", - "user_num": "963,923", - "item_num": "2,353,207", - "inter_num": "44,528,127", - "sparsity": "99.99%", - "type": "Click/Buy", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Tmall.md" - }, - { - "dataset": "YOOCHOOSE", - "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/YOOCHOOSE", - "user_num": "9,249,729", - "item_num": "52,739", - "inter_num": "34,154,697", - "sparsity": "99.99%", - "type": "Click/Buy", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/YOOCHOOSE.md" - }, - { - "dataset": "Retailrocket", - "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/Retailrocket", - "user_num": "1,407,580", - "item_num": "247,085", - "inter_num": "2,756,101", - "sparsity": "99.99%", - "type": "View/Addtocart/Transaction", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Retailrocket.md" - }, - { - "dataset": "LFM-1b", - "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/LFM-1b", - "user_num": "120,322", - "item_num": "3,123,496", - "inter_num": "1,088,161,692", - "sparsity": "99.71%", - "type": "Click", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/LFM-1b.md" - }, - { - "dataset": "MIND", - "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/MIND", - "user_num": "-", - "item_num": "-", - "inter_num": "-", - "sparsity": "-", - "type": "Click", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/MIND.md" - }, - { - "dataset": "BeerAdvocate", - "dataset_link": "", - "user_num": "33,388", - "item_num": "66,055", - "inter_num": "1,586,614", - "sparsity": "99.9281%", - "type": "Rating [0, 5]", - "link_name": "link", - "link_url": "https://cseweb.ucsd.edu/~jmcauley/datasets.html#multi_aspect" - }, - { - "dataset": "Behance", - "dataset_link": "", - "user_num": "63,497", - "item_num": "178,788", - "inter_num": "1,000,000", - "sparsity": "99.9912%", - "type": "Likes", - "link_name": "link", - "link_url": "https://cseweb.ucsd.edu/~jmcauley/datasets.html#behance" - }, - { - "dataset": "DianPing", - "dataset_link": "", - "user_num": "542,706", - "item_num": "243,247", - "inter_num": "4,422,473", - "sparsity": "99.9967%", - "type": "Rating [0, 5]", - "link_name": "link", - "link_url": "http://yongfeng.me/dataset/" - }, - { - "dataset": "EndoMondo", - "dataset_link": "", - "user_num": "1,104", - "item_num": "253,020", - "inter_num": "253,020", - "sparsity": "99.9094%", - "type": "Workout Logs", - "link_name": "link", - "link_url": "https://cseweb.ucsd.edu/~jmcauley/datasets.html#endomondo" - }, - { - "dataset": "Food", - "dataset_link": "", - "user_num": "226,570", - "item_num": "231,637", - "inter_num": "1,132,367", - "sparsity": "99.9978%", - "type": "Rating [0, 5]", - "link_name": "link", - "link_url": "https://cseweb.ucsd.edu/~jmcauley/datasets.html#foodcom" - }, - { - "dataset": "GoodReads", - "dataset_link": "", - "user_num": "876,145", - "item_num": "2,360,650", - "inter_num": "228,648,342", - "sparsity": "99.9889%", - "type": "Rating [0, 5]", - "link_name": "link", - "link_url": "https://cseweb.ucsd.edu/~jmcauley/datasets.html#goodreads" - }, - { - "dataset": "KGRec", - "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/KGRec", - "user_num": "-", - "item_num": "-", - "inter_num": "-", - "sparsity": "-", - "type": "Click", - "link_name": "link", - "link_url": "https://www.upf.edu/web/mtg/kgrec" - }, - { - "dataset": "ModCloth", - "dataset_link": "", - "user_num": "47,958", - "item_num": "1,378", - "inter_num": "82,790", - "sparsity": "99.8747%", - "type": "Rating [0, 5]", - "link_name": "link", - "link_url": "https://cseweb.ucsd.edu/~jmcauley/datasets.html#clothing_fit" - }, - { - "dataset": "RateBeer", - "dataset_link": "", - "user_num": "29,265", - "item_num": "110,369", - "inter_num": "2,924,163", - "sparsity": "99.9095%", - "type": "Overall Rating [0, 20]", - "link_name": "link", - "link_url": "https://cseweb.ucsd.edu/~jmcauley/datasets.html#multi_aspect" - }, - { - "dataset": "RentTheRunway", - "dataset_link": "", - "user_num": "105,571", - "item_num": "5,850", - "inter_num": "192,544", - "sparsity": "99.9688%", - "type": "Rating [0, 10]", - "link_name": "link", - "link_url": "https://cseweb.ucsd.edu/~jmcauley/datasets.html#clothing_fit" - }, - { - "dataset": "Twitch", - "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/Twitch", - "user_num": "15,524,309", - "item_num": "6,161,666", - "inter_num": "474,676,929", - "sparsity": "99.9995%", - "type": "Click", - "link_name": "link", - "link_url": "https://cseweb.ucsd.edu/~jmcauley/datasets.html#twitch" - }, - { - "dataset": "Criteo", - "dataset_link": "", - "user_num": "-", - "item_num": "-", - "inter_num": "45,850,617", - "sparsity": "-", - "type": "Click", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Criteo.md" - }, - { - "dataset": "Avazu", - "dataset_link": "", - "user_num": "-", - "item_num": "-", - "inter_num": "40,428,967", - "sparsity": "-", - "type": "Click", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Avazu.md" - }, - { - "dataset": "iPinYou", - "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/iPinYou", - "user_num": "19,731,660", - "item_num": "163", - "inter_num": "24,637,657", - "sparsity": "99.23%", - "type": "View/Click", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/iPinYou.md" - }, - { - "dataset": "Phishing websites", - "dataset_link": "", - "user_num": "-", - "item_num": "-", - "inter_num": "11,055", - "sparsity": "-", - "type": "Click", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Phishing%20Websites.md" - }, - { - "dataset": "Adult", - "dataset_link": "", - "user_num": "-", - "item_num": "-", - "inter_num": "32,561", - "sparsity": "-", - "type": "income>=50k [0, 1]", - "link_name": "script", - "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Adult.md" - }, - { - "dataset": "Alibaba-iFashion", - "dataset_link": "", - "user_num": "3,569,112", - "item_num": "4,463,302", - "inter_num": "191,394,393", - "sparsity": "99.9988%", - "type": "Click", - "link_name": "link", - "link_url": "https://github.com/wenyuer/POG" - }, - { - "dataset": "AliEC", - "dataset_link": "", - "user_num": "491,647", - "item_num": "240,130", - "inter_num": "1,366,056", - "sparsity": "99.9988%", - "type": "Click", - "link_name": "link", - "link_url": "https://tianchi.aliyun.com/dataset/dataDetail?dataId=56#1" - } - ] -} + "data": [ + { + "dataset": "MovieLens", + "dataset_link": "https://github.com/RUCAIBox/RecDatasets/tree/master/dataset_info/MovieLens", + "user_num": "-", + "item_num": "-", + "inter_num": "-", + "sparsity": "-", + "type": "Rating", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/MovieLens.md" + }, + { + "dataset": "Anime", + "dataset_link": "", + "user_num": "73,515", + "item_num": "11,200", + "inter_num": "7,813,737", + "sparsity": "99.05%", + "type": "Rating [-1, 1-10]", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Anime.md" + }, + { + "dataset": "Epinions", + "dataset_link": "", + "user_num": "116,260", + "item_num": "41,269", + "inter_num": "188,478", + "sparsity": "99.99%", + "type": "Rating [1-5]", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Epinions.md" + }, + { + "dataset": "Yelp", + "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/Yelp", + "user_num": "-", + "item_num": "-", + "inter_num": "-", + "sparsity": "-", + "type": "Rating", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Yelp.md" + }, + { + "dataset": "Netflix", + "dataset_link": "", + "user_num": "480,189", + "item_num": "17,770", + "inter_num": "100,480,507", + "sparsity": "98.82%", + "type": "Rating [1-5]", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Netflix.md" + }, + { + "dataset": "Book-Crossing", + "dataset_link": "", + "user_num": "105,284", + "item_num": "340,557", + "inter_num": "1,149,780", + "sparsity": "99.99%", + "type": "Rating [0-10]", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Book-Crossing.md" + }, + { + "dataset": "Jester", + "dataset_link": "", + "user_num": "73,421", + "item_num": "101", + "inter_num": "4,136,360", + "sparsity": "44.22%", + "type": "Rating [-10, 10]", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Jester.md" + }, + { + "dataset": "Douban", + "dataset_link": "", + "user_num": "738,701", + "item_num": "28", + "inter_num": "2,125,056", + "sparsity": "89.73%", + "type": "Rating [0, 5]", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Douban.md" + }, + { + "dataset": "Yahoo Music", + "dataset_link": "", + "user_num": "1,948,882", + "item_num": "98,211", + "inter_num": "111,557,943", + "sparsity": "99.99%", + "type": "Rating [0, 100]", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/YahooMusic.md" + }, + { + "dataset": "KDD2010", + "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/KDD2010", + "user_num": "-", + "item_num": "-", + "inter_num": "-", + "sparsity": "-", + "type": "Rating", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/KDD2010.md" + }, + { + "dataset": "Amazon", + "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/Amazon", + "user_num": "-", + "item_num": "-", + "inter_num": "-", + "sparsity": "-", + "type": "Rating [0, 5]", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Amazon.md" + }, + { + "dataset": "Pinterest", + "dataset_link": "", + "user_num": "55,187", + "item_num": "9,911", + "inter_num": "1,445,622", + "sparsity": "99.74%", + "type": "-", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Pinterest.md" + }, + { + "dataset": "Gowalla", + "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/Gowalla", + "user_num": "107,092", + "item_num": "1,280,969", + "inter_num": "6,442,892", + "sparsity": "99.99%", + "type": "Check-in", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Gowalla.md" + }, + { + "dataset": "Last.FM", + "dataset_link": "", + "user_num": "1,892", + "item_num": "17,632", + "inter_num": "92,834", + "sparsity": "99.72%", + "type": "Click", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/LastFM.md" + }, + { + "dataset": "DIGINETICA", + "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/DIGINETICA", + "user_num": "204,789", + "item_num": "184,047", + "inter_num": "993,483", + "sparsity": "99.99%", + "type": "Click", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/DIGINETICA.md" + }, + { + "dataset": "Steam", + "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/Steam", + "user_num": "2,567,538", + "item_num": "32,135", + "inter_num": "7,793,069", + "sparsity": "99.99%", + "type": "Buy", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Steam.md" + }, + { + "dataset": "Ta Feng", + "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/TaFeng", + "user_num": "32,266", + "item_num": "23,812", + "inter_num": "817,741", + "sparsity": "99.89%", + "type": "Click", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/TaFeng.md" + }, + { + "dataset": "Foursquare", + "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/Foursquare", + "user_num": "-", + "item_num": "-", + "inter_num": "-", + "sparsity": "-", + "type": "Check-in", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Foursquare.md" + }, + { + "dataset": "Tmall", + "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/Tmall", + "user_num": "963,923", + "item_num": "2,353,207", + "inter_num": "44,528,127", + "sparsity": "99.99%", + "type": "Click/Buy", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Tmall.md" + }, + { + "dataset": "YOOCHOOSE", + "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/YOOCHOOSE", + "user_num": "9,249,729", + "item_num": "52,739", + "inter_num": "34,154,697", + "sparsity": "99.99%", + "type": "Click/Buy", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/YOOCHOOSE.md" + }, + { + "dataset": "Retailrocket", + "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/Retailrocket", + "user_num": "1,407,580", + "item_num": "247,085", + "inter_num": "2,756,101", + "sparsity": "99.99%", + "type": "View/Addtocart/Transaction", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Retailrocket.md" + }, + { + "dataset": "LFM-1b", + "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/LFM-1b", + "user_num": "120,322", + "item_num": "3,123,496", + "inter_num": "1,088,161,692", + "sparsity": "99.71%", + "type": "Click", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/LFM-1b.md" + }, + { + "dataset": "MIND", + "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/MIND", + "user_num": "-", + "item_num": "-", + "inter_num": "-", + "sparsity": "-", + "type": "Click", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/MIND.md" + }, + { + "dataset": "BeerAdvocate", + "dataset_link": "", + "user_num": "33,388", + "item_num": "66,055", + "inter_num": "1,586,614", + "sparsity": "99.9281%", + "type": "Rating [0, 5]", + "link_name": "link", + "link_url": "https://cseweb.ucsd.edu/~jmcauley/datasets.html#multi_aspect" + }, + { + "dataset": "Behance", + "dataset_link": "", + "user_num": "63,497", + "item_num": "178,788", + "inter_num": "1,000,000", + "sparsity": "99.9912%", + "type": "Likes", + "link_name": "link", + "link_url": "https://cseweb.ucsd.edu/~jmcauley/datasets.html#behance" + }, + { + "dataset": "DianPing", + "dataset_link": "", + "user_num": "542,706", + "item_num": "243,247", + "inter_num": "4,422,473", + "sparsity": "99.9967%", + "type": "Rating [0, 5]", + "link_name": "link", + "link_url": "http://yongfeng.me/dataset/" + }, + { + "dataset": "EndoMondo", + "dataset_link": "", + "user_num": "1,104", + "item_num": "253,020", + "inter_num": "253,020", + "sparsity": "99.9094%", + "type": "Workout Logs", + "link_name": "link", + "link_url": "https://cseweb.ucsd.edu/~jmcauley/datasets.html#endomondo" + }, + { + "dataset": "Food", + "dataset_link": "", + "user_num": "226,570", + "item_num": "231,637", + "inter_num": "1,132,367", + "sparsity": "99.9978%", + "type": "Rating [0, 5]", + "link_name": "link", + "link_url": "https://cseweb.ucsd.edu/~jmcauley/datasets.html#foodcom" + }, + { + "dataset": "GoodReads", + "dataset_link": "", + "user_num": "876,145", + "item_num": "2,360,650", + "inter_num": "228,648,342", + "sparsity": "99.9889%", + "type": "Rating [0, 5]", + "link_name": "link", + "link_url": "https://cseweb.ucsd.edu/~jmcauley/datasets.html#goodreads" + }, + { + "dataset": "KGRec", + "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/KGRec", + "user_num": "-", + "item_num": "-", + "inter_num": "-", + "sparsity": "-", + "type": "Click", + "link_name": "link", + "link_url": "https://www.upf.edu/web/mtg/kgrec" + }, + { + "dataset": "ModCloth", + "dataset_link": "", + "user_num": "47,958", + "item_num": "1,378", + "inter_num": "82,790", + "sparsity": "99.8747%", + "type": "Rating [0, 5]", + "link_name": "link", + "link_url": "https://cseweb.ucsd.edu/~jmcauley/datasets.html#clothing_fit" + }, + { + "dataset": "RateBeer", + "dataset_link": "", + "user_num": "29,265", + "item_num": "110,369", + "inter_num": "2,924,163", + "sparsity": "99.9095%", + "type": "Overall Rating [0, 20]", + "link_name": "link", + "link_url": "https://cseweb.ucsd.edu/~jmcauley/datasets.html#multi_aspect" + }, + { + "dataset": "RentTheRunway", + "dataset_link": "", + "user_num": "105,571", + "item_num": "5,850", + "inter_num": "192,544", + "sparsity": "99.9688%", + "type": "Rating [0, 10]", + "link_name": "link", + "link_url": "https://cseweb.ucsd.edu/~jmcauley/datasets.html#clothing_fit" + }, + { + "dataset": "Twitch", + "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/Twitch", + "user_num": "15,524,309", + "item_num": "6,161,666", + "inter_num": "474,676,929", + "sparsity": "99.9995%", + "type": "Click", + "link_name": "link", + "link_url": "https://cseweb.ucsd.edu/~jmcauley/datasets.html#twitch" + }, + { + "dataset": "Criteo", + "dataset_link": "", + "user_num": "-", + "item_num": "-", + "inter_num": "45,850,617", + "sparsity": "-", + "type": "Click", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Criteo.md" + }, + { + "dataset": "Avazu", + "dataset_link": "", + "user_num": "-", + "item_num": "-", + "inter_num": "40,428,967", + "sparsity": "-", + "type": "Click", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Avazu.md" + }, + { + "dataset": "iPinYou", + "dataset_link": "https://github.com/RUCAIBox/RecommenderSystems-Datasets/tree/master/dataset_info/iPinYou", + "user_num": "19,731,660", + "item_num": "163", + "inter_num": "24,637,657", + "sparsity": "99.23%", + "type": "View/Click", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/iPinYou.md" + }, + { + "dataset": "Phishing websites", + "dataset_link": "", + "user_num": "-", + "item_num": "-", + "inter_num": "11,055", + "sparsity": "-", + "type": "Click", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Phishing%20Websites.md" + }, + { + "dataset": "Adult", + "dataset_link": "", + "user_num": "-", + "item_num": "-", + "inter_num": "32,561", + "sparsity": "-", + "type": "income>=50k [0, 1]", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecDatasets/blob/master/conversion_tools/usage/Adult.md" + }, + { + "dataset": "Alibaba-iFashion", + "dataset_link": "", + "user_num": "3,569,112", + "item_num": "4,463,302", + "inter_num": "191,394,393", + "sparsity": "99.9988%", + "type": "Click", + "link_name": "link", + "link_url": "https://github.com/wenyuer/POG" + }, + { + "dataset": "AliEC", + "dataset_link": "", + "user_num": "491,647", + "item_num": "240,130", + "inter_num": "1,366,056", + "sparsity": "99.9988%", + "type": "Click", + "link_name": "link", + "link_url": "https://tianchi.aliyun.com/dataset/dataDetail?dataId=56#1" + }, + { + "dataset": "Music4All-Onion", + "dataset_link": "", + "user_num": "119,140", + "item_num": "109,269", + "inter_num": "252,984,396", + "sparsity": "-", + "type": "Click", + "link_name": "script", + "link_url": "https://github.com/RUCAIBox/RecSysDatasets/blob/master/conversion_tools/usage/Onion.md" + }, + { + "dataset": "Amazon_M2", + "dataset_link": "", + "user_num": "3,606,349", + "item_num": "1,410,675", + "inter_num": "15,306,183", + "sparsity": "-", + "type": "Click", + "link_name": "Link", + "link_url": "https://www.aicrowd.com/challenges/amazon-kdd-cup-23-multilingual-recommendation-challenge" + } + ] + } + \ No newline at end of file diff --git a/asset/model_list.json b/asset/model_list.json index e75baa9b1..b28b66ded 100644 --- a/asset/model_list.json +++ b/asset/model_list.json @@ -1987,33 +1987,6 @@ "repository": "RecBole", "repo_link": "https://github.com/RUCAIBox/RecBole" }, - { - "category": "Sequential Recommendation", - "cate_link": "/docs/user_guide/model_intro.html#sequential-recommendation", - "year": "2018", - "pub": "ICDM'18", - "model": "SASRec", - "model_link": "/docs/user_guide/model/sequential/sasrec.html", - "paper": "Self-Attentive Sequential Recommendation", - "paper_link": "https://doi.org/10.1109/ICDM.2018.00035", - "authors": "Wang-Cheng Kang and Julian McAuley", - "ref_code": "https://github.com/kang205/SASRec", - "repository": "RecBole", - "repo_link": "https://github.com/RUCAIBox/RecBole" - }, - { - "category": "Knowledge-aware Recommendation", - "year": "2018", - "pub": "MDPI'18", - "model": "CFKG", - "model_link": "/docs/user_guide/model/knowledge/cfkg.html", - "paper": "Learning heterogeneous knowledge base embeddings for explainable recommendation", - "paper_link": "https://doi.org/10.3390/a11090137", - "authors": "Qingyao Ai, Vahid Azizi, Xu Chen, Yongfeng Zhang", - "ref_code": "", - "repository": "RecBole", - "repo_link": "https://github.com/RUCAIBox/RecBole" - }, { "category": "Knowledge-aware Recommendation", "year": "2018", @@ -2143,6 +2116,62 @@ "ref_code": "", "repository": "RecBole", "repo_link": "https://github.com/RUCAIBox/RecBole" + }, + { + "category": "Context-aware Recommendation", + "cate_link": "/docs/user_guide/model_intro.html#context-aware-recommendation", + "year": "2023", + "pub": "SIGIR'23", + "model": "EulerNet", + "model_link": "/docs/user_guide/model/context/eulernet.html", + "paper": "EulerNet: Adaptive Feature Interaction Learning via Euler's Formula for CTR Prediction", + "paper_link": "https://dl.acm.org/doi/10.1145/3539618.3591681", + "authors": "Zhen Tian, Ting Bai, Wayne Xin Zhao, Ji-Rong Wen, Zhao Cao", + "ref_code": "https://github.com/chenyuwuxin/EulerNet", + "repository": "RecBole", + "repo_link": "https://github.com/RUCAIBox/RecBole" + }, + { + "category": "Sequential Recommendation", + "cate_link": "/docs/user_guide/model_intro.html#sequential-recommendation", + "year": "2023", + "pub": "SIGIR'23", + "model": "FEARec", + "model_link": "/docs/user_guide/model/sequential/fearec.html", + "paper": "FEARec: Frequency Enhanced Hybrid Attention Network for Sequential Recommendation", + "paper_link": "https://dl.acm.org/doi/10.1145/3539618.3591689", + "authors": "Xinyu Du, Huanhuan Yuan, Pengpeng Zhao, Jianfeng Qu, Fuzhen Zhuang, Guanfeng Liu, Victor S. Sheng", + "ref_code": "https://github.com/sudaada/FEARec", + "repository": "RecBole", + "repo_link": "https://github.com/RUCAIBox/RecBole" + }, + { + "category": "General Recommendation", + "cate_link": "/docs/user_guide/model_intro.html#general-recommendation", + "year": "2023", + "pub": "SIGIR'23", + "model": "DiffRec", + "model_link": "/docs/user_guide/model/general/diffrec.html", + "paper": "Diffusion Recommender Model", + "paper_link": "https://dl.acm.org/doi/10.1145/3539618.3591663", + "authors": "Wenjie Wang, Yiyan Xu, Fuli Feng, Xinyu Lin, Xiangnan He, Tat-Seng Chua", + "ref_code": "https://github.com/YiyanXu/DiffRec", + "repository": "RecBole", + "repo_link": "https://github.com/RUCAIBox/RecBole" + }, + { + "category": "General Recommendation", + "cate_link": "/docs/user_guide/model_intro.html#general-recommendation", + "year": "2023", + "pub": "SIGIR'23", + "model": "LDiffRec", + "model_link": "/docs/user_guide/model/general/ldiffrec.html", + "paper": "Diffusion Recommender Model", + "paper_link": "https://dl.acm.org/doi/10.1145/3539618.3591663", + "authors": "Wenjie Wang, Yiyan Xu, Fuli Feng, Xinyu Lin, Xiangnan He, Tat-Seng Chua", + "ref_code": "https://github.com/YiyanXu/DiffRec", + "repository": "RecBole", + "repo_link": "https://github.com/RUCAIBox/RecBole" } ] } \ No newline at end of file diff --git a/docs/source/asset/eulernet.png b/docs/source/asset/eulernet.png new file mode 100644 index 0000000000000000000000000000000000000000..d0bd2a3994b469e1658a151d2a349051b43bffdb GIT binary patch literal 66401 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 z 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 | `Docs `_ | `GitHub `_ | `Datasets `_ | `v0.1.2 `_ | `v0.2.0 `_ | `v1.0.0 `_ | `v1.0.1 `_ +`HomePage `_ | `Docs `_ | `GitHub `_ | `Datasets `_ | `v0.1.2 `_ | `v0.2.0 `_ | `v1.0.0 `_ | `v1.0.1 `_ | `v1.2.0 `_ Introduction ------------------------- RecBole is a unified, comprehensive and efficient framework developed based on PyTorch. It aims to help the researchers to reproduce and develop recommendation models. -In the lastest release, our library includes 90 recommendation algorithms `[Model List]`_, covering four major categories: +In the lastest release, our library includes 91 recommendation algorithms `[Model List]`_, covering four major categories: - General Recommendation - Sequential Recommendation - Context-aware Recommendation - Knowledge-based Recommendation -We design a unified and flexible data file format, and provide the support for 41 benchmark recommendation datasets `[Collected Datasets]`_. A user can apply the provided script to process the original data copy, or simply download the processed datasets by our team. +We design a unified and flexible data file format, and provide the support for 43 benchmark recommendation datasets `[Collected Datasets]`_. A user can apply the provided script to process the original data copy, or simply download the processed datasets by our team. .. image:: asset/framework.png :width: 600 @@ -29,7 +29,7 @@ Features: - General and extensible data structure We deign general and extensible data structures to unify the formatting and usage of various recommendation datasets. - Comprehensive benchmark models and datasets - We implement 86 commonly used recommendation algorithms, and provide the formatted copies of 41 recommendation datasets. + We implement 91 commonly used recommendation algorithms, and provide the formatted copies of 43 recommendation datasets. - Efficient GPU-accelerated execution We design many tailored strategies in the GPU environment to enhance the efficiency of our library. - Extensive and standard evaluation protocols diff --git a/docs/source/recbole/recbole.model.context_aware_recommender.eulernet.rst b/docs/source/recbole/recbole.model.context_aware_recommender.eulernet.rst new file mode 100644 index 000000000..2bce28639 --- /dev/null +++ b/docs/source/recbole/recbole.model.context_aware_recommender.eulernet.rst @@ -0,0 +1,4 @@ +.. automodule:: recbole.model.context_aware_recommender.eulernet + :members: + :undoc-members: + :show-inheritance: \ No newline at end of file diff --git a/docs/source/recbole/recbole.model.context_aware_recommender.rst b/docs/source/recbole/recbole.model.context_aware_recommender.rst index aeb5c3c5e..cec5a570e 100644 --- a/docs/source/recbole/recbole.model.context_aware_recommender.rst +++ b/docs/source/recbole/recbole.model.context_aware_recommender.rst @@ -7,12 +7,16 @@ recbole.model.context\_aware\_recommender recbole.model.context_aware_recommender.afm recbole.model.context_aware_recommender.autoint recbole.model.context_aware_recommender.dcn + recbole.model.context_aware_recommender.dcnv2 recbole.model.context_aware_recommender.deepfm recbole.model.context_aware_recommender.dssm + recbole.model.context_aware_recommender.eulernet recbole.model.context_aware_recommender.ffm + recbole.model.context_aware_recommender.fignn recbole.model.context_aware_recommender.fm recbole.model.context_aware_recommender.fnn recbole.model.context_aware_recommender.fwfm + recbole.model.context_aware_recommender.kd_dagfm recbole.model.context_aware_recommender.lr recbole.model.context_aware_recommender.nfm recbole.model.context_aware_recommender.pnn diff --git a/docs/source/recbole/recbole.model.general_recommender.diffrec.rst b/docs/source/recbole/recbole.model.general_recommender.diffrec.rst new file mode 100644 index 000000000..42616f5d7 --- /dev/null +++ b/docs/source/recbole/recbole.model.general_recommender.diffrec.rst @@ -0,0 +1,4 @@ +.. automodule:: recbole.model.general_recommender.diffrec + :members: + :undoc-members: + :show-inheritance: \ No newline at end of file diff --git a/docs/source/recbole/recbole.model.general_recommender.ldiffrec.rst b/docs/source/recbole/recbole.model.general_recommender.ldiffrec.rst new file mode 100644 index 000000000..84578d475 --- /dev/null +++ b/docs/source/recbole/recbole.model.general_recommender.ldiffrec.rst @@ -0,0 +1,4 @@ +.. automodule:: recbole.model.general_recommender.ldiffrec + :members: + :undoc-members: + :show-inheritance: \ No newline at end of file diff --git a/docs/source/recbole/recbole.model.general_recommender.random.rst b/docs/source/recbole/recbole.model.general_recommender.random.rst new file mode 100644 index 000000000..d53401448 --- /dev/null +++ b/docs/source/recbole/recbole.model.general_recommender.random.rst @@ -0,0 +1,4 @@ +.. automodule:: recbole.model.general_recommender.random + :members: + :undoc-members: + :show-inheritance: \ No newline at end of file diff --git a/docs/source/recbole/recbole.model.general_recommender.rst b/docs/source/recbole/recbole.model.general_recommender.rst index d9a3aa951..9436371ad 100644 --- a/docs/source/recbole/recbole.model.general_recommender.rst +++ b/docs/source/recbole/recbole.model.general_recommender.rst @@ -4,24 +4,35 @@ recbole.model.general\_recommender .. toctree:: :maxdepth: 4 + recbole.model.general_recommender.admmslim recbole.model.general_recommender.bpr recbole.model.general_recommender.cdae recbole.model.general_recommender.convncf recbole.model.general_recommender.dgcf recbole.model.general_recommender.dmf + recbole.model.general_recommender.diffrec + recbole.model.general_recommender.ease + recbole.model.general_recommender.enmf recbole.model.general_recommender.fism recbole.model.general_recommender.gcmc recbole.model.general_recommender.itemknn + recbole.model.general_recommender.ldiffrec recbole.model.general_recommender.lightgcn recbole.model.general_recommender.line recbole.model.general_recommender.macridvae recbole.model.general_recommender.multidae recbole.model.general_recommender.multivae recbole.model.general_recommender.nais + recbole.model.general_recommender.nceplrec + recbole.model.general_recommender.ncl recbole.model.general_recommender.neumf recbole.model.general_recommender.ngcf + recbole.model.general_recommender.nncf recbole.model.general_recommender.pop + recbole.model.general_recommender.ract + recbole.model.general_recommender.random + recbole.model.general_recommender.recvae recbole.model.general_recommender.sgl recbole.model.general_recommender.simplex + recbole.model.general_recommender.slimelastic recbole.model.general_recommender.spectralcf - recbole.model.general_recommender.ncl diff --git a/docs/source/recbole/recbole.model.knowledge_aware_recommender.rst b/docs/source/recbole/recbole.model.knowledge_aware_recommender.rst index fd025e998..a5dcb3da6 100644 --- a/docs/source/recbole/recbole.model.knowledge_aware_recommender.rst +++ b/docs/source/recbole/recbole.model.knowledge_aware_recommender.rst @@ -8,7 +8,9 @@ recbole.model.knowledge\_aware\_recommender recbole.model.knowledge_aware_recommender.cke recbole.model.knowledge_aware_recommender.kgat recbole.model.knowledge_aware_recommender.kgcn + recbole.model.knowledge_aware_recommender.kgin recbole.model.knowledge_aware_recommender.kgnnls recbole.model.knowledge_aware_recommender.ktup + recbole.model.knowledge_aware_recommender.mcclk recbole.model.knowledge_aware_recommender.mkr recbole.model.knowledge_aware_recommender.ripplenet diff --git a/docs/source/recbole/recbole.model.sequential_recommender.fearec.rst b/docs/source/recbole/recbole.model.sequential_recommender.fearec.rst new file mode 100644 index 000000000..05c55c3b8 --- /dev/null +++ b/docs/source/recbole/recbole.model.sequential_recommender.fearec.rst @@ -0,0 +1,4 @@ +.. automodule:: recbole.model.sequential_recommender.fearec + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/recbole/recbole.model.sequential_recommender.rst b/docs/source/recbole/recbole.model.sequential_recommender.rst index b144f4465..d328631a1 100644 --- a/docs/source/recbole/recbole.model.sequential_recommender.rst +++ b/docs/source/recbole/recbole.model.sequential_recommender.rst @@ -29,3 +29,4 @@ recbole.model.sequential\_recommender recbole.model.sequential_recommender.srgnn recbole.model.sequential_recommender.stamp recbole.model.sequential_recommender.transrec + recbole.model.sequential_recommender.fearec diff --git a/docs/source/user_guide/data_intro.rst b/docs/source/user_guide/data_intro.rst index e9517b3c8..45d4be4c0 100644 --- a/docs/source/user_guide/data_intro.rst +++ b/docs/source/user_guide/data_intro.rst @@ -1,7 +1,7 @@ Data Module Introduction ========================= -RecBole not only implements lots of popular recommender models, but also collects and releases 41 commonly-used publiced datasets. +RecBole not only implements lots of popular recommender models, but also collects and releases 43 commonly-used publiced datasets. You can freely download these datasets following our docs :doc:`data/dataset_download`. For extensibility and reusability, Recbole has a flexible and extensible data module. diff --git a/docs/source/user_guide/model/context/eulernet.rst b/docs/source/user_guide/model/context/eulernet.rst new file mode 100644 index 000000000..f02662916 --- /dev/null +++ b/docs/source/user_guide/model/context/eulernet.rst @@ -0,0 +1,78 @@ +EulerNet +=========== + +Introduction +--------------------- + +`[paper] `_ + +**Title:** EulerNet: Adaptive Feature Interaction Learning via Euler's Formula for CTR Prediction + +**Authors:** Zhen Tian, Ting Bai, Wayne Xin Zhao, Ji-Rong Wen, Zhao Cao + +**Abstract:** Learning effective high-order feature interactions is very crucial in the CTR prediction task. However, it is very time-consuming to calculate high-order feature interactions with massive features in online e-commerce platforms. Most existing methods manually design a maximal order and further filter out the useless interactions from them. Although they reduce the high computational costs caused by the exponential growth of high-order feature combinations, they still suffer from the degradation of model capability due to the suboptimal learning of the restricted feature orders. The solution to maintain the model capability and meanwhile keep it efficient is a technical challenge, which has not been adequately addressed. To address this issue, we propose an adaptive feature interaction learning model, named as EulerNet, in which the feature interactions are learned in a complex vector space by conducting space mapping according to Euler's formula. EulerNet converts the exponential powers of feature interactions into simple linear combinations of the modulus and phase of the complex features, making it possible to adaptively learn the high-order feature interactions in an efficient way. Furthermore, EulerNet incorporates the implicit and explicit feature interactions into a unified architecture, which achieves the mutual enhancement and largely boosts the model capabilities. Such a network can be fully learned from data, with no need of pre-designed form or order for feature interactions. Extensive experiments conducted on three public datasets have demonstrated the effectiveness and efficiency of our approach. + +.. image:: ../../../asset/eulernet.png + :width: 500 + :align: center + +Quick Start with RecBole +------------------------- + +**Model Hyper-Parameters:** + +- ``embedding_size (int)`` : The embedding size of features. Defaults to ``16``. +- ``order_list (list)`` : The order vectors of EulerNet.Defaults to ``[30]``. +- ``drop_ex (float)`` : The dropout rate for the modulus and phase. Defaults to ``0.3``. +- ``drop_im (float)`` : The dropout rate for the real and imaginary part. Defaults to ``0.3``. +- ``apply_norm (bool)`` : Whether perform the layer norm. Defaults to ``False``. +- ``reg_weight (float)`` : The L2 regularization weight. Defaults to ``1e-5``. + +**A Running Example:** + +Write the following code to a python file, such as `run.py` + +.. code:: python + + from recbole.quick_start import run_recbole + + run_recbole(model='EulerNet', dataset='ml-100k') + +And then: + +.. code:: bash + + python run.py + +Tuning Hyper Parameters +------------------------- + +If you want to use ``HyperTuning`` to tune hyper parameters of this model, you can copy the following settings and name it as ``hyper.test``. + +.. code:: bash + + learning_rate choice [1e-3,1e-4,1e-5] + reg_weight choice [1e-3,1e-5,1e-7] + order_list choice [7,10,20,30] + drop_ex choice [0.,0.1,0.2,0.3] + drop_im choice [0.,0.1,0.2,0.3] + apply_norm choice [True,False] + +Note that we just provide these hyper parameter ranges for reference only, and we can not guarantee that they are the optimal range of this model. + +Then, with the source code of RecBole (you can download it from GitHub), you can run the ``run_hyper.py`` to tuning: + +.. code:: bash + + python run_hyper.py --model=[model_name] --dataset=[dataset_name] --config_files=[config_files_path] --params_file=hyper.test + +For more details about Parameter Tuning, refer to :doc:`../../../user_guide/usage/parameter_tuning`. + + +If you want to change parameters, dataset or evaluation settings, take a look at + +- :doc:`../../../user_guide/config_settings` +- :doc:`../../../user_guide/data_intro` +- :doc:`../../../user_guide/train_eval_intro` +- :doc:`../../../user_guide/usage` + diff --git a/docs/source/user_guide/model/sequential/fearec.rst b/docs/source/user_guide/model/sequential/fearec.rst index 40219d2e4..61db9f0df 100644 --- a/docs/source/user_guide/model/sequential/fearec.rst +++ b/docs/source/user_guide/model/sequential/fearec.rst @@ -4,7 +4,7 @@ FEARec Introduction --------------------- -`[paper] `_ +`[paper] `_ **Title:** FEARec: Frequency Enhanced Hybrid Attention Network for Sequential Recommendation @@ -50,6 +50,10 @@ Write the following code to a python file, such as `run.py` from recbole.quick_start import run_recbole + parameter_dict = { + 'train_neg_sample_args': None, + } + run_recbole(model='FEARec', dataset='ml-100k') And then: diff --git a/docs/source/user_guide/model_intro.rst b/docs/source/user_guide/model_intro.rst index 54fb813b7..8b4c59d78 100644 --- a/docs/source/user_guide/model_intro.rst +++ b/docs/source/user_guide/model_intro.rst @@ -1,6 +1,6 @@ Model Introduction ===================== -We implement 90 recommendation models covering general recommendation, sequential recommendation, +We implement 91 recommendation models covering general recommendation, sequential recommendation, context-aware recommendation and knowledge-based recommendation. A brief introduction to these models are as follows: @@ -77,6 +77,7 @@ are also support for these models. And evaluation is always conducted in the way model/context/lightgbm model/context/kd_dagfm model/context/fignn + model/context/eulernet Sequential Recommendation @@ -114,6 +115,7 @@ the sequential data. The models of session-based recommendation are also include model/sequential/lightsans model/sequential/sine model/sequential/core + model/sequential/fearec Knowledge-based Recommendation diff --git a/recbole/model/general_recommender/__init__.py b/recbole/model/general_recommender/__init__.py index 04187e129..e71f2b4ec 100644 --- a/recbole/model/general_recommender/__init__.py +++ b/recbole/model/general_recommender/__init__.py @@ -13,7 +13,6 @@ from recbole.model.general_recommender.macridvae import MacridVAE from recbole.model.general_recommender.multidae import MultiDAE from recbole.model.general_recommender.multivae import MultiVAE -from recbole.model.general_recommender.enmf import ENMF from recbole.model.general_recommender.nais import NAIS from recbole.model.general_recommender.ncl import NCL from recbole.model.general_recommender.neumf import NeuMF diff --git a/recbole/model/sequential_recommender/fearec.py b/recbole/model/sequential_recommender/fearec.py index 5f2854117..f16385962 100644 --- a/recbole/model/sequential_recommender/fearec.py +++ b/recbole/model/sequential_recommender/fearec.py @@ -101,12 +101,10 @@ def __init__(self, config, dataset): def get_same_item_index(self, dataset): same_target_index = {} target_item = dataset.inter_feat[self.ITEM_ID].numpy() - count = 0 for index, item_id in enumerate(target_item): all_index_same_id = np.where(target_item == item_id)[0] same_target_index[item_id] = all_index_same_id - count += 1 return same_target_index