


搜索技术入门到精通
PR算法的复杂度规模是log(n),n是网页的数量。网页权值在算法执行过程中是一个振荡收敛的过程,这其中有两个主要矛盾:1.节点的数量巨大,内存成为瓶颈之一。2.巨大的2维矩阵每次计算消耗时间巨大,时间效率上也是瓶颈;其中大部分网页的权值比较低,而且都是浮点数计算。
改进思路一:迭代计算的次数和矩阵的规模(链接的个数)有一定的比例关系,例如
改进思路二:分而治之,对一个独立域名下的网页权值独立计算。比如http://www.zju.edu.cn下的子域名在爬虫抓取数据的过程中独立地计算相对网页权值,记作PR-R。然后再以域名为单位,做全局域名之间的权值计算,得出域名对应的权值PR-T。所以,最后域名下各个页面的权值等于PR-R×PR-T。
改进思路三:采用加速收敛的方法。每次迭代都会得到一个n维偏移向量p,但是取偏移为pk(k>1)作为此次迭代的偏移向量。
改进思路四:减少计算量。对大量的权值低于一定限值的网页,计算过程中忽略其链接产生的权值分配。
域名中以gov,edu,org结尾的网站应该具有较高的网页权值。Gov是政府网站后缀,edu是教育机构,org指非盈利的组织。
搜索引擎的基本设计思路是若干个结果去覆盖相应用户需求,其中可能有大量不相关的内容存在,如果使得比较优质的结果保留下来,并且能使得后面使用的用户能方便地搜索到?点击率成了重要的判断数据。因此,上一节中提到的得分公式变为Score(A) = PageRank(A) × β + ∑M’ * i * j + CTR。这样一来,保证了优质的结果能长期占据搜索结果第一页的位置。
其中,CTR的数据来源由两部分组成:
1) 搜索列表页面中的点击记录。
2) Toolbar(Google)跟踪到的用户访问网页的频率,以及这些目标网页中链接的点击记录。
如果同一个网站多个页面都占据了第一页的结果,会造成搜索结果的不公正,需要对同一个网站的其他页面乘以一个衰减系数,调整第一页排名网站的构成。
对于排名优化的作弊网站,需要跟踪其在搜索引擎中得到流量的表现情况。如果作弊程度严重的,给予一定惩罚。
对索引网页信息的预处理包括网页分析和倒排文件索引两个部分,中文自动分次是网页分析的前提。文档由被称作特征项的索引词组成,网页分析是将一个文档表示 为特征项的过程。在提取特征项时,中文又面临了与英文处理不同的问题。中文信息和英文信息有一个明显的差别:英语单词之间用空格分隔;而在中文文本中,词 与词之间没有天然的分隔符,中文词汇大多是由两个或两个以上的汉字组成的,并且语句是连续书写的。这就要求在对中文文本进行自动分析前,先将整句切割成小 的词汇单元,即中文分词(或中文切词)。
用具体例子来说明,就是如何把“我的笔记本”这样连续书写的语句切分为“我”,“的”和“笔记本”三个词汇单元。 在检索和文档分类系统中,自动切词系统的速度影响整个系统的效率。中文信息的检索主要有两种:基于字的检索和基于词的检索。基于单字的检索系统建立单字索 引。在检索时得到每个单字的索引,而后加以适当的逻辑运算,得到检索结果。而基于词汇的检索系统对词汇建立索引,检索词汇时一次命中。
1、算法介绍
自动分词的基本方法有:基于字符串匹配的分词方法和基于统计的分词方法。
基于字符串匹配的分词方法
这种方法又称为机械分词方法,它是按照一定的策略将待分析的汉字串与一个充分大的词典中的词条进行匹配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。按照扫描方长度优先匹配的情况,可以分为最大或最长匹配,和最小或最短匹配;按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。常用的几种机械分词方法如下:
1) 正向最大匹配;
2) 逆向最大匹配;
3) 最少切分(使每一句中切分出来的词数最小)
还可将上述各种方法相互组合,例如,可以将正向最大匹配方法和你想最大匹配方法结合起来构成双向匹配法。由于汉语单字成词的特点,正向最小匹配和逆向最小匹配一般很少使用。一般说来,逆向匹配的切分精度略高于正向匹配,遇到的歧义现象也较少。统计结果表明,单纯使用正向最大匹配的错误率为1/169,单纯使用逆向最大匹配的错误率为1/245(这可能是因为汉语的中心语靠后的特点)。对于机械分词方法,可以建立一个一般的模型,形式地表示为ASM(d,a,m),即Automatic Segmentation Model,其中,
d:匹配方向,+表示正向,-表示逆向;
a:每次匹配失败后增加或减少字串长度(
m:最大或最小匹配标志,+为最大匹配,-为最小匹配。
例如,ASM(+, -, +)就是正向减字最大匹配法(Maximum Match based approach, MM),ASM(-, -, +)就是逆向减字最大匹配法(简记为RMM方法),等等。对于现代汉语来说,只有m=+是实用的方法。
2、基于统计的分词方法
从形式上看,词是稳定的字的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。因此字与字相邻共现的频率或概率能够较好的反映成词的可信度。可以对语料中相邻共现的各个字的组合的频度进行统计,计算它们的互现信息。计算汉字X和Y的互现信息公式为:
其中P(X, Y)是汉字X、Y的相邻共现概率,P(X)、P(Y)分别是X、Y在语聊中出现的概率。互现信息体现了汉字之间结合关系的紧密程度。当紧密程度高于某一个阈值时,便可认为此字组可能构成了一个词。这种方法只需对语料中的字组频度进行统计,不需要切分词典,因而又叫做无词典分词法或统计取词方法。但这种方法也有一定的局限性,会经常抽出一些共现频度高、但并不是词的常用字组,例如“这一”、“之一”、“有的”、“我的”、“许多的”等,并且对常用词的识别精度差,时空开销大。实际应用的统计分词系统都要使用一部基本的分词词典(常用词词典)进行串匹配分词,同时使用统计方法识别一些新的词,即将串频统计和串匹配结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。 词汇切分算法最重要的指标是准确,在兼顾准确性的情况下也要考虑时间复杂性。下面具体介绍正向减字最大匹配法。
2、正向减字最大匹配法
正向减字最大匹配法切分的过程是从自然语言的中文语句中提取出设定的长短字串,与词典比较,如果在辞典中,就算一个有意义的词串,并用分隔符分隔输出,否则缩短字串,在词典中重新查找(辞典是预先定义好的)。
算法要求为:
输入:中文词典,待切分的文本d,d中有若干被标点符号分割的句子s1,设定的最大词长MaxLen。
输出:每个句子sl被切为若干长度不超过MaxLen的字符串,并用分隔符分开,记为s2,所有s2的连接构成d切分之后的文本。
算法思想:事先将网页预处理成每行是一个句子的纯文本格式。从d中逐句提取,对于每个句子s1从左向右以MaxLen为界选出候选字串w,如果w在词典中,处理下一个长为MaxLen的候选字段:否则,将w最邮编一个字去掉,继续与辞典比较:s1切分完之后,构成词的字符串或者此时w已经为单字,用分隔符隔开输出给s2。从s1中减去w,继续处理后续的字串。s1处理结束。
设文本含有句子的书目为m,句子的平均长度为k,辞典的条目为n。实际中m和k远远小于n,整个算法复杂度中起决定作用的步骤在于n相关的语句。因此算法的时间复杂度为O(mklogn)。
出现关键词频度初始得分表
同一位置频度 | 1 | 2-3 | 4-7 | 8 | 9 | >10 |
得分m | 2 | 4 | 8 | 8 | 3 | 1 |
出现的位置初始得分表
位置 | 标题 | 段首 | 段尾 | 其余正文 | URL | 其他 |
得分比i | 0.9 | 0.6 | 0.6 | 0.3 | 0.4 | 0.2 |
网页更新频度得分表
距查询的时间 | 一天 | 一天至三天 | 三天以后 |
得分比j | 1.1 | 1.0 | 0.9 |
容易得出网页A的得分简单的计算公式
Score(A) = PageRank × β + ∑m × i × j
其中β是衰减系数,降低PageRank对最后排名的影响。
但是这么做有一个明显的缺陷,一个内容比较长的网页比一个内容比较短的网页在排序过程中有绝对的优势,即m的取值不够恰当,并且实际中并非重复出现的关键词就意味着高的相关度。那么如果做呢?我们需要根据网页的长度,对关键词的次数进行归一化, 也就是用关键词的次数除以网页的总字数。我们把这个商称为“关键词的频率”,或者“单文本词汇频率”(Term Frequency),比如,在某个一共有一千词的网页中keyword_1和keyword_2分别出现了12次和5次,那么它们的词频就分别是 0.012和 0.005。 我们将这两个个数相加,其和 0.017 就是相应网页和查询keyword_1和keyword_2相关性的一个简单的度量。概括地讲,如果一个查询包含关键词 w1,w2,...,wN, 它们在一篇特定网页中的词频分别是: TF1, TF2, ..., TFN。 (TF: term frequency)。 那么,这个查询和该网页的相关性M就是:TF1 + TF2 + ... + TFN。于是,得分规则变为Score(A) = PageRank × β + ∑M × i × j。
现在看来的得分公式还是有一个比较大的缺陷,直觉告诉我们相关性实质上是文章主题的相关性体现,从关键词的词频为主要入口还是有欠考虑到同时出现这些关键词之间的文章怎么突出他们之间的得分差异。如果一个关键词只在很少的网页中出现,通过它就容易限定搜索目标,它的权重也就应该大。反之如果一个词在大量网页中出现,我们看到它仍然不很清楚要找什么内容,因此它的权重应该小。概括地讲,假定一个关键词 w 在 Dw 个网页中出现过,那么 Dw 越大,w 产生的相关性权重越小,反之亦然。在信息检索中,使用最多的权重是“逆文本频率指数” (Inverse document frequency 缩写为IDF),它的公式为log(D/Dw)其中D是全部网页数。于是上述相关性计算个公式就由词频的简单求和变成了加权求和,即M’ = TF1*IDF1 + TF2*IDF2 +... + TFN*IDFN。因此,得分计算公式改进为:Score(A) = PageRank × β +∑M’ × i × j。
互联网发展早期的搜索引擎,对web页面的排序,是根据搜索的词组(短语)在页面中的出现次数,并用页面长度和html标签的重要性提示等进行权重修订。链接流行度技术通过其它文档链接到当前页面链入数量来决定当前页的重要性,这样可以有效地抵制被人为加工的页面欺骗搜索引擎的手法。PageRank计算页面的重要性,对每个链入赋以不同的权值,链接提供页面的越重要则此链接入越高。当前页的重要性,是由其它页面的重要性决定的。一个网页的重要性是一种内在的主观事情,这取决于读者兴趣,知识和态度. 但仍有许多可说是客观的相对重要性的网页. 简单地介绍如何给网页评级,有效衡量人们对网页的兴趣和重视程度。
PageRank的数学定义:
PR(A) = (1-d) + d (PR(T1)/C(T1) + ... + PR(Tn)/C(Tn))
其中:PR(A):页面A的网页级别,
PR(Ti):页面Ti的网页级别,页面Ti链向页面A,
C(Ti):页面Ti链出的链接数量,
d:阻尼系数,取值在0.85-0.95之间,一般取值为0.85,此因素直接影响迭代计算PageRank过程中的收敛速度
由此可见,1)这个算法不以站点排序,页面网页级别由一个个独立的页面决定;2)页面的网页级别由链向它的页面的网页级别决定,但每个链入页面的贡献的值 是不同的。如果Ti页面中链出越多,它对当前页面A的贡献就越小。A的链入页面越多,其网页级别也越高;3)阻尼系数的使用,减少了其它页面对当前页面A 的排序贡献。
公式的来历:Google公司的创始人Lawrence Page 和 Sergey Brin 提出了用户行为的随机冲浪模型,来解释上述算法。他们把用户点击链接的行为,视为一种不关心内容的随机行为。而用户点击页面内的链接的概率,完全由页面上 链接数量的多少决定的,这也是上面PR(Ti)/C(Ti)的原因。一个页面通过随机冲浪到达的概率就是链入它的别的页面上的链接的被点击概率的和。阻尼 系数d的引入,是因为用户不可能无限的点击链接,常常因劳累而随机跳入另一个页面。d可以视为用户无限点击下去的概率,(1-d)则就是页面本身所具有的 网页级别。PageRank的计算是封闭流通模型,所有页面的网页级别之和等于网页初始级别的和。
容易从PageRank的数学定义得出一个恒等表达式:
p = A p
其中p表示网页级别向量,A是链接矩阵。
求网页等级的问题转化为求A的特征向量,于是可以用迭代的方法求出。
给定任意一个初始向量S,不妨设为A,PageRank的计算可以如下
R0 = S
Ri+1 = A Ri
d = ||Ri||1 - ||Ri+1||1
Ri+1 = Ri+1 + dE
δ = ||Ri+1 - Ri||1
while δ > ε
参数d表示迭代的收敛速度,一般取值为0.85。因为链接矩阵巨大,所以改进该算法的瓶颈在于无法用空间换取效率的做法,只有在精度和效率之间作折衷。
用户输入查询关键词的时候需要对结果集作排序,如何排序这些网页使得最佳的结果呈现在前二十条结果中呢?主要因素有网页等级,关键词位置、关键词出现频率,用户点击日志等。
Trie是效率最高的索引形式,下图表示由文本到的前缀树的创建过程。
插入操作的时间复杂度O(l),其中l = max(length of word);
删除操作的复杂度为O(n),其中n = length of dictionary
Trie有消耗了大量内存且难以分块的缺点,同时伴随着I/O和瓶颈,一般来说用分块的倒排索引来解决内存不足问题,最后对分块的索引块做一次归并。倒排索引一般分成两个文件来存储,其中一个称为位置文件,纪录了词出现的文档和位置信息;另外一个是词典文件,纪录索引文本出现过的词,按照字符的顺序来存储。其中每个词有个指针,表示对应了第一个文件中的那个纪录。这样的结构保证了检索的时候词典能被保存在内存中,进一步的意义在于,检索词出现在哪些文档中以及位置能被迅速地找到。用一个例子来说明,有个这样的句子该怎么索引?
Tom lives in
分析过后剩下为
tom live guangzhou I live guangzhou
从词的角度出发一共有五个词,可以得出这样的一张词表
name | position | frequency |
tom | 1 | 1 |
live | 5,22 | 2 |
10,27 | 2 | |
i | 20 | 1 |
文本的内容经过分析之后抽取出的内容见上表,即索引文件的内容,可以加对表的内容压缩存储优化,通常只对位置字段做差分压缩,最后将内容按照存储格式存储起来。
归并两个索引需要归并排序词典文件和合并位置文件:如果词典中的词不相同,连接相应的位置文件内容;如果词相同,连接相应位置条目的内容。一次归并操作的时间复杂度为O(n1 + n2),其中n1和n2分别为索引词典的长度。索引器的效率一般在4Mb/min到1Gb/min之间,其中20%-30%的时间在做归并操作。对于归并操作没有很好的理论精确地得出最优的归并方式,本人采用词典长度接近的优先归并的方式,类似哈夫曼编码规则的顺序来归并,并取得了约10%的性能升。