搜索引擎和信息检索实践_课后习题_第三章

来源:互联网 发布:如何在手机开淘宝网店 编辑:程序博客网 时间:2024/06/06 10:38

3.1   假设有两个文档集合,较小的集合中全部都是有用的、正确的、高质量的信息。较大的集合中含有一些高质量的文档,但还有一些低质量的、过时的、书写较差的文本。只对较小的集合建立搜索引擎的原因是什么?对两个集合都建立搜索引擎的原因是什么?


3.2   假设有一个网络连接,每秒可以传输10MB的数据。如果每个网页大小为10K,需要500毫秒进行传输,网络爬虫需要多少个线程才能完全利用网络连接?如果爬虫在对同一网络服务器发出的不同请求之间需要等待10秒钟,系统每秒钟最少需要连接多少台网络服务器,才能充分地利用网络连接?
答:传输速率10MB/s,网页平均大小为10K,那么爬虫程序每秒可以备份1K个页面。又每个页面需要500ms进行传输,用1K*500ms=500s,这意味着一秒内传输1K个页面需要使用500个连接,在礼貌策略下等待10s,因此系统每秒钟最少需要连接5000台网络服务器才能有效地利用网络连接。

3.3   在信息采集过程中,使用HEAD请求而不是GET请求的优点是什么?什么时候爬虫需要使用GET请求而不是HEAD请求?
答:1.HTTP协议有一个称为HEAD的特殊请求,使得检查页面是否发生变化更加容易了。HEAD请求只返回页面的头部信息,而不是页面的内容。2.在爬虫发现请求页面的内容发生变化的时候,需要通过GET请求获取目标页面的内容,此时使用GET请求,而不是HEAD请求。

注:HEAD请求中Last-Modified的值指出了页面内容最后一次发生变化的时间。可以看到,在对GET请求进行响应时,这个日期信息也随着响应一起发送。这就允许网络爬虫对上一次从GET请求接收的日期与HEAD请求中得到的Last-Modified的值进行比较。

3.4   爬虫为什么不使用POST请求?
答:虽然爬虫也可以通过使用POST请求获取网页。除了POST请求可以向服务器发送额外的请求信息之外,它和GET请求类似,习惯上,GET请求用于抓取已经在服务器上存在的数据,而POST请求用于告诉服务器一些事情。当你点击一个按钮购买商品或者对网页进行编辑时,就可以使用POST请求。如果运行一个爬虫程序,这个惯例是很有用的。由于只是发送了一个GET请求,就有助于确保网络爬虫不会再无意间去购买一件商品。

3.5   给出本章中提到的组成深层网络的三种站点类型的名字。
答:私人站点(private site)、表单结果(form result)、脚本页面(scripted page)。

3.6   为了实现对深层网络网页的信息采集,如何设计一个系统,能够自动地将数据填写到网页表单中?使用什么样的方法能保证爬虫的行为没有破坏性(例如,不会随机地增加博客评论)?
答:两种方法:1、分析网页中的form标签,其中action属性是提交请求的url,form子标签中input标签,并且type=‘text’的标签,获取其name属性,将name和预设的value加入POST的请求内容中;另外,type='hidden'的标签的name和value也要加入到POST的请求内容中;2、使用自动化测试工具,在网页中植入js,自行输入数据,提交,获取响应的请求后页面的内容。

如下所示,bing搜索引擎的输入框内容:

<form action="/search" id="sb_form" class="sw_box"><input class="sw_qbox" id="sb_form_q" name="q" title="输入搜索词" type="text" value="XXX"><input id="sb_form_go" class="sw_qbtn" title="搜索" tabindex="0" name="go" type="submit" value=""><input id="sa_qs" name="qs" value="bs" type="hidden"><input type="hidden" value="QBRE" name="form"></form>

保证爬虫行为无破坏性:

