(
self,
userid,
user_items,
N=10,
filter_already_liked_items=True,
filter_items=None,
recalculate_user=False,
items=None,
)
| 154 | return ids, scores |
| 155 | |
| 156 | def recommend( |
| 157 | self, |
| 158 | userid, |
| 159 | user_items, |
| 160 | N=10, |
| 161 | filter_already_liked_items=True, |
| 162 | filter_items=None, |
| 163 | recalculate_user=False, |
| 164 | items=None, |
| 165 | ): |
| 166 | if (filter_already_liked_items or recalculate_user) and not isinstance( |
| 167 | user_items, csr_matrix |
| 168 | ): |
| 169 | raise ValueError("user_items needs to be a CSR sparse matrix") |
| 170 | |
| 171 | if items is not None and self.approximate_recommend: |
| 172 | raise NotImplementedError("using a 'items' list with ANN search isn't supported") |
| 173 | |
| 174 | if not self.approximate_recommend: |
| 175 | return self.model.recommend( |
| 176 | userid, |
| 177 | user_items, |
| 178 | N=N, |
| 179 | filter_already_liked_items=filter_already_liked_items, |
| 180 | filter_items=filter_items, |
| 181 | recalculate_user=recalculate_user, |
| 182 | items=items, |
| 183 | ) |
| 184 | |
| 185 | # batch computation is hard here, fallback to looping over items |
| 186 | if not np.isscalar(userid): |
| 187 | return _batch_call( |
| 188 | self.recommend, |
| 189 | userid, |
| 190 | user_items=user_items, |
| 191 | N=N, |
| 192 | filter_already_liked_items=filter_already_liked_items, |
| 193 | filter_items=filter_items, |
| 194 | recalculate_user=recalculate_user, |
| 195 | items=items, |
| 196 | ) |
| 197 | |
| 198 | # support recalculate_user if possible (TODO: come back to this since its a bit of a hack) |
| 199 | if hasattr(self.model, "+_user_factor"): |
| 200 | user = self.model._user_factor(userid, user_items, recalculate_user) # pylint: disable=protected-access |
| 201 | elif recalculate_user: |
| 202 | raise NotImplementedError(f"recalculate_user isn't supported with {self.model}") |
| 203 | else: |
| 204 | user = self.model.user_factors[userid] |
| 205 | if implicit.gpu.HAS_CUDA and isinstance(user, implicit.gpu.Matrix): |
| 206 | user = user.to_numpy() |
| 207 | |
| 208 | # calculate the top N items, removing the users own liked items from |
| 209 | # the results |
| 210 | count = N |
| 211 | if filter_items: |
| 212 | count += len(filter_items) |
| 213 | filter_items = np.array(filter_items) |
nothing calls this directly
no test coverage detected