Thanks. I'll try to make use of Rescorer. Now it's a matter of finding a good example...
On Mon, Oct 17, 2011 at 8:26 AM, Sean Owen <[email protected]> wrote: > Yes, remove the bad items and prefs from your backing store. That gets > updated then next time you refresh(). Eventually, you want those gone, > it seems, since they're not useful information. > > Among other things, the Rescorer is there to filter out items that are > useful for the internal CF algorithm, but not a valid recommendation > (e.g. out-of-stock items). But it could be slightly abused to filter > out bad data on the fly, on the front end. > > You don't need to or want to attach additional info to those user-item > associations. Presumably the bad-ness is a property of the item. So > you just need a Rescorer that knows a list of bad item IDs, and > filters them. > > On Mon, Oct 17, 2011 at 1:47 PM, Octavian Covalschi > <[email protected]> wrote: > > I understand. Even though I don't have feed files, we're using MongoDB as > > the main data source, I can update database for the "old" or "out of > stock" > > items... > > > > So even in the case of ghost items or those I want to exclude and use > > Rescorer, I still need to update the in memory model, right? As far I > > understand it's not enough to update the feed, unless It's being > > refreshed... Is there a way to store additional optional data along with > > userId <-> itemId? The only solution I see now is to extend > > GenericPreference and add additional properties like isOld, price (for > other > > purposes), is this a correct approach? > > > > PS: Thanks guys for your time! > > > > On Mon, Oct 17, 2011 at 2:35 AM, Sean Owen <[email protected]> wrote: > > > >> In general this DataModel is not modifiable, which is why you're > >> having to hack at it. The idea is to update the underlying data, > >> ideally -- for example, the file containing the data, perhaps by using > >> update (delta) files. > >> > >> Your approach works though. There is not a better way to do it, if > >> this is what you're doing. > >> > >> As Ted mentioned, keep data on items that are real and valid, just out > >> of stock or old or something. You can filter them using a Rescorer so > >> that they don't end up in the output. > >> > >> You can do the same thing for ghost data, if you like. That at least > >> means you have an immediate way of filtering and can wait for a data > >> reload or update rather than do it every time on the fly. > >> > >> On Mon, Oct 17, 2011 at 2:58 AM, Octavian Covalschi > >> <[email protected]> wrote: > >> > Hi there. > >> > > >> > We have the taste war running and we are trying to accomplish a > realtime > >> > functionality by removing/adding user items on the fly. So far adding > and > >> > removing items for particular users has been working fine for us and > >> > recommendations are being changed on the fly.. though it's still in > >> beta... > >> > The last piece is to remove an item from ALL users, it's necessary > when > >> the > >> > item is removed from the system... So far I've got this: > >> > > >> > public void removeItemFromAllUsers(long itemId) throws > >> NoSuchItemException { > >> > PreferenceArray prefArray = ((GenericDataModel) > >> > delegate).getPreferencesForItem(itemId); > >> > > >> > if (prefArray.length() > 0) { > >> > FastByIDMap<PreferenceArray> rawData = ((GenericDataModel) > >> > delegate).getRawUserData(); > >> > > >> > for (Preference pr : prefArray) { > >> > PreferenceArray prefs = rawData.get(pr.getUserID()); > >> > > >> > rawData.remove(pr.getUserID()); > >> > > >> > if (prefs.length() > 1) { > >> > PreferenceArray newPrefs = new > >> > GenericUserPreferenceArray(length - 1); > >> > for (int i = 0, j = 0; i < length; i++, j++) { > >> > if (prefs.getItemID(i) == itemId) { > >> > j--; > >> > } else { > >> > newPrefs.set(j, prefs.get(i)); > >> > } > >> > } > >> > rawData.put(pr.getUserID(), newPrefs); > >> > } > >> > } > >> > delegate = new GenericDataModel(rawData); > >> > } > >> > } > >> > > >> > I'm still pretty new with mahout and was wondering if there is a > better > >> way, > >> > in particular make use of getRawUserData(), which I tried but it > didn't > >> > help... > >> > > >> > Thank you in advance. > >> > > >> > > >