3.7   编写一段程序,根据计算机硬盘某个目录中的内容,创建一个有效的网站地图。假设来自网站 http://www.example.com的文件都是可存取的。例如,目录中有一个文件 homework.pdf,该文件在 http://www.example.com/homework.pdf 上是可用的。在网站地图中,使用文件真实的修改日期作为最后修改的时间,并估计变化的频率。


3.8   假设为了使网页的采集更快,建立了两个信息采集机器,每个机器中的种子URL不同。这是一个分布式信息采集的有效策略吗?为什么?
答:不是,两个信息采集机器,每个机器中的种子URL不同,但随着采集的进行,两个机器很可能采集到相同服务器上的相同页面,但是这两台机器仍然会采集,出现重复URL和重复内容;

使用多台信息进行采集,主要考虑三个方面的原因:

1.将爬虫程序放在采集信息的网站附近。长距离网络连接会具有较低的吞吐量(每秒钟只备份少量的字节)和较大的延迟时间(字节数据需要经过长距离的传输)。

2.为了减少爬虫需要记住的网站数目。

3.可以使用大量的计算资源,包括用于分析的CPU资源,用于页面采集的网络带宽。

分布式网络爬虫更像单独一台计算机上的爬虫程序,但它拥有多个URL队列,而不是一个。分布式网络爬虫使用散列函数将URL分配给进行信息采集的计算机。当一个爬虫程序看到了一个新的URL,就对该地址计算它的散列值,以确定该地址由哪台进行信息采集的计算机负责。将这些URL分批进行汇总,然后周期性的发送,以减少每次发送一个URL的网络开销。

3.9   编写一个简单的单线程网络爬虫程序。从单一的输入一个URL地址(可能是一个教授的个人主页)开始,爬虫下载一个网页,在下载下一个网页之前,至少等待5秒钟的时间。程序要能够根据上次爬取的文档中解析出来的链接标签,找到其他的页面。


3.10   UTF-16可以用于Java和Windows。将它和UTF-8进行比较。
答:

UTF-8编码方案

十进制十六进制编码形式0~1270~7F0xxxxxxx128~204780~7FF110xxxxx 10xxxxxx2048~55295800~D7FF1110xxxx 10xxxxxx 10xxxxxx55296~57343D800~DFFF未定义57344~65535E000~FFFF1110xxxx 10xxxxxx 10xxxxxx65536~111411110000~10FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx上表中给出UTF-8的编码表。表中左边的列表示十进制数值的范围,最右边的列表示这些十进制数值以二进制方式编码的形式。字符x表示二进制数字,例如,希腊字母π在Unicode中对应数字960,对应的二进制数为00000011 11000000(十六进制数为3C0)。表中的第二行告诉我们,这个字符在UTF-8中需要用两个字符进行编码。3C0的高五位二进制落在第一个字节中,接下来的6位落在第二个字节中。该字符最终的UTF-8编码为11001111 10000000(对应的十六进制为CF80)。其中加粗的二进制位与表中的相同,表中的x字符对应的为由Unicode数字的二进制数值进行填充。

UTF-16与ISO 10646的通用字符集(Universal Character Set,UCS)概念相对应,目前实际应用的Unicode版本对应于UCS-2,使用16位的编码空间,也就是每个字符占用两个字节。这样理论上最多可以表示2^16=65536个字符。基本满足各种语言的使用。实际上目前版本的Unicode尚未填充满这16位编码,保留了大量控件作为特殊使用或将来扩展。上述16位Unicode字符构成基本多文种平面(Basic Multilingual Plane,BMP)。

对于U+0000-U+FFFF的Unicoide字符,UTF-16直接对应于Unicode编号来表示。例如,对于U+1234,UTF-16(little endian)表示为0x34 0x12(左边是低地址,右边是高地址)。

