资讯抓取

来源:互联网 发布:flash 9插件 for mac 编辑:程序博客网 时间:2024/04/30 23:38

爬虫


网页的抓取

利用 WebMagic 来爬取网页

流程:编写爬取规则,让 WebMagic 按照此规则来爬取网页
优点:学习成本低,文档全,上手快
缺点:不能获取 Cookie

最终方案

方案:利用 WebMagic 来爬取网页
理由:WebMaic 简单易用,文档全
缺点:不能获取 Cookie
解决方案:先利用 HttpCilent 发送请求来获取 Cookie


网页的渲染

利用无界面浏览器进行渲染

流程:利用 Selenium 的 Driver 来驱动无界面浏览器(HtmlUnit、PhantomJS)进行页面渲染
优点:速度快
缺点:由于不是真正的浏览器,JS 解析经常失败

利用有界面浏览器进行渲染

流程:利用 Selenium 的 Driver 来驱动有界面的浏览器(Chrome、Firefox)进行页面渲染
优点:由于是真正的浏览器,JS 解析大都成功
缺点:速度慢、需要图形界面

最终方案

方案:利用有界面浏览器(Chrome)进行渲染

理由:在利用无界面浏览器(HtmlUnit、PhantomJS)来渲染信源的页面的时候,大都 JS 解析失败。而利用有界面浏览器(Chrome、Firefox)进行渲染的时候,就跟我们正常访问页面一样,大都 JS 解析成功,而 Chrome 渲染速度又比 Firefox 快,所以选择 Chrome

缺点:
1. Chrome 需要图形界面
2. 由于需要渲染,所以速度较慢

解决方案:
1. 给 linux 安装 Xwindow 图形界面,或者部署一台 Window 系统服务器
2. 需要渲染的页面,先 Clean 掉不需要的 Node、JS、CSS 等等(可以参考 QuickJava 如何让浏览器禁止加载图片、CSS、JS 等等), 然后再进行渲染,便可以加快渲染速度


网页的降噪

人工消除噪声

流程:针对每个网站的同类模板的网页编写特定的提取规则
优点:精准的提取我们想要的正文
缺点:需要人工提取内容组织模式

利用统计学消除噪声

流程:
1. 删除噪音块
2. 划分段落
3. 评估段落

优点:自动降噪,不需要人为介入
缺点:不能精准的提取我们想要的正文

利用视觉消除噪声

流程:
1. 渲染页面
2. 页面分块
3. 评估分块

优点:貌似和前两种方法相比,没啥优点
缺点:不能精准的提取我们想要的正文,渲染页面速度慢

最终方案

方案:人工消除噪声

理由:视觉消除噪声需要渲染页面所以速度慢,而且效果也不好。 统计学来消除噪声比较受标签、文本长度、网站模板的影响,例如只有视频,而没有文本的页面的时候,就无法找到正文节点,而且假如正文节点中夹杂着我们不需要的文本子节点,也无法清除。 人工消除噪声效果是最好的,但是需要人工为每个网站编写特定的提取规则,好在我们只爬取特定的信源,所以还是忙的过来的

缺点:需要人工为每个网站编写特定的提取规则,工作量大

解决方案:把通用的规则提取出来,例如清除广告、正文中的标签的替换(div 标签改成 p 或者 span)的规则(可以参考 Readability 的代码)是可以通用,就不需要为每个网站编写一个。只需要为每个网站指定下正文节点的 XPath 路径,以及正文节点中需删除的无用文本子节点的 Xpath 路径


自然语言处理


关键词的提取

利用 TextRank 算法

流程:
1. 去掉停用词、标点符号以及名词、动词、形容词、副词之外的词
2. 建立两个大小为 5 的窗口,每个单词将投票投给它身前身后距离 5 以内的单词
3. 然后开始迭代投票,选出票数最高的前 n 个单词作为关键词

优点:貌似效果会比 TF-IDF 好那么一点点
缺点:算法复杂,速度慢,无法应用于海量数据

利用 TF-IDF 算法

流程:
1. 计算 词频(TF)= 某个词在文章中的出现次数 / 文章的总词数
2. 计算 逆文档率(IDF)= log(语料库的文档总数 / (包含该词的文档数 +1)),
3. 计算 TF-IDF = 词频(TF)* 逆文档率(IDF)
4. 把 TF-IDF 按降序排列,取排在最前面的几个词作为关键词

优点:简单快速,结果比较符合实际情况

缺点:单存以词频衡量一个词的重要性,不够全面,有时重要的词可能出现次数并不多。而且,这种算法无法体现词的位置信息,出现位置靠前的词与出现位置靠后的词,都被视为重要性相同,这是不正确的。(一种解决方法是,对全文的第一段和每一段的第一句话,给予较大的权重。)

最终方案

方案:TF-IDF 算法

理由:TextRank 算法复杂,在实际运用中效果也不会比 TF-IDF 好多少,而且速度极其慢。而TF-IDF 算法简单,在有现成的语料库,和计算好逆文档率的情况下,效果不错而且速度非常快。

缺点:单存以词频衡量一个词的重要性,不够全面,有时重要的词可能出现次数并不多,词的位置信息的重要性也没体现

解决方案:考虑上词的位置信息,例如:标题、文章第一段、文章最后一段的词给予较高的权重,其他段落的词视情况给不同的权重


文本的去重

利用余弦定理

流程:
1. 使用 TF-IDF 算法,找出两篇文章的关键词
2. 每篇文章各取出若干个关键词(比如 20 个),合并成一个集合,计算每篇文章对于这个集合中的词的词频(为了避免文章长度的差异,可以使用相对词频)
3. 生成两篇文章各自的词频向量
4. 计算两个向量的余弦相似度,值越大就表示越相似

优点:简单
缺点:海量数据时效率低,每收入一条数据都要去和网页库里面的每条记录计算一下余弦角度,其计算量是相当恐怖

利用百度海量文本去重算法

流程:
1. 直接找出一篇文章的最长的 n 句话(n 一般取 3),生成 Hash 签名
2. 和其他文章的 Hash 签名对比,假如相同认定该文本重复

优点:简单高效,据说准确率和召回率都能达到 80% 以上
缺点:与另外两种相对比,准确率相对较低

利用 Google 海量文本去重算法

流程:
1. 计算文本的 SimHash 值

1. 从本文中抽取权值最大的前 m 个关键词2. 计算每个关键词的 64 位的 Hash 值3. 利用这些 Hash 值生成一个 SimHash 值(对这些 Hash 值进行位的纵向累加,如果该位是 1,则加上该关键词的权值,如果是 0,     则减去该关键词的权值)
  1. 判断与其他文本的 SimHash 值的汉明距离是不是小于 n (根据经验 n 一般取值为 3),假如小于 n 就认定为相同
1. 将 64 位的 SimHash 值等分成四块 2. 调整上述 64 位 SimHash 值,将任意一块作为前 16 位,总共有四种组合,生成四份 table 3. 采用精确匹配的方式查找前 16 位 4. 如果样本库中存有 2^34(差不多 10 亿)的哈希指纹,则每个 table 返回 2^(34-16) = 262144 个候选结果,大大减少了汉明距离的计算成本 

优点:准确率高

最终方案

方案:Google 海量文本去重算法

理由:貌似还没实际比较百度海量文本去重算法Google 海量文本去重算法的效果,不过有可能出现一种情况,例如一遍文章引用了其他文章的一些句子,这时候百度海量文本去重算法有可能误判

0 0