阿里巴巴是个快乐的青年
分类: 架构设计与优化
2014-08-20 13:03:43
1、配置
指定URL初始列表、爬取深度、抓取范围(主题相关即指定域名前缀)。
指定并行抓取数、抓取周期
2、抓取
从初始URL开始,广度优先遍历,结合爬取深度和主题相关过滤。
判断URL是否已经抓取,避免重新下载相同页面。
并行抓取URL(MultiCurl),缓存常用域名与IP对应关系,减少域名解析次数。
3、存储
以URL为KEY存储网页内容到原始网页库(LevelDB)。
4、解析
解析下载页面(HtmlCxx),包括标题(title)、超链接(href)、内容(文本内容最长,但要注意刨除脚本代码即标签之间,,脚本代码与文本相似,程序无法区分)。
此外,KeyWord、字体标记(大字体、加粗)对关键字的提取也很重要。
需要注意页面编码问题,通过标签获取编码方式,如果编码设置错误,页面文本内容可能会是乱码。
1、词库
手工建词库+基于词频统计更新词库。2、分词
分词采用词库分词和统计分词相结合,词库分词的优点在于切分速度快、效率高,统计分词的优点在于收录新词(未登录词)。
(1)词库分词
分词算法采用正向最大匹配算法,即以词库为基准,从前往后正向扫描标题或者正文字符串,对扫描的每个词,从词库中寻找最长匹配。
假设S=C1C2C3C4,最大正向匹配算法描述如下:
(A)取一个字C1,在词库中查找C1并保存是否成词标记
(B)再取字C2,判断词库中是否有以C1C2为前缀的词
(C)不存在,则C1为单词,一次分词结束
(D)存在,判断C1C2是否为词,并取以C1C2为首的多个词的个数n
(E)如果n为0则一次分词结束
(F)否则再取一字,判断词库中是否有以C1C2C3为前缀的词
(G)若不存在,则返回最近一次能够成词的C1C2
(H)否则转向6
(I)从字C3开始下一次分词
假设标题为“我是中华人民共和国公民”,词库中有“中华人民共和国”、“中华”、“人民”、“共和国”、“公民”等词,则当扫描到“中”字,就从“中”字开始向后分别取1、2、3……8个字(“中”、“中华”、“中华人”、“中华人民”、“中华人民共”、“中华人民共和”、“中华人民共和国”、“中华人民共和国公”),词表中的最长匹配字符串就是“中华人民共和国”,那么就此切分开,扫描器推进到“公”字,进行下一轮分词。
(2)统计分词
通常词是稳定的字的组合,根据n元语法,字与字相邻同时出现的频率或概率能够较好的反映成词的可信度,即频率越多就越可能是固定的词,简单的例子是统计两个字之间相邻的频率,频率大于某个阈值就认为这两个字组成了一个新词。
需要注意的是:这、的、啊之类的词,以滤掉对搜索无用的词组。
3、打分
对文档重要性打分用于检索时排序。
PageRank和HITS。
4、倒排
以Value为Key,检索URL为倒排。
注:以URL为Key,以分词得到的多个关键字为Value,建立的索引为正排索引。
三、检索
1、查询
根据关键词检索文档索引库。
对返回的文档去重。
根据文档打分结果进行排序。
反馈排序后结果给用户。
2、反馈
根据排序后结果渲染反馈:
(1)展现反馈
对整个结果展现反馈一次,参数包括QueryID、PvTime、KeyWord。
(2)点击反馈
搜索结果每次点击记录一次,参数包括QueryID、PvTime、KeyWord、DestinationURL。
四、WebUI
1、搜索框
输入搜索词,提示相关词汇。
2、结果集
分页显示、搜索时长、相关结果集总数。
Table显示每个分页的结果集。
结果记录由标题、链接、摘要、快照组成。
高亮显示关键词。
3、相关搜索
相关词汇推荐。