Apache Mahout的DataModel定制实现

时间:2018-12-03 07:53:06

标签: mahout

我有一个名为DataModel的{​​{1}}的自定义实现

ListDataModel

package com.recommender.models;


import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

import org.apache.mahout.cf.taste.common.Refreshable;
import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.impl.common.FastIDSet;
import org.apache.mahout.cf.taste.impl.common.LongPrimitiveArrayIterator;
import org.apache.mahout.cf.taste.impl.common.LongPrimitiveIterator;
import org.apache.mahout.cf.taste.impl.model.GenericItemPreferenceArray;
import org.apache.mahout.cf.taste.impl.model.GenericUserPreferenceArray;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.model.PreferenceArray;

import com.recommender.util.utils;

public class ListDataModel<T> implements DataModel {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private List<T> __lst = new ArrayList<T>();
    private String __userColumnName;
    private String __itemColumnName;
    private String __referenceColumnName;

    public ListDataModel(List<T> list, String userColumnName, String itemColumnName,String refColumnName) {
        __lst = list;
        __userColumnName = userColumnName;
        __itemColumnName = itemColumnName;
        __referenceColumnName = refColumnName;
    }

    @SuppressWarnings("unchecked")
    @Override
    public void refresh(Collection<Refreshable> arg0) {
        __lst =  arg0.stream().map(m->(T)m).collect(Collectors.toList());
    }

    @Override
    public LongPrimitiveIterator getItemIDs() throws TasteException {
        List<Long> list = __lst.stream().map((r) -> utils.GetLong(r, __itemColumnName)).distinct().collect(Collectors.toList());
        return new LongPrimitiveArrayIterator(utils.tolongArray(list));
    }

    @Override
    public FastIDSet getItemIDsFromUser(long arg0) throws TasteException {
        List<Long> list = __lst.stream().filter(fil->utils.GetLong(fil, __userColumnName)==arg0).map((r) -> utils.GetLong(r, __itemColumnName)).distinct().collect(Collectors.toList());
        return new FastIDSet(utils.tolongArray(list));
    }

    @Override
    public float getMaxPreference() {
    //  return utils.GetFloat(__lst.stream().max(new ListComprator<>(__referenceColumnName)).get(),__referenceColumnName);
        return Float.NaN;
    }

    @Override
    public float getMinPreference() {
//      return utils.GetFloat(__lst.stream().min(new ListComprator<>(__referenceColumnName)).get(),__referenceColumnName);
        return Float.NaN;
    }

    @Override
    public int getNumItems() throws TasteException {
        Set<Long> set = new HashSet<>(__lst.size());
        return __lst.stream().filter(p -> set.add(utils.GetLong(p, __itemColumnName))).distinct().collect(Collectors.toList()).size();
    }

    @Override
    public int getNumUsers() throws TasteException {
        return __lst.stream().map(p -> utils.GetLong(p, __userColumnName)).distinct().collect(Collectors.toList()).size();
    }

    @Override
    public int getNumUsersWithPreferenceFor(long arg0) throws TasteException {
        return (int) __lst.stream().filter(fil->utils.GetLong(fil, __itemColumnName)==arg0).count();
    }

    @Override
    public int getNumUsersWithPreferenceFor(long arg0, long arg1) throws TasteException {
        return (int) __lst.stream().filter(fil->utils.GetLong(fil, __itemColumnName)==arg0 && utils.GetLong(fil, __itemColumnName)==arg0 ).count();
    }

    @Override
    public Long getPreferenceTime(long arg0, long arg1) throws TasteException {
        return 0L;
    }

    @Override
    public Float getPreferenceValue(long arg0, long arg1) throws TasteException {
        List<T> list = __lst.stream().filter(fil->utils.GetLong(fil, __userColumnName)==arg0 && utils.GetLong(fil, __itemColumnName)==arg1 ).collect(Collectors.toList());
        if(list.size()==0) return Float.NaN;
        return utils.GetFloat(list.get(0),__referenceColumnName);
    }

    @Override
    public PreferenceArray getPreferencesForItem(long arg0) throws TasteException {
        return new GenericItemPreferenceArray(__lst.stream()
                                                                  .filter(fil->utils.GetLong(fil, __itemColumnName)==arg0)
                                                                  .map(m->new Preference<T>(m, __userColumnName, __itemColumnName, __referenceColumnName))
                                                                  .collect(Collectors.toList()));
    }

