-
Notifications
You must be signed in to change notification settings - Fork 6
/
user_recommend.go
93 lines (75 loc) · 3.31 KB
/
user_recommend.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package pipeline
import (
"fmt"
"time"
"github.com/alibaba/pairec/v2/context"
"github.com/alibaba/pairec/v2/filter"
"github.com/alibaba/pairec/v2/log"
"github.com/alibaba/pairec/v2/module"
"github.com/alibaba/pairec/v2/recconf"
"github.com/alibaba/pairec/v2/service/debug"
"github.com/alibaba/pairec/v2/sort"
"github.com/alibaba/pairec/v2/utils"
)
type UserRecommendService struct {
pipelineName string
recallService *RecallService
filterService *FilterService
generalRankService *GeneralRankService
featureService *FeatureService
rankService *RankService
coldStartRankService *ColdStartRankService
sortService *SortService
}
func NewUserRecommendService(config *recconf.PipelineConfig) *UserRecommendService {
service := UserRecommendService{
pipelineName: config.Name,
recallService: NewRecallService(config),
filterService: NewFilterService(config),
featureService: NewFeatureService(config),
generalRankService: NewGeneralRankService(config),
rankService: NewRankService(config),
coldStartRankService: NewColdStartRankService(config),
sortService: NewSortService(config),
}
return &service
}
func (r *UserRecommendService) Recommend(user *module.User, context *context.RecommendContext, debugService *debug.DebugService) []*module.Item {
start := time.Now()
var items []*module.Item
items = r.recallService.GetItems(user, context)
if len(items) == 0 {
log.Info(fmt.Sprintf("requestId=%s\tmodule=pipeline\tpipeline=%s\tcount=0", context.RecommendId, r.pipelineName))
return items
}
debugService.WriteRecallLog(user, items, context)
// filter
items = r.Filter(user, items, context)
debugService.WriteFilterLog(user, items, context)
// general rank
items = r.generalRankService.Rank(user, items, context)
debugService.WriteGeneralLog(user, items, context)
// load user or item features
// can load data from datasource(holo, ots, redis)
// after load data, use feature engine to create or modify features
items = r.featureService.LoadFeatures(user, items, context)
r.rankService.Rank(user, items, context)
r.coldStartRankService.Rank(user, items, context)
items = r.Sort(user, items, context)
log.Info(fmt.Sprintf("requestId=%s\tmodule=pipeline\tpipeline=%s\tcount=%d\tcost=%d", context.RecommendId, r.pipelineName, len(items), utils.CostTime(start)))
return items
}
func (s *UserRecommendService) Filter(user *module.User, items []*module.Item, context *context.RecommendContext) []*module.Item {
start := time.Now()
filterData := filter.FilterData{Data: items, Uid: user.Id, Context: context, PipelineName: s.pipelineName, User: user}
s.filterService.Filter(&filterData)
log.Info(fmt.Sprintf("requestId=%s\tmodule=Filter\tpipeline=%s\tcost=%d", context.RecommendId, s.pipelineName, utils.CostTime(start)))
return filterData.Data.([]*module.Item)
}
func (s *UserRecommendService) Sort(user *module.User, items []*module.Item, context *context.RecommendContext) []*module.Item {
start := time.Now()
sortData := sort.SortData{Data: items, Context: context, User: user, PipelineName: s.pipelineName}
s.sortService.Sort(&sortData)
log.Info(fmt.Sprintf("requestId=%s\tmodule=Sort\tpipeline=%s\tcost=%d", context.RecommendId, s.pipelineName, utils.CostTime(start)))
return sortData.Data.([]*module.Item)
}