hans-thomas / lilac
it is a recommender system based-on pairwise association rules.
Requires
- php: ^8.1
Requires (Dev)
- nunomaduro/collision: ^7.0
- orchestra/testbench: ^8.0
This package is auto-updated.
Last update: 2024-12-31 00:19:55 UTC
README
It's a recommender system using pairwise association rules (PAR) based-on this paper. There is an enhanced PAR (EPAR) algorithm which reduces the producing recommendation time. this recommender system is able to create train model and generate recommends for one or more than one model.
Installation
Via composer
composer require hans-thomas/lilac
Then
php artisan vendor:publish --tag lilac-config
Usage
Let's assume there are two Post
and Category
models which they have a many-to-many
relationship.
Config
In config file, we should define our relationship first. there is a template definition of a relation that you can edit that.
// config/lilac.php return [ // ... 'relations' => [ Post::class => [ 'wrappedByModel' => Category::class, 'wrappedByModelRelationToEntity' => 'posts', 'entityModelRelationToWrappedBy' => 'categories', ] ] ];
Available methods
recommends
To generate some recommendation, use recommends
method.
use Hans\Lilac\Facades\Lilac; Lilac::recommends( $ids );
It will return a collection of models that sorted by the score they've got.
updateTrainModel
Lilac
provides a caching system to store the created data and prevents to create duplicate train model. when you
create some recommendation for a model(s), the related train model will be cached for future use. meanwhile, you make
some changes in the relationship between you models. in this scenario, if you try to create some recommendation for you
model, you will receive out-dated recommends. to fix this, you can run updateTrainModel
for updated related model(s).
use Hans\Lilac\Facades\Lilac; Lilac::updateTrainModel( $ids );
This will update and cache the related train model.
fresh
Sometimes you need to ignore cached train models and make recommendation using the latest data from database. for this,
you can use fresh
method before recommends
method.
use Hans\Lilac\Facades\Lilac; Lilac::fresh()->recommends( $ids );
cache
You may want to create recommendation for two models in one scope. first one using fresh data and second one using
cached data. in this situation, you should use cache
in you second call.
use Hans\Lilac\Facades\Lilac; Lilac::fresh()->recommends( $ids ); Lilac::cache()->recommends( $other_ids );
trainer
To set your trainer, you can pass the instance to the trainer
method.
use Hans\Lilac\Facades\Lilac; use Hans\Lilac\Trainers\EPAR; use Hans\Lilac\Trainers\PAR; Lilac::trainer( new EPAR( $ids ) )->recommends( $ids ); // or Lilac::trainer( new PAR )->recommends( $ids );
You can set your default trainer in config file.
limit
You can set a limit to returned recommendation count.
use Hans\Lilac\Facades\Lilac; Lilac::limit( 10 )->recommends( $ids );
Jobs
To automatically keep train models up-to-date, there are two jobs than you can use. You can fire these jobs whenever you update the relationship or just setting hooks for you relationships using this package.
UpdateEntityTrainModel
To update the train model of a single model, you can fire UpdateEntityTrainModel
and pass the related model.
UpdateWrapperTrainModel
To update the train model of a bunch of related models, you should pass them as a collection
to UpdateWrapperTrainModel
job.