1.期待谷歌更加强大的推荐挂件
在这个方面,虽然我们对百度寄予了厚望,但是实际上我更相信谷歌的技术。原理很简单:通过不同用户的不同搜索词进入不同文章,而这些搜索词在其他用户而言又是意思相近的。理解起来有点难,我们只能通过例子来说明:有A、B、C三个用户。有a、b、c三篇文章。A搜索w点击进入了a文章,B搜索m点击进入了b 文章,C搜索p进入c文章时,谷歌发现w、m、p这三个词组意思非常相近,所以判断a、b、c三篇文章是相关文章,因此在三篇文章下方返回了一个相关 文章列表(使用javascript来调用)。通过历史记录来判断某些文章相关,很多用户点击进入某篇文章后,同时进入另外一篇文章,说明文章相关性强。如果非得靠谷歌搜索的关键词,就显得太傻了,通过谷歌统计代码,从历史浏览记录来进行深入判断。当A进入a文章之后,发现下方有一个随机的推荐列 表,如果发现有自己需要的或者感兴趣的文章b,就会点击进去,这些行为被记录在谷歌的大数据中,当从a进入b被无数人实践过后,甚至可以统计b出现在a页 面的哪个位置更容易被点击,第几次进入的时候是否不愿意再点击b文章了,而谷歌完全有能力做到这种分析,最终当B、C首次进入a文章的时候,b文章的链接 就会非常合理的出现在该出现的位置。而实际上,如果无数用户从a进入,最后到了c这篇文章,那么为什么不直接把c文章链接放在a页面呢?这多少有点大数据 的意思。
2.统计和聚类:数据库爬虫
人工智能希望计算机有理解能力,但实际上目前我们只能通过统计和聚类来更加只能的判断相关性和可能性。100个人买了尿不湿的时候买了啤酒,这不能说明什么,但是有1万亿人次都这样做了呢?通过设计一个爬虫程序,到数据库中的文章表中去抓取,对文章标题、内容、摘要、关键词、标签等进行分词统计。最原始的方案是最长匹配词数量越多,文章相关性越强。爬虫要做的就是匹配词组,因此最开始应该有一个词典。但是词典需要人为手工建立,略显麻烦。解决方案也很简单,用一篇典型文章作为原始案例,让爬虫 去爬,反复的爬,通过分词建立原始词典。利用这个原始词典再去爬其他的文章,遇到新词的时候就加入到词典中。这种方法能够保证新词只会在后面去爬的文章中 出现。在爬的过程中,一方面可以发现新词加入词典,另一方面又把词频统计出来,按照词组的长度降序排,找到最长词。通过对文章最长词的对比,确定文章的相 关性。但是这种方法必须面临两个问题,一个是效率问题,一个是干扰问题。搜索引擎中最核心的问题之一就是效率,主要是两个方面的效率,一个是爬取,另一个是检索。对应到推荐系统中,一方面是如何确定文章的相关性(爬的效率),另一方面是如何更快的根据爬的结果返回相关文章列表(取的效率)。干扰问题则是指 部分文章的词频无法反应这个问题的核心主旨,例如一篇含有100行代码的文章,介绍性的文字可能只有20-30行,这种情况下很难防止统计结果与文章核心 主旨不符(而其他文章的统计结果又相对比较准确)。为了提高效率,你可以鼓动你的读者来为你提供词典,比如说读者读完文章后,你要求他输入认为可以概括本文的关键词,这样可以让爬虫更加确定自己是否应该省去某些词,而重视某些词。
3.最有可行性:标签、搜索和浏览记录
上面说到的两种方案都是离我们比较远的,普通程序员很难在自己的网站中实现。回归现实,我们希望真正可以在网站中实现的一种方案(即使可能相关性结果稍微弱一点)。标签是最合理的一种方案。给不同的文章贴上3个以上的标签,因为标签是人工撰写的,所以最好有一个自己的标签列表,防止把 同一个意思写成了不同的标签,例如自行车单车脚踏车。把标签统一起来,意思相近的,全部统归为一个词,下次再打算贴标签的时候,就只用这个 词。3个以上的标签基本上能反映出该文章大概要讲什么内容。在使用程序去挑选相关文章的时候,尽可能的匹配所有标签,假如两篇文章有3个以上的标签,那应 该是有相同主题的内容的吧。我见过只要有一个标签相同就推荐出来,我认为这种方法不好,文章开头已经举过了例子。但标签的方法毕竟是人工来弄,思考和统归过程是很累的。一个网站中相关性比标签还要强的,应该是站内搜索结果。我是指那些具备稍微强大的搜索模块的站内搜索,仅仅用LIKE去匹 配一下数据库的情况,个人认为搜索结果参考价值比较低,特别是只用一个搜索词的情况下。但是大部分网站的搜索模块还是比较差的,因此,我的建议是,规定用 户必须使用两个以上的词进行搜索,这样可以保证搜索结果相对准确。
4.但是如何将搜索应用到文章推荐中呢?
搜索的出发点是关键词,因此你得找到和这篇文章相关的关键词。怎么找呢?一种是直接使用标签,把这篇文章的标签作为关键词 (上面说了,3个标签以上),利用网站的搜索模块,搜索出文章,返回到当前文章的页面,列出链接列表即可。另一种比较复杂,通过浏览记录来获取关键词。 (这里需要提一下,面对普通的网站,分词的想法被我放弃了。)浏览记录里面记录了一些关键词,包括站外搜索引擎关键词、站内搜索关键词和浏览过的文章的标 签。浏览记录里面需要通过社会网络方法,找出与当前文章相关的关键词,再通过网站的搜索模块,搜索出相关文章,把链接列表显示出来。当A通过w搜索进入网站的时候,记录下w(如何获取搜索引擎过来的关键词的文章网上一大堆),并且标记它跟a文章相关(例如记录到a的一个 字段里,或者另外建立一个表记录对应关系)。当B和A发生了同样的情况的时候,增加相关次数n。当n的值大到一个区间的时候,那么w肯定和a相关。同样的 方法,m、p也跟a相关,可见w、m、p这三个词组和a都相关。拿w、m、p到网站的搜索模块中检索,返回的结果可能就是用户最需要的。站内搜索的道理一样,通过记录不同的用户搜索的词和点击进入的结果的一个n值,最终找到某些文章最相关的关键词,用这些词去搜索,返回的结果应该是比较相关的。历史浏览记录主要是指用户都阅读了网站内的哪些文章,在这个用户的浏览器中用cookie记录下来,为了防止cookie被清除,还可以通过用户注 册、社交账号绑定、IP记录等把该用户的行为记录到网站数据库中。不单单要记录读了哪些文章,还要记录其阅读的顺序和页面停留的时间,高级一点还可以记录 每一个页面都在哪些位置进行了点击,哪些位置花了更多的时间来研究阅读。总之,这些都可以通过javascript来实现。只有通过按顺序点击链接次数在 5次以内的访问有参考价值,而且这里假设了用户不是因为图片上有个美女而被吸引去点击的。只要符合这种情况,就可以把用户阅读过的这些文章的标签收集起 来,进行词频统计,挑出词频最大的几个,再使用搜索模块搜索文章。下一次有新用户访问上面5次访问内的文章的时候,都可以尝试把这些搜索到的文章作为推荐 文章推荐给用户。