mahout做推荐的输入只能是long类型,但在某些网站中,存储的数据不是long类型,是string类型。
现在的手机APP,每个手机都有其device_id,也是string类型。如果能以string类型作为uid,即使用户不注册,不登录。只要采用device_id作为其uid,也可以做精准推荐。
mahout提供了一个接口,能把string转为唯一的long类型数据,然后以map方式存储起来,计算完成后再把long转为string类型。
package test;
import org.apache.mahout.cf.taste.impl.model.MemoryIDMigrator;
public class TestMT {
public static void main(String[] args) {
// TODO Auto-generated method stub
String test = "d140615p10693zc";
MemoryIDMigrator thing2long = new MemoryIDMigrator();
Long testLong = thing2long.toLongID(test);
System.out.println(testLong);
thing2long.storeMapping(testLong, test);
String a =thing2long.toStringID(testLong);
System.out.println(a);
}
}
MemoryIDMigrator 源码
package org.apache.mahout.cf.taste.impl.model;
import java.util.Iterator;
import org.apache.mahout.cf.taste.impl.common.FastByIDMap;
import org.apache.mahout.cf.taste.impl.model.AbstractIDMigrator;
import org.apache.mahout.cf.taste.model.UpdatableIDMigrator;
public final class MemoryIDMigrator extends AbstractIDMigrator implements UpdatableIDMigrator {
private final FastByIDMap<String> longToString = new FastByIDMap(100);
public MemoryIDMigrator() {
}
public void storeMapping(long longID, String stringID) {
FastByIDMap var4 = this.longToString;
synchronized(this.longToString) {
this.longToString.put(longID, stringID);
}
}
public String toStringID(long longID) {
FastByIDMap var3 = this.longToString;
synchronized(this.longToString) {
return (String)this.longToString.get(longID);
}
}
public void initialize(Iterable<String> stringIDs) {
Iterator i$ = stringIDs.iterator();
while(i$.hasNext()) {
String stringID = (String)i$.next();
this.storeMapping(this.toLongID(stringID), stringID);
}
}
}
下面是Facebook给出的Mahout协同过滤的测试代码
package com.xie;
/**
* Created by liulu3 on 2017/1/18.
*/
import java.util.ArrayList;
import java.util.List;
import org.apache.mahout.cf.taste