    @Override
    public PreferenceArray getPreferencesFromUser(long arg0) throws TasteException {
        return  new GenericUserPreferenceArray(__lst.stream()
                  .filter(fil->utils.GetLong(fil, __userColumnName)==arg0)
                  .map(m->new Preference<T>(m, __userColumnName, __itemColumnName, __referenceColumnName))
                  .collect(Collectors.toList()));
    }

    @Override
    public LongPrimitiveIterator getUserIDs() throws TasteException {
        List<Long> list = __lst.stream().map((r) -> utils.GetLong(r, __userColumnName)).distinct().collect(Collectors.toList());
        return new LongPrimitiveArrayIterator(utils.tolongArray(list));
    }

    @Override
    public boolean hasPreferenceValues() {
        return true;
    }

    @Override
    public void removePreference(long arg0, long arg1) throws TasteException {
        __lst =__lst.stream().filter(fil->utils.GetLong(fil, __userColumnName)!=arg0 && utils.GetLong(fil, __itemColumnName)!=arg0).collect(Collectors.toList());
    }

    @Override
    public void setPreference(long arg0, long arg1, float arg2) throws TasteException {
        List<T> list = __lst.stream().filter(fil->utils.GetLong(fil, __userColumnName)==arg0 && utils.GetLong(fil, __itemColumnName)==arg0).collect(Collectors.toList());
        if(list.size()==0) return;
        utils.SetFloatValue(__lst.get(__lst.indexOf(list.get(0))),__referenceColumnName,arg2);
    }

}

一切都很好,但是当我想使用此package com.recommender.util; import java.lang.reflect.Field; import java.util.List; public class utils { public static long[] tolongArray(List<Long> list) { long[] items = new long[list.size()]; for (int i = 0; i < list.size(); i++) { items[i]=list.get(i); } return items; } public static Long GetLong(Object obj,String name) { String str = ""; try { return Long.parseLong(getFiled(obj, name).get(obj).toString()); } catch (IllegalArgumentException | IllegalAccessException | SecurityException e) { System.out.println(str); System.out.println("Some error in getting Long from Field(com.recommender.util.GetLong)"); e.printStackTrace(); } return 0L; } public static String GetString(Object obj,String name) { try { return getFiled(obj, name).get(obj).toString(); } catch (IllegalArgumentException | IllegalAccessException | SecurityException e) { System.out.println("Some error in getting String from Field(com.recommender.util.GetString)"); e.printStackTrace(); } return ""; } public static Float GetFloat(Object obj,String name) { try { return Float.parseFloat(getFiled(obj, name).get(obj).toString()); } catch (IllegalArgumentException | IllegalAccessException | SecurityException e) { System.out.println("Some error in getting String from Field(com.recommender.util.GetString)"); e.printStackTrace(); } return 0F; } public static void SetFloatValue(Object obj,String name,Float value) { try { getFiled(obj, name).setFloat(obj, value); } catch (IllegalArgumentException | IllegalAccessException e) { System.out.println("Some error in getting String from Field(com.recommender.util.SetFloatValue)"); e.printStackTrace(); } } public static void SetLongValue(Object obj,String name,Long value) { try { getFiled(obj, name).setLong(obj, value); } catch (IllegalArgumentException | IllegalAccessException e) { System.out.println("Some error in getting String from Field(com.recommender.util.SetLongValue)"); e.printStackTrace(); } } private static Field getFiled(Object obj,String name) { try { return obj.getClass().getField(name); } catch (NoSuchFieldException | SecurityException e) { System.out.println("Some error in getting Filed(com.recommender.util.getFiled)"); e.printStackTrace(); } return null; } } 来获取DataModel时,什么也没有返回,并且应用程序永不停止

neighborhoods

package com.recommender.models;

public class Ratings {
    public Long UserId;
    public Long ISBN;
    public Long Rate;
    public Ratings(Long ui,Long isbn,Long rate) {
        UserId = ui;
        ISBN = isbn;
        Rate = rate;
    }
    public String toString() {
        return UserId.toString()+","+ISBN.toString()+","+Rate.toString();
    }
}

0 个答案:

没有答案