视频发在了youku上, 地址: http://v.youku.com/v_show/id_XMjM3NDAyMTg4.html
2011年1月16日星期日
2011年1月6日星期四
使用 Apache Mahout 和 Google Reader Share 搭建社会化阅读推荐引擎
一. Google Reader分享数据的抓取
主要参考以下文章:
Google Reader的数据收集
google提供的几种读取feed的API
值得注意的地方是在请求中可以添加以下参数:
1. 返回数量
2. 返回格式(json/xml)
用Python写了一个爬虫, 单线程抓取, 用的默认参数(n=20, xml). 目前已经爬了将近48小时, 共抓取了30000+个中文用户, 此外有20000+个不活跃用户或非中文用户.
判断中文用户的所使用的方法是: 在返回的结果中查找"的"字, 这种方法同时适用于简体中文和繁体中文. 目前看来效果良好.
抓回来的数据目前是保存为本地xml文件.
二. 数据解析
扫描所有xml文件, 产生打分数据.
打分数据格式为:
userID,itemID
表示用户(userID)喜欢/分享了文章(itemID).
第三项"分值"(preference)可以省略.
因为这里的打分的分值是bool值, 不是1就是0.
三. 搭建社会化阅读推荐引擎
1. 首先需要编译Mahout, 主要参考:
Recommender Documentation
基于 Apache Mahout 构建社会化推荐引擎
BuildingMahout
Recommender First-Timer FAQ
Apache Mahout 简介
RecommenderJob in mahout-0.4 returning 1.0 score for each recommendation
2. 然后基于grouplens的sample修改, 需要修改的主要是recommender:
public MyRecommender(DataModel dataModel) throws TasteException {
UserSimilarity userSimilarity = new LogLikelihoodSimilarity(dataModel);
// Optional:
//userSimilarity.setPreferenceInferrer(new AveragingPreferenceInferrer(dataModel));
UserNeighborhood neighborhood = new NearestNUserNeighborhood(3, userSimilarity, dataModel);
recommender = new CachingRecommender(
new GenericBooleanPrefUserBasedRecommender(dataModel, neighborhood, userSimilarity));
}
值得注意的是, 因为我们的分数是bool值, 所以这里使用的是GenericBooleanPrefUserBasedRecommender.
3. DataModel比较好修改, 将
super(convertGLFile(ratingsFile));
改为
super(ratingsFile);
就可以了.
4. 编译生成jar包, 拷贝到taste-web的lib下, 然后生成war文件, 然后拷贝到tomcat的webapps下, OK, 部署完毕.
另外需要修改JVM的最大堆尺寸: 修改/usr/share/tomcat6/bin/catalina.sh,
在第一行添加CATALINA_OPTS="-Xmx1024M"
然后重启tomcat:
#/etc/init.d/tomcat6 restart
四. 结果
OK, 现在用浏览器打开http://localhost:8080/[my app name]/RecommenderServlet?userID=[some user id]
能够看到输出 T___T, 类似于:
推荐效果不明, 因为都是文章的数字ID
暂时不会根据这堆数字产生人类可以理解的推荐结果网页
所以只能对着一堆数字泪流满面......
五. TODO
1. 根据推荐结果生成网页?
2. 调整recommender的类型/参数
主要参考以下文章:
Google Reader的数据收集
google提供的几种读取feed的API
值得注意的地方是在请求中可以添加以下参数:
1. 返回数量
2. 返回格式(json/xml)
用Python写了一个爬虫, 单线程抓取, 用的默认参数(n=20, xml). 目前已经爬了将近48小时, 共抓取了30000+个中文用户, 此外有20000+个不活跃用户或非中文用户.
判断中文用户的所使用的方法是: 在返回的结果中查找"的"字, 这种方法同时适用于简体中文和繁体中文. 目前看来效果良好.
抓回来的数据目前是保存为本地xml文件.
二. 数据解析
扫描所有xml文件, 产生打分数据.
打分数据格式为:
userID,itemID
表示用户(userID)喜欢/分享了文章(itemID).
第三项"分值"(preference)可以省略.
因为这里的打分的分值是bool值, 不是1就是0.
三. 搭建社会化阅读推荐引擎
1. 首先需要编译Mahout, 主要参考:
Recommender Documentation
基于 Apache Mahout 构建社会化推荐引擎
BuildingMahout
Recommender First-Timer FAQ
Apache Mahout 简介
RecommenderJob in mahout-0.4 returning 1.0 score for each recommendation
2. 然后基于grouplens的sample修改, 需要修改的主要是recommender:
public MyRecommender(DataModel dataModel) throws TasteException {
UserSimilarity userSimilarity = new LogLikelihoodSimilarity(dataModel);
// Optional:
//userSimilarity.setPreferenceInferrer(new AveragingPreferenceInferrer(dataModel));
UserNeighborhood neighborhood = new NearestNUserNeighborhood(3, userSimilarity, dataModel);
recommender = new CachingRecommender(
new GenericBooleanPrefUserBasedRecommender(dataModel, neighborhood, userSimilarity));
}
值得注意的是, 因为我们的分数是bool值, 所以这里使用的是GenericBooleanPrefUserBasedRecommender.
3. DataModel比较好修改, 将
super(convertGLFile(ratingsFile));
改为
super(ratingsFile);
就可以了.
4. 编译生成jar包, 拷贝到taste-web的lib下, 然后生成war文件, 然后拷贝到tomcat的webapps下, OK, 部署完毕.
另外需要修改JVM的最大堆尺寸: 修改/usr/share/tomcat6/bin/catalina.sh,
在第一行添加CATALINA_OPTS="-Xmx1024M"
然后重启tomcat:
#/etc/init.d/tomcat6 restart
四. 结果
OK, 现在用浏览器打开http://localhost:8080/[my app name]/RecommenderServlet?userID=[some user id]
能够看到输出 T___T, 类似于:
0.8012257 9162463033714117388 0.8012257 -4561230713080859140 0.8012257 2660300300542533338 0.8012257 -2449470947652448865 0.8012257 4517199100982238889 0.8012257 8506464146746528189 0.8012257 -3632037840702745266 0.8012257 -8137494627916127284 0.8012257 -4976713633681791837 0.8012257 1080507498851365445
推荐效果不明, 因为都是文章的数字ID
暂时不会根据这堆数字产生人类可以理解的推荐结果网页
所以只能对着一堆数字泪流满面......
五. TODO
1. 根据推荐结果生成网页?
2. 调整recommender的类型/参数
2011年1月2日星期日
在Ubuntu10.04上安装Simplescalar
主要参考:
[1] Simplescalar installation instructions
[2] Installing Simplescalar
需要补充的一点是:
在执行$ make enquire这一步时,会遇到错误:
在enquire.c的第8行添加:
目前遇到的问题是使用sim-cache和sim-outorder执行gzip时会遇到错误(用sim-profile执行gzip是正常的;用这三个执行mcf都是正常的):
>>>> update 2011-01-06
在Red Hat 9上面安装没有这些问题. 应该和编译器版本啥的有关系.
[1] Simplescalar installation instructions
[2] Installing Simplescalar
需要补充的一点是:
在执行$ make enquire这一步时,会遇到错误:
./xgcc -B./ -DCROSS_COMPILE -DIN_GCC -g -I./include -I/usr/include -DNO_MEM -DNO_LONG_DOUBLE_IO -O0 -I. -c ./enquire.c解决方法:
In file included from /usr/include/sys/types.h:270,
from ./enquire.c:401:
/usr/include/bits/pthreadtypes.h:99: warning: unnamed struct/union that defines no instances
./xgcc -B./ -DCROSS_COMPILE -DIN_GCC -g -I./include -I/usr/include enquire.o -o enquire
enquire.o: In function `fCheck':
./enquire.c:2186: undefined reference to `__isoc99_sscanf'
enquire.o: In function `dCheck':
./enquire.c:2186: undefined reference to `__isoc99_sscanf'
enquire.o: In function `ldCheck':
./enquire.c:2186: undefined reference to `__isoc99_sscanf'
make: *** [enquire] Error 1
在enquire.c的第8行添加:
#define _GNU_SOURCE这样就可以了。
目前遇到的问题是使用sim-cache和sim-outorder执行gzip时会遇到错误(用sim-profile执行gzip是正常的;用这三个执行mcf都是正常的):
fatal: cache: access error: bad size or alignment, addr 0x00009a71不知道该怎么解决,快要崩溃了……
>>>> update 2011-01-06
在Red Hat 9上面安装没有这些问题. 应该和编译器版本啥的有关系.
订阅:
博文 (Atom)