但是未雨绸缪,从Unicode3.1版本开始,设立了16个扩展字码空间,成为辅助平面,使Unicode的可使用空间由6万多字增至100万字。辅助平面的Unicode范围是U+10000-U+1FFFD。那么UTF-16和如何对辅助平面进行支持的呢?

D800-DBFFHigh-half zone of UTF-16DC00-DFFFLow-half zone of UTF-16

16进制编码范围UTF-16表示方法(二进制)10进制编码范围字节数量0000 0000-0000 FFFFxxxxxxxx xxxxxxxx0-6553520001 0000-0010 FFFF110110xx xxxxxxxx
110111xx xxxxxxxx65536-11141114

这里是UTF-16的编码方式。我们可以看到,对于超过两个字节的字符,UTF-16表示成了4个字节。而这四个字节为了能跟2字节的普通字符区分开来,他的开头用到了为UTF-16保留的Unicode范围。

举个例子,假如我们要读一些UTF-16的字符,这些字符使用Big Endian,我们可以两个字节两个字节的读,每次读入两个字节时,我们先检查一下,这两个字节的高字节是不是在D800-DBFF范围内。如果是,那表示我们读到了一个超过两个字节的字符,那我们叫知道这两个字节接下来的两个字节才组成一个真正的字符。如果不是在D800-DBFF范围了,那简单了,这就是一个双字节的字符而已。

这里可能会问,为啥UTF-16要用两个范围,一个范围不够么?

确实不够,请注意,字符有可能使用Little Endian。这个时候,我们先读到的是低位的双字节,这就用到第二个方位DC00-DFFF。对于Little Endian的情况,低位的双字节出现在字节流的前面,我们需要用DC00-DFFF这个范围来判断这是双字节的字符还是4字节的字符。

UTF-16比起UTF-8,好处在于大部分字符都以固定长度字节(2字节)存储,但UTF-16却无法兼容ASCII编码。


3.11   BigTable是如何处理硬件故障的?
答:BigTable的实现中,绝大部分的任务是关于故障恢复的。tablet是逻辑表中很小的部分,复制到另外一个文件系统中进行存储,该文件系统可以被BigTable中所有的tablet服务器存取。Bigtable中tablet的变化记录在事务日志中,日志存储在一个共享的文件系统中。如果某个tablet服务器死机了,另外一台服务器可以立即从文件系统中读取tablet数据和事务日志,并将工作承担过来。

另外,BigTable将文件存储在永远不变的(不能改变)的文件中。一旦数据写入到BigTable的文件中,它就不再变化了。这样做有助于故障的恢复。BigTable中文件或者是不完整的(这时候文件可以被丢掉,可以从其他的BigTable文件盒事务日志重新创建),或者是完整的,因此不会被破坏。


3.12   设计一个用于压缩HTML标签的压缩算法。算法要能够检测HTML文件中的标签,并能够使用你设计的较短的编码对标签进行替换。编写一个编码器和解码器程序。


3.13   通过使用Unix的cksum命令对文档中的字节进行加法运算,可以对一个文档生成检验和。对文档进行编辑,看两种检验和是否发生了变化。对文档进行修改的时候,能够使检验和不发生变化吗?


3.14   编写一个程序,给文档生成simhash指纹。可以对词使用任意合理的散列函数。使用该程序对计算机上的重复文档进行检测,得出检测的准确率。检测的准确率随着指纹大小有什么变化?


3.15   对于一个给定的网页,绘出文档斜率曲线。给定的网页中至少包含一个有新闻文章的页面。测试一下主要内容块检测的优化算法的准确率。编写你自己的程序,或者使用 http://www.aidanf.net/software/bte-body-text-extraction上的代码。对算法失效的情况进行说明。在这种情况下,对文档斜率曲线中低斜率区域,搜索的算法会有效吗?


3.16   对使用DOM结构来识别网页中内容信息的算法给出一个抽象的概括。特别地,对结构中内容和非内容元素进行识别的启发式方法进行描述。

原创粉丝点击