第四章 图论和网络爬虫
4.1 构建网络爬虫工程重点
-
构建网络爬虫的重点
-
用
BFS
还是DFS
在不考虑时间的情况下,这两种不同的搜索方法都可以在相同的时间下爬下整个静态的互联网内容,但是在现实中肯定是需要考虑时间以及互联网动态变化的。所以重点应该是
如何在有限时间里最多的爬下最重要的网页
,类似BFS。考虑爬虫的分布式结构,一个大的网络爬虫可能有成千上万台服务器组成的分布式系统,这些服务器下载完一个网站后再进入另一个网站,而不是每个网络先下载5%,在回头继续第二批,这样可以避免
握手
(下载服务器和网络服务器建立通信的过程)次数过多,类似DFS。所以并不是单纯的BFS或者DFS,而是有相对复杂的下载优先级排序方法(调度系统)。
-
页面分析和URL提取
当一个网站下载后,需要提取url,加入下载队列。
-
记录哪个网页已经下载过-URL表
在互联网上一个网页可能会被多个网页的超链接指向,所以在遍历时可能被多次访问,为了避免一个网页被下载多次,可以使用哈希表记录那些网
页已经被下载过。采用哈希表的好处是,判断url是否在表中,平均只需一次(或者略多)查找。遇到未下载的网页,除了下载该网页,还要适当将这个网页的URL存入哈希表中。如果有成千上万服务器下载网页,存储这个哈希表的服务器的通信就是整个爬虫系统的瓶颈了。
-
-
总结:
因为在现实生活中图的规模都是在几千个节点以内,比如公路图,铁路图等,图的遍历比较简单,所以在图论出现后的很长时间内,即使是计算机专业的学生也体会不到这个领域的研究有什么实际用处。但是随着互联网的出现,图的遍历方法一下子有了用武之地,很多数学方法如布尔代数,布尔运算等都是这样
第五章 网络搜索
5.1 pagerank算法(度量网页质量)
-
pagerank算法中心思想
如果一个网页被很多网页所连接,说明它收到普遍的承认和信赖,那么它的排名就高;排名高的网页的链接更可靠,需要区别对待,给予更大的权重,即网页排名高的网站贡献的链接权重大。
-
计算网页排名的过程中需要用到网页自己的排名,布林假定所有网页排名相同,使用二维矩阵想乘并迭代计算的方法。
-
假定向量
B = ( b 1 , b 2 , ⋯ , b N ) ⊤ \boldsymbol{B}=\left(b_1, b_2, \cdots, b_N\right)^{\top} B=(b1,b2,⋯,bN)⊤为第一、第二……第 N N N 个网页的网页排名。知阵
A = [ a 11 ⋯ a 1 n ⋯ a 1 M ⋯ ⋯ a m 1 ⋯ a m n ⋯ a m M ⋯ ⋯ a M 1 ⋯ a M n ⋯ a M M ] A=\left[\begin{array}{ccccc} a_{11} & \cdots & a_{1 n} & \cdots & a_{1 M} \\ \cdots & & & & \cdots \\ a_{m 1} & \cdots & a_{m n} & \cdots & a_{m M} \\ \cdots & & & & \cdots \\ a_{M 1} & \cdots & a_{M n} & \cdots & a_{M M} \end{array}\right] A= a11⋯am1⋯aM1⋯⋯⋯a1namnaMn⋯⋯⋯a1M⋯amM⋯aMM 为网页之间链接的数目. 其中 a m n a_{m n} amn 代表第 n n n 个网页指问第 m m m 个网页的链接数。 A A A 是已知的, B B B 是末知的, 是我们所要计算的。
初始假设:所有网页的排名都是 1 / N 1 / N 1/N, 即
B 0 = ( 1 N , 1 N , ⋯ , 1 N ) 。 \boldsymbol{B}_0=\left(\frac{1}{N}, \frac{1}{N}, \cdots, \frac{1}{N}\right) \text { 。 } B0=(N1,N1,⋯,N1) 。
假定 B i B_i Bi 是第 i i i 论连代的结果,那么
B i = A ⋅ B i − 1 \boldsymbol{B}_i=\boldsymbol{A} \cdot \boldsymbol{B}_{i-1} Bi=A⋅Bi−1 -
显然通过公式简单 (但是计算量非常大) 的知阵运算, 可以得到 B 1 , B 2 , ⋯ ⋯ B_1, B_2, \cdots \cdots B1,B2,⋯⋯ 可以证明 B i \boldsymbol{B}_i Bi 最终会收敛, 即 B i B_i Bi 无限趋近于 B \boldsymbol{B} B, 此时: B = B × A ± \boldsymbol{B}=\boldsymbol{B} \times \boldsymbol{A}_{ \pm} B=B×A±因此. 当两炏㑢代的结果 B i \boldsymbol{B}_i Bi 和 B i − 1 \boldsymbol{B}_{i-1} Bi−1 之间的差昇非常小, 接近于零时, 停止迭代运算, 算法结束。一般来进, 只要 10 次左右的造代基本上就收敛了。
由于网页之间链接的数量相比互联网的规模非常稀疏, 因此计算网页的网页排名也需要对零概率或者小概率事件进行平滑处理。网页的排名是个一维向量, 对它的平清处理只能利用一个小的常数 α D \alpha_{\mathrm{D}} αD 这时, 公式 (1 变成
B i = [ α N ⋅ I + ( 1 − α ) A ] ⋅ B i − 1 \boldsymbol{B}_i=\left[\frac{\alpha}{N} \cdot I+(1-\alpha) A\right] \cdot \boldsymbol{B}_{i-1} Bi=[Nα⋅I+(1−α)A]⋅Bi−1其中 N N N 是互联网网页的数教, α \alpha α 是一个 (较小的) 常数, I I I 是单位矩阵。网页排名的计算主要是矩阵相乘, 这种计算很容易分解成许多小任务.在多台计算机上并行处理。
5.2 TF-IDF(度量网页与查询相关性)
5.2.1 影响搜索引擎的因素
- 可以归纳为四大类
- 完备的索引。俗话说巧姻难为无米之㰠, 如果一个网页不在索引中, 那么再好的算法也找不到。
- 对网页质量的度量, 比如 PageRank。当然, 正如在前面一章中介绍的那样, 现在来看, PageRank 的作用比 10 年前已经小了很多,今天对网页质量的衝量是全方位的, 比如对网页内容权威性的度量,一些八卦网站的 PageRank 可能很高, 但是它们的内容权威性很低。
- 用户偏好。这一点也很容易理解,因为不同用户的㔛好不同,因此一个好的搜害引繁会针对不同用户, 对相同的搜索给出不同的排名。
- 确定一个
网页和某个查询的相关性
的方法。
5.2.2 TF( Term Frequency:单文本词频)
-
度量网页和某个查询的相关性有个简单的办法,即直接使用各个关键词在网页中出现的总词频。
T F = 关键词出现次数 网页总字数 TF=\frac{\text{关键词出现次数}}{\text{网页总字数}} TF=网页总字数关键词出现次数如果一个查询包含N个关键词 w 1 , w 2 , ⋯ , w N w_1, w_2, \cdots, w_N w1,w2,⋯,wN, 它们在一个特定网页中的词频分别是: T F 1 , T F 2 , ⋯ , T F N T F_1, T F_2, \cdots, T F_{N} TF1,TF2,⋯,TFN。那么, 这个直询和该网页的相关性 (即相似度) 就是:
T F 1 + T F 2 + . . . . . + T F N TF_1+TF_2+.....+TF_N TF1+TF2+.....+TFN
如搜索“原子能的应用”,假设网页总字数1000字,“原子能”出现2次,“的”出现35次,“应用”出现5次,则TF为
0.002 + 0.035 + 0.005 = 0.042 0.002+0.035+0.005=0.042 0.002+0.035+0.005=0.042漏洞
:- 停止词“的”,对确定网页主题几乎无用,但却占词频80%
- “原子能”是个很专业的词,权重应该比“应用”更重要,但是词频却小于应用
-
因此我们需要给汉语中的每个词设置一个权重,每个词的权重应满足
- 一个词预测主题的能力越强, 权重越大, 反之, 权重越小。在网页中看到 “原子能” 这个词, 或多或少能了解网页的主题。而看到 “应用”一词, 则对主题基本上还是一无所知。因此, “原子能”的权重就应该比“应用”大。
- 停止词的权重为零。
很容易发现, 如果一个关键词只在很少的网页中出现, 通过它就容易锁定搜索目标, 它的权重也就应该大。反之, 如果一个词在大量网页中出现,看到它仍然不很清楚要找什么内容, 它的权重就应该小。
5.2.3 IDF(Inverse Document Frequency:逆文本词频指数)
-
在信息检索中,使用最多的权重就是IDF。嘉定一个关键词 W W W在 D W D_W DW个网页中出现过,那么 D W D_W DW越大, W W W权重越小,反之亦然
I D F = log D D W IDF=\log {\frac{D}{D_W}} IDF=logDWD
其中D为所有网页数。 -
所谓IDF的概念为在一个特定条件下关键词的概率分布的交叉熵。
5.2.4 TF-IDF
-
TF-IDF 被公认为是信息检索中最重要的发明
T F − I D F = T F 1 ⋅ I D F 1 + T F 2 ⋅ I D F 2 + . . . + T F N ⋅ I D F N TF-IDF = TF_1\cdot IDF_1 + TF_2\cdot IDF_2 +...+TF_N\cdot IDF_N TF−IDF=TF1⋅IDF1+TF2⋅IDF2+...+TFN⋅IDFN -
如搜索“原子能的应用”,假设网页总字数1000字,“原子能”出现2次,“的”出现35次,“应用”出现5次,则TF为
T F 原子能 = 0.002 T F 的 = 0.035 T F 应用 = 0.005 \begin{aligned} &TF_{原子能}=0.002\\ &TF_{的}=0.035\\ &TF_{应用}=0.005\\ \end{aligned} TF原子能=0.002TF的=0.035TF应用=0.005假定中文网页数是 D = 10 D=10 D=10 亿, 停止词 “的”在所有的网页中都出现, 即 D w = 10 D_w=10 Dw=10 亿, 那么它的
I D F 的 = log ( 10 亿 / 10 亿 ) = log ( 1 ) = 0 IDF_{的}=\log (10 亿 / 10亿 )=\log (1)=0 IDF的=log(10亿/10亿)=log(1)=0
假如专用词 “原子能” 在 200 万个网页中出现, 即 D w = 200 D_w=200 Dw=200 万, 则它的权重
I D F 原子能 = log ( 500 ) = 8.96 I D F_{原子能}=\log (500)=8.96 IDF原子能=log(500)=8.96
又假定通用词 “应用”出现在五亿个网页中, 它的权重
I D F 应用 = log ( 2 ) = 1 I D F_{应用}=\log (2)=1 IDF应用=log(2)=1
, 则只有 1 。也就是说, 在网页中找到一个 “原子能” 的命中率 (Hits) 相当于找到九个 “应用” 的命中率。利用 IDF, 上述相关性计算的公式就由词频的加权求和
T F − I D F = T F 1 ⋅ I D F 1 + T F 2 ⋅ I D F 2 + . . . + T F N ⋅ I D F N = T F 原子能 ⋅ I D F 原子能 + T F 的 ⋅ I D F 的 + T F 应用 ⋅ I D F 应用 = 0.002 ⋅ 8.96 + 0.035 ⋅ 0 + 0.005 ⋅ 1 = 0.01798 + 0 + 0.005 = 0.02292 \begin{aligned} TF-IDF &= TF_1\cdot IDF_1 + TF_2\cdot IDF_2 +...+TF_N\cdot IDF_N\\ &=TF_{原子能}\cdot IDF_{原子能}+TF_{的}\cdot IDF_{的}+TF_{应用}\cdot IDF_{应用}\\ &=0.002 \cdot 8.96+0.035\cdot 0+0.005\cdot1\\ &=0.01798+0+0.005\\ &=0.02292 \end{aligned} TF−IDF=TF1⋅IDF1+TF2⋅IDF2+...+TFN⋅IDFN=TF原子能⋅IDF原子能+TF的⋅IDF的+TF应用⋅IDF应用=0.002⋅8.96+0.035⋅0+0.005⋅1=0.01798+0+0.005=0.02292
如果结合网页排名算法如PageRank,那么给定一个查询,有关网页的综合排名大致由相关性和网页排名的乘积决定。
5.2.5 TF-IDF的信息论依据
-
后续使用: w w w为关键词,N为整个语料库,D为中文网页数, D w D_w Dw为 w w w出现的网页/文献个数,
T F ( w ) = 关键词w出现次数 当前网页 / 文献总字数 TF(w)=\frac{\text{关键词w出现次数}}{当前网页/文献总字数} TF(w)=当前网页/文献总字数关键词w出现次数 -
一个查询中每一个关键词 w w w 的权重应该反映这个词对查询来讲提供了多少信息。一个简单的办法就是用每个词的信息量作为它的权重,
I ( w ) = − P ( w ) log P ( w ) = − T F ( w ) N log T F ( w ) N = T F ( w ) N log N T F ( w ) ∵ N 为常数 ∴ = T F ( w ) log N T F ( w ) \begin{aligned} I(w) & =-P(w) \log P(w) \\ & =-\frac{T F(w)}{N} \log \frac{T F(w)}{N}\\ &=\frac{T F(w)}{N} \log \frac{N}{T F(w)}\\ \because~~&N为常数\\ \therefore~~&=T F(w) \log \frac{N}{T F(w)}\\ \end{aligned} I(w)∵ ∴ =−P(w)logP(w)=−NTF(w)logNTF(w)=NTF(w)logTF(w)NN为常数=TF(w)logTF(w)N上述公式有一个缺陷:两个词出现的频率 TF 相同, 一个是某篇特定文章中的常见词, 而另外一个词是分散在多篇文章中, 那么显然第一个词有更高的分辨率, 它的权重应该更大。显然, 更好的权重公式应该反映出关键词的分辨率。
如果做一些理想的假设,
- 每个文献大小基本相同, 均为 M M M 个词, 即 M = N D = ∑ w T F ( w ) D M=\frac{N}{D}=\frac{\sum_w T F(w)}{D} M=DN=D∑wTF(w) 。
- 一个关键词在文献一旦出现, 不论次数多少, 贡献都等同, 这样一个词要么在一个文献中出现 c ( w ) = T F ( w ) D ( w ) c(w)=\frac{T F(w)}{D(w)} c(w)=D(w)TF(w) 次, 要么是零。注意, c ( w ) < M c(w)<M c(w)<M
∵ N = M D T F ( w ) = c ( w ) ⋅ D ( w ) ∴ I ( w ) = T F ( w ) log N T F ( w ) = T F ( w ) log M D c ( w ) D ( w ) = T F ( w ) log ( D D ( w ) M c ( w ) ) = T F ( w ) log ( D D ( w ) ) − T F ( w ) log ( M c ( w ) ) ∵ I D F = log D D W ∴ = T F ( w ) ⋅ I D F ( W ) − T F ( w ) log ( M c ( w ) ) \begin{aligned} \because~~&N=MD\\ &TF(w)=c(w)\cdot D(w)\\ \therefore~~ I(w)&=T F(w) \log \frac{N}{T F(w)}\\ & =TF(w) \log \frac{M D}{c(w) D(w)} \\ & =TF(w) \log \left(\frac{D}{D(w)} \frac{M}{c(w)}\right)\\ & =TF(w) \log \left(\frac{D}{D(w)}\right)-TF(w) \log \left(\frac{M}{c(w)}\right)\\ \because~~&IDF=\log {\frac{D}{D_W}}\\ \therefore~~& =TF(w)\cdot IDF(W)-TF(w) \log \left(\frac{M}{c(w)}\right) \end{aligned} ∵ ∴ I(w)∵ ∴ N=MDTF(w)=c(w)⋅D(w)=TF(w)logTF(w)N=TF(w)logc(w)D(w)MD=TF(w)log(D(w)Dc(w)M)=TF(w)log(D(w)D)−TF(w)log(c(w)M)IDF=logDWD=TF(w)⋅IDF(W)−TF(w)log(c(w)M)
这样, 我们看到 TF-IDF 和信息量之间的差异就是公式 中的第二项。因为 c ( w ) < M c(w)<M c(w)<M, 所以第二项大于零, 它是 c ( w ) c(w) c(w) 的递减函数。把上面的公式重写成
T F − I D F ( w ) = I ( w ) − T F ( w ) log M c ( w ) T F-I D F(w)=I(w)-T F(w) \log \frac{M}{c(w)} TF−IDF(w)=I(w)−TF(w)logc(w)M可以看到, 一个词的信息量 I ( w ) I(w) I(w) 越多, TF-IDF 值越大; 同时 w w w 命中的文献中 w w w 平均出现的次数越多, 第二项越小, TF-IDF 也越大。这些结论和信息论完全相符。
-
TF-IDF 是对搜索关键词的重要性的度量, 并且具备很强的理论根据。因此, 即使是对搜索不是很精通的人, 直接采用 TF-IDF, 效果也不会太差。现在各家搜索引擎对关键词重要性的度量, 都在 TF-IDF 的基础上做了一定的改进和微调。但是, 在原理上与 TF-IDF 相差不远。