slope one 算法介绍

1 Comment

  1. 关于slope one的前世今生我就不多说了,Beyond Search 说的很清楚了。(其实我就是从他的Blog开始研究个性化推荐的)
  2. 关于slope one算法要实现的目标和一个简单的实例Beyond Search也说了,我这里就接着他的稍微深入一些。
  3. 更实际的例子:
  4. 首先计算item1和item2的平均差值,((5-3)+(3-4))/2=0.5,还有item1和item3的平均差值,就是5-2=3,然后推算lucy对item1的评分,根据item1和item2的平均差值来看lucy对item1的评分可能为2+0.5=2.5,同理根据item1和item3的平均差值lucy对item1的评分可能为5+3=8.
  5. 现在如何取舍那?使用加权平均数应该是一种比较好的方法, (因为2.5是根据两个值推算的,8是通过一个只推算的)
  6. slope one 算法差不多真的就是这么简单了!
  7. 有一个开源的Java程序taste里面有一个完整的slope one算法的实现,包括程序和一个关于grouplens数据的实例程序(或者说是验证程序……)。
  8. 个人觉得slope one 很好、很强大呀!足够简单,推荐准确度也不逊色与其他复杂的推荐算法(当然,这个东西更大程度上取决与数据样本)。而且taste程序写的也很不错,稍加改造应该就可以用了。
  9. 相关链接:Beyond Search 的文章wikipediaSlope One Predictors for Online Rating-Based Collaborative Filtering

窥视豆瓣的算法

No Comments

豆瓣一直是中国web2.0的楷模,它神奇的“猜”功能吸引了无数的粉丝。他到底为什么有这么神奇的能力那?古老的读心术吗?当然不是,这全部得力于他的推荐算法。

所谓推荐算法就是利用用户的一些行为,通过一些数学算法,推测出用户可能喜欢的东西。推荐算法主要分为两种(还有一些可能不在本文讲述的范围内)基于内容的推荐基于协同过滤的推荐。基于内容的推荐比较容易理解,他是通过两样东西的内容之间的相关性进行推荐。比如说,A喜欢一篇400字文章,里面出现了“豆瓣”这个词100次。哪么系统就会推荐一些同样出现了“豆瓣”这个词很多次的文章给A。这就是基于内容的推荐,他的好处是比较好理解、简单、高效,缺点就是只能用来推荐文章等一些文字的东西。对于图片等一些多媒体的内容就无从下手了。

基于协同过滤的推荐算法,正好弥补了这个缺点,他理论上可以推荐世界上的任何一种东西。图片、音乐、样样可以。协同过滤算法主要是通过对未评分项进行评分预测来实现的。不同的协同过滤之间也有很大的不同。

基于用户的协同过滤算法

这种算法基于一个这样的假设“跟你喜好相似的人喜欢的东西你也很有可能喜欢。”所以基于用户的协同过滤主要的任务就是找出用户的最近邻居,从而根据最近邻居的喜好做出未知项的评分预测。这种算法主要分为3个步骤:

一,用户评分。可以分为显性评分和隐形评分两种。显性评分就是直接给项目评分(例如给豆瓣里的书籍评分),隐形评分就是通过评价或是购买的行为给项目评分(例如在当当购买了什么东西)。

二,寻找最近邻居。这一步就是寻找与你距离最近的用户,测算距离一般采用以下三种算法:1.皮尔森相关系数。2.余弦相似性。3调整余弦相似性。调整余弦相似性似乎效果会好一些。

三,推荐。产生了最近邻居集合后,就根据这个集合对未知项进行评分预测。把评分最高的N个项推荐给用户。

这种算法存在性能上的瓶颈,当用户数越来越多的时候,寻找最近邻居的复杂度也会大幅度的增长。因而这种算法无法满足及时推荐的要求。基于项的协同过滤解决了这个问题。

基于项的协同过滤算法

根基于用户的算法相似,只不过第二步改为计算项之间的相似度。由于项之间的相似度比较稳定可以在线下进行,所以解决了基于用户的协同过滤算法存在的性能瓶颈。

豆瓣应该采用的就是基于项的协同过滤算法。但是他不可能只使用一种算法,肯定是综合了许多的算法。至于都有什么算法,比例是什么。那只有豆瓣的工程师知道,我们是猜不出来的。

Reddit.com

No Comments

Reddit.com是一个个性化的推荐站点。

1.Reddit的界面

界面极其简单,与她相比douban简直太花哨了。这个页面只有一个Logo图片。颜色也基本上跟没有css差不多,每个条目只有标题没有介绍。这样简洁的UI使得他可以在一个页面里显示更多的条目。

2.Reddit的个性化推荐服务

Reddit所显示的每一呀条目都有两个箭头,一个向上,一个向下。如果你感兴趣点击一下向下的箭头,不喜欢就点击向下的箭头。系统会根据你的阅读选择自动的为你生成一个推荐列表。

3.Reddit的书签服务

Reddit只是有一点像一个书签网站,其实他提交url的目的是让用户提交他所感兴趣的条目。

作为一个个性化推荐站点,他的推荐功能应该是他的特点。但是实际使用了一下,推荐的效果并不是很准确。

Reddit有一个中文版的,网址是zh.reddit.com。但可惜的是只有hot等是是中文的,推荐列表并不是中文(这一点我特别奇怪,难道他不是基于内容的推荐,还是因为我以前的记录影响了推荐结果?)。

