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.
Via composer
composer require hans-thomas/lilac
Then
php artisan vendor:publish --tag lilac-config
Let's assume there are two Post
and Category
models which they have a many-to-many
relationship.
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',
]
]
];
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.
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.
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 );
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 );
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.
You can set a limit to returned recommendation count.
use Hans\Lilac\Facades\Lilac;
Lilac::limit( 10 )->recommends( $ids );
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.
To update the train model of a single model, you can fire UpdateEntityTrainModel
and pass the related model.
To update the train model of a bunch of related models, you should pass them as a collection
to UpdateWrapperTrainModel
job.