今天从头到尾的把吴军研究员写的数学之美系列又阅读了一遍。打算从程序员的角度,把与搜索引擎相关的内容整理一下。
要做一个搜索引擎,首先就得把尽量多的网页下载回来。而为了能获得尽量多的网页,就需要对互联网进行一个遍历?这里面用到的就是图论的内容,遍历可以分为两种深度优先或广度优先。当然在遍历过程中需要标记哪个页面已经访问过,而哪些尚未被访问,这里可以使用哈希表进行标记,但由于网址的长度比较大,所以,为了节省空间,我们可以为每个网址产生一个唯一的信息指纹。
当我们获取了网页以后,要进行的第二个工作就是对他进行索引,而为了索引,则必须首先对其进行分词,也就是把句子转化为词语,这里需要用到统计语言模型。分好词以后,我们就可以真正的进行索引操作,这里使用的就是布尔代数,对于每一个关键词,我们都有一个二进制数,该二进制数的每一位就对应到一篇文章,如果该文章包含了该关键词,那么该文章对应的位就标记为1,否则标记为0。
在索引时,我们还需要计算每个页面的PageRank,从而决定在查询时,应该把那些页面放到前面。
完成了索引的工作以后,我们的数据库就基本建成了,接下来的工作就是等待用户进行查询。
由于词语一般都具有多义性,所以,在查询时,我们首先需要判断用户到底是想要词的哪个意思。如果用户的查询词语不止一个,那么我们就可以利用互信息,来判断用户的查询意图,提高查询的准确性。通过之前建立的索引,我们可以很容易的找到包含这些关键词的页面都有哪些。
在得到这些页面以后,返回用户以前,我们还需要对结果进行排序。这里我们一方面需要参考页面的PageRank值,另一方面还需要考虑关键词的TF/IDF(词频-反向文档频率)值。