运行heritrix成功

No Comments

看了自己动手做搜索引擎那本书,上面写的运行heritrix的方法挺麻烦的!要加载好多jar包,懒得弄。后来发现bin文件夹里面本来就有一个heritrix.cmd的文件,我想着一定就是windows下的运行文件,运行了一下,提示输入用户名密码!

输入用户名密码了以后,又说找不到密码文件“jmxremote.password”。我发现在conf文件夹里面就有一个jmxremote.password.template文件,这一定是一个模板文件!打开后修改一下密码,把它放到heritirix的根目录,继续运行……

这下子成功了,可以启动webUI了,浏览器输入http://127.0.0.1:8080,输入用户名,密码。就可以进入了!(用户名密码以及端口号可以在/conf文件夹里的文件修改)

但是有个问题,就是设置了任务,运行不了!查了一些资料原来是默认的配置文件有问题,将 %HERITRIX_HOME%\heritrix-1.12.1.jar 解压到临时目录,拷贝其中的profiles目录到 %HERITRIX_HOME%\conf\目录下。

这样做就没有问题了,可以进行抓取任务了!

以下内容是转载的一个最简单的任务的设置方法!

Heritrix提供的配置功能非常丰富,但是也很复杂,刚开始的时候很难正确的创建并且执行一个Job去抓取网站,自己阅读了大部分的Heritrix用户文档和多次尝试之后,总结了一个简单的创建执行Job的用例,该用例为抓取www.baidu.com下的网页,但子域(如 news.baidu.com)不抓取,步骤如下,可供参考:

(1) WUI的上边的导航栏选择”Jobs”,呈现的第一项是”Create New Job”,选择第四小项”With defaults”。输入项的前两项

     Name和Description随意,Seeds非常重要:http://www.baidu.com/ 注意最后一个反斜杠必须。

(2) 选择下边的”Modules”,进入Module配置页(Heritrix的扩展功能都是通过模块概念实现的,可以实现自己的模块完成自己

     想要的功能)。其中第一项 “Select Crawl Scope” 使用默认的 “org.archive.crawler.deciderules.DecidingScope”

     。倒数第三项 “Select Writers ” 删除默认的 “org.archive.crawler.writer.ARCWriterProcessor” ,后添加

   “org.archive.crawler.writer.MirrorWriterProcessor”,这样执行任务的时候抓取到的页面会以镜像的方式放在本地的

     目录结构中,而不是生成ARC存档文件。

(3) 选择”Modules”右边的”Submodules”,在第一项内容中 “crawl-order ->scope->decide-rules->rules” 删除掉其

     中的 “acceptIfTranscluded” (org.archive.crawler.deciderules.TransclusionDecideRule) 的这一项抓取作用域的

     规则。否则当Http请求返回301或者302时Heritrix会去抓取其他域下的网页。

(4) 在WUI的第二行导航栏中选择”Settings”进入Job的配置页面,其中主要修改两项:http-headers 下的user-agent 和

     from,他们的”PROJECT_URL_HERE” 和 “CONTACT_EMAIL_ADDRESS_HERE” 替换为自己的内容

    (”PROJECT_URL_HERE” 要以 “http://” 开头)

(5) 在WUI的第二行导航栏中选择最右边的”Submit job”

(6) 在WUI的第一行导航栏中选择第一项的”Console”,点击”Start”,抓取任务正式开始,时间长短有网络状况和所抓取网站的

      深度有关。

      按照如上步骤应该可以正确的执行一次网站的抓取任务,抓取页面会存放在你的工作目录下的mirror文件夹内。关于Job的创建和执行过程中的各种设置可以在用户手册中查到,都有详细的说明。

Nutch使用汇总

No Comments

网上有好多的Nutch使用的文章,但其实只是几篇文章翻来覆去的拷贝而已!

1.Nutch 初体验

很经典,讲了nutch与lucene 以及其他一些爬虫的比较。和建立一个抓取企业内部网(Intranet crawling)实例。但是可能是版本的问题。其中少了关键的一步。

2.Tutorial (0.8.x) 

这里是官方的那个文档,补全了少的那一步。

否则出现后果为
Fetcher: segment: info/segments/20061207221006
Fetcher: threads: 4
fetching http://student.ustb.edu.cn/
fetch of http://student.ustb.edu.cn/ failed with: java.lang.NullPointerException
Fetcher: do

看这个一可以解决问题

http://lucene.apache.org/nutch/tutorial8.html

3。Nutch 初体验之二

讲了一些nutch全网crawl的东西,其实这些都可以在nutch的wiki里找到!就是那里是英文,不太舒服!这个文章挺不错得!

4。NutchWindows中安装之细解

主要是说Cygwin的安装,Cygwin是个挺好的东西,建议大家即使不用Nutch也装一个,因为用bash确实很爽!

5。nutch中文分词

http://www.rxiao.com/blog/article.asp?id=138

6。Nutch 使用之锋芒初试

基本上是和Nutch 初体验之二一样的内容。

7.试用nutch

http://hedong.3322.org/archives/000247.html

这个太老了,好像多不太适用了。

8。Nutch9.0 的lucene好像有问题,要重新编译,本人没有测试。

个人观点:结合我的项目这个东西不适合我。理由是:

nutch是一个完整的搜索引擎,但是它只是一个搜索引擎他可以订制的东西太少!例如加中文分词好像要改动源文件,这样做对以后的升级维护都是麻烦。

Newer Entries