{"id":17216914,"url":"https://github.com/lenguyenthedat/raptor","last_synced_at":"2025-10-18T19:52:49.465Z","repository":{"id":9751550,"uuid":"11716173","full_name":"lenguyenthedat/raptor","owner":"lenguyenthedat","description":"A lightweight product recommendation system (Item Based Collaborative Filtering) developed in Haskell.","archived":false,"fork":false,"pushed_at":"2017-02-15T08:00:04.000Z","size":607,"stargazers_count":33,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-27T13:39:57.544Z","etag":null,"topics":["collaborative-filtering","ecommerce","functional-programming","haskell","jaccard-distance","recommendation-engine","recommendation-system","zalora"],"latest_commit_sha":null,"homepage":"","language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lenguyenthedat.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2013-07-28T06:25:35.000Z","updated_at":"2024-06-25T13:51:17.000Z","dependencies_parsed_at":"2022-09-04T23:00:32.009Z","dependency_job_id":null,"html_url":"https://github.com/lenguyenthedat/raptor","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lenguyenthedat%2Fraptor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lenguyenthedat%2Fraptor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lenguyenthedat%2Fraptor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lenguyenthedat%2Fraptor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lenguyenthedat","download_url":"https://codeload.github.com/lenguyenthedat/raptor/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248795179,"owners_count":21162725,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["collaborative-filtering","ecommerce","functional-programming","haskell","jaccard-distance","recommendation-engine","recommendation-system","zalora"],"created_at":"2024-10-15T03:42:42.394Z","updated_at":"2025-10-18T19:52:44.431Z","avatar_url":"https://github.com/lenguyenthedat.png","language":"Haskell","funding_links":[],"categories":[],"sub_categories":[],"readme":"Raptor\n======\n\n\u003ca href=\"https://raw.githubusercontent.com/lenguyenthedat/raptor/master/assets/raptor.png\"\u003e\u003cimg src=\"./assets/raptor.png\" align=\"right\" height=\"169\" width=\"220\" \u003e\u003c/a\u003e\n\nAn Online Retail Recommendation Engine developed in Haskell.\n\nRaptor learns from customer behaviors when they do online shopping: \n- View an item.\n- Add an item into cart. \n- Purchase an item.\n\nCurrently there are 3 different algorithms - specified in raptor.hs:\n- Original Jaccard Distance, based heavily on information about items that has been purchased / added to cart together.\n- Bayes Jaccard Distance, a modified version of Jaccard Distance, but still very similar.\n- VTD, a slightly different approach. The idea of this approach is to look closer as customer Views data. \nBasically tries to answer the question: if a customer view this item, what are the most likely items that the customer is going to buy.\n\nBase on the nature of each algorithms, Original and Bayes Jaccard are more applicable for a cart-page recommendations (i.e\n\"customers who bought these items also bought\"), while VTD is more applicable for the product-page recommendations (i.e \"products related or similar to this item\").\n\n[Wilson Score](http://www.evanmiller.org/how-not-to-sort-by-average-rating.html) (of 95% confidence) is used to take care of significance in the approaches.\n\nRaptor In Action\n----------------\n\nThe below real-world results were achieved by using a combination of Raptor as a core Collaborative Filtering engine together with a numerous of domain specific knowledge engines and tweaks:\n\n\u003ca href=\"https://raw.githubusercontent.com/lenguyenthedat/raptor/master/assets/raptor-in-action.png\"\u003e\u003cimg src=\"./assets/raptor-in-action.png\"\u003e\u003c/a\u003e\n\n\nSample Input\n------------\n\n    $ cat test/Data/VTD_view_sg.csv \n    sku0\tcust1 cust2 cust3 cust4\n    sku1\tcust1 cust2 cust3 cust4 cust5\n    sku2\tcust2 cust4 cust5\n    sku3\tcust1 cust2\n    sku4\tcust4 cust5 cust1 cust3\n    sku5\tcust1 cust2 cust3\n    sku6\tcust5 cust3\n    sku7\tcust4 cust5\n    sku8\tcust1 cust4\n    sku9\tcust2 cust4\n\n    $ cat test/Data/VTD_cart_sg.csv \n    sku0\tcust1 cust2\n    sku1\tcust1 cust2 cust3\n    sku2\tcust2 cust4\n    sku3\tcust1 cust2\n    sku4\tcust4 cust5 cust1 cust3\n    sku5\tcust1\n    sku6\tcust5 cust3\n    sku7\tcust4\n    sku8\tcust1 cust4\n    sku9\tcust2\n\n    $ cat test/Data/VTD_purchased_sg.csv \n    sku0\tcust1 cust2\n    sku1\tcust1 cust2 cust3\n    sku2\tcust2\n    sku3\tcust1 cust2\n    sku4\tcust4 cust5 cust3\n    sku5\tcust1\n    sku6\tcust5 cust3\n    sku7\tcust4\n    sku8\tcust1 cust4\n    sku9\tcust2\n\n    $ cat test/Data/sku_male_sg.csv \n    sku5\n    sku6\n    sku7\n    sku8\n    sku9\n\n    $ cat test/Data/sku_female_sg.csv \n    sku0\n    sku1\n    sku2\n    sku3\n    sku4\n\n    $ cat test/Data/instock_skus_sg.csv \n    sku0\n    sku1\n    sku2\n    sku3\n    sku4\n    sku5\n    sku6\n    sku7\n    sku8\n\n    $ cat test/Data/valid_skus_sg.csv \n    sku1\n    sku2\n    sku3\n    sku4\n    sku5\n    sku6\n    sku7\n    sku8\n\nClone and build:\n----------------\n\nClone the repo:\n\n\t$ https://github.com/lenguyenthedat/raptor.git\n\nBuild with Docker\n\n\t$ cd raptor/\n\t$ sudo docker build --rm=true -t raptor .\n\nBuild with cabal sandbox:\n\n    $ cabal install\n    Resolving dependencies...\n    Notice: installing into a sandbox located at\n    /Users/datle/GitHub/cabinet/raptor/.cabal-sandbox\n    Configuring split-0.2.2...\n    Downloading strict-0.3.2...\n    Configuring text-1.2.0.0...\n    Configuring strict-0.3.2...\n    Building text-1.2.0.0...\n    Building split-0.2.2...\n    Building strict-0.3.2...\n    Installed split-0.2.2\n    Installed strict-0.3.2\n    Downloading nlp-scores-0.6.2...\n    Configuring nlp-scores-0.6.2...\n    Building nlp-scores-0.6.2...\n    Installed nlp-scores-0.6.2\n    Installed text-1.2.0.0\n    Configuring hashable-1.2.2.0...\n    Building hashable-1.2.2.0...\n    Installed hashable-1.2.2.0\n    Configuring unordered-containers-0.2.5.1...\n    Building unordered-containers-0.2.5.1...\n    Installed unordered-containers-0.2.5.1\n    Configuring raptor-0.1.0.0...\n    Building raptor-0.1.0.0...\n    Installed raptor-0.1.0.0\n\nBuild with cabal-dev:\n\n    $ cabal-dev install\n    Resolving dependencies...\n    Configuring raptor-0.1.0.0...\n    Building raptor-0.1.0.0...\n    Preprocessing executable 'raptor' for raptor-0.1.0.0...\n    Warning: No documentation was generated as this package does not contain a\n    library. Perhaps you want to use the --executables flag.\n    Installing executable(s) in /Users/datle/GitHub/cabinet/Raptor/cabal-dev//bin\n    Installed raptor-0.1.0.0\n    Warning: could not create symlinks in /Users/datle/Library/Haskell/bin for\n    raptor because the files exist there already and are\n    not managed by cabal. You can create symlinks for these executables manually\n    if you wish. The executable files have been installed at\n    /Users/xxx/GitHub/cabinet/Raptor/cabal-dev/bin/raptor\n\nBuild with ghc:\n\n    $ ghc raptor.hs\n    [1 of 1] Compiling Main             ( raptor.hs, raptor.o )\n    Linking raptor ...\n\nSample output:\n--------------\n\nRun with docker: use `docker run raptor` as a prefix for every command, for example:\n\n\t$ docker run raptor .cabal-sandbox/bin/raptor sg 3 original test/\n\noriginal\n\n    $ .cabal-sandbox/bin/raptor sg 3 original test/\n    \n    $ cat test/Result/original/Raptor_sg.csv \n    sg\tsku5\t7.38-sku8\n    sg\tsku6\t\n    sg\tsku7\t7.38-sku8\n    sg\tsku8\t7.38-sku5\t7.38-sku7\n    sg\tsku9\t\n    sg\tsku0\t18.00-sku3\t14.11-sku1\t7.06-sku2\n    sg\tsku1\t14.11-sku3\t5.28-sku2\t4.65-sku4\n    sg\tsku2\t7.06-sku3\t5.28-sku1\t0.60-sku4\n    sg\tsku3\t14.11-sku1\t7.06-sku2\t0.60-sku4\n    sg\tsku4\t4.65-sku1\t0.60-sku2\t0.60-sku3\n\nbayes\n\n    $ .cabal-sandbox/bin/raptor sg 3 bayes test/\n    \n    $ cat test/Result/bayes/Raptor_sg.csv \n    sg\tsku5\t6.15-sku8\n    sg\tsku6\t\n    sg\tsku7\t6.15-sku8\n    sg\tsku8\t6.15-sku5\t6.15-sku7\n    sg\tsku9\t\n    sg\tsku0\t9.68-sku3\t8.22-sku1\t6.15-sku2\n    sg\tsku1\t9.68-sku3\t6.15-sku2\t3.01-sku4\n    sg\tsku2\t6.15-sku1\t6.15-sku3\n    sg\tsku3\t9.68-sku1\t6.15-sku2\n    sg\tsku4\t3.01-sku1\n\nvtd\n\n    $ .cabal-sandbox/bin/raptor sg 3 vtd test/\n    \n    $ cat test/Result/vtd/Raptor_sg.csv \n    sg\tsku5\t9.45-sku6\t9.45-sku8\n    sg\tsku6\t\n    sg\tsku7\t9.45-sku6\t9.45-sku8\n    sg\tsku8\t9.45-sku5\t9.45-sku7\n    sg\tsku9\t9.45-sku7\t9.45-sku8\n    sg\tsku0\t15.82-sku1\t15.00-sku3\t11.76-sku4\n    sg\tsku1\t15.82-sku4\t15.00-sku3\t4.56-sku2\n    sg\tsku2\t15.00-sku4\t9.45-sku3\t4.56-sku1\n    sg\tsku3\t15.00-sku1\t9.45-sku2\n    sg\tsku4\t9.68-sku1\t9.45-sku3\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flenguyenthedat%2Fraptor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flenguyenthedat%2Fraptor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flenguyenthedat%2Fraptor/lists"}