自己动手实现主题搜索引擎

时间:2024-05-31 20:03:20

1.前言:

   软件设计要写大作业了,好慌啊,写什么好呢,室友居然把Everything实验了,那我也写一个与搜索有关的玩玩吧。突然想到大一时候自学过利用whoosh和solr写过简单的搜索引擎,那么今天就自己动手试一试吧。

2.简介

  本项目主要实现了一个主题搜索引擎。主题搜索引擎是针对某一个领域的专业搜索引擎,是搜索引擎的细分和延伸,是对网页库中的某类专门的信息进行一次整合,定向分字段抽取出需要的数据进行处理后再以某种形式返回给用户。主题搜索是相对通用搜索引擎的信息量大、查询不准确、深度不够等提出来的新的搜索引擎服务模式,通过针对某一特定领域、某一特定人群或某一特定需求提供的有一定价值的信息和相关服务。其特点就是“专、精、深”,且具有行业色彩,相比较通用搜索引擎的海量信息无序化,主题搜索引擎则显得更加专注、具体和深入。

3.系统分析

  本系统主要包括主题领域数据库的建立以及根据倒排索引和TF_IDF算法得到用户查询结果两大模块。 
其中数据库的建立是针对特定主题领域,设计启发式爬虫,利用网络爬虫采集数据。本项目的启发式爬虫采用的是快速模拟退火算法;用户查询部分用到了TF_IDF算法以及字典树等数据结构。整体系统设计图如图所示。 
自己动手实现主题搜索引擎

4.系统设计

4.1启发式爬虫

4.1.1主题爬虫的体系结构

  爬虫体系结构如下图所示: 
自己动手实现主题搜索引擎

4.1.2页面主题相关性判断
  1. 预处理阶段:构建主题关键词词库和停用词词库,本项目采用的关键词词库是从qq输入法官方网站下载的与足球有关的关键词词库,停用词是从也是从网络资源中找的。
  2. 对提取的链接text和title进行分词,去掉停用词。
  3. 计算关键词在词库中出现频率以及分词结果计算出每个URL的相关性得分。
  4. 根据得分值与阈值的比较结果,处理相应URL,大于阈值,放入URL队列,小于阈值,丢弃。 
    注:计算的页面相关性得分时用到字典树结构,根据字典树结构可以统计词频。
4.1.3搜索策略的选择
  1. 启发式算法简介: 
      传统的网络爬虫在搜索遍历网页的时候采用的是盲目无信息的遍历算法,即对所获得的链接进行遍历(如广度优先、深度优先搜索等),抽取信息存到数据库供搜索调用。但是会因为遍历大量无关链接导致系统负担过大,而采用启发式爬虫可以减少遍历的链接数量,减少无关链接的访问,从而提高系统效率。 
    常见的启发式搜索算法有A*算法、爬山法、模拟退火算法。 
      A*算法是一种基于有限空间的启发式搜索算法,而网络空间是一个无限的状态空间,因此不能直接用A*算法搜索网页。 
      爬山法不会前瞻与当前状态不直接相邻的那些状态的值,只是选择邻居状态中最好的一个,而事先不考虑下一步走的方向,所以爬山法只能近似地反映信息资源在未搜索空间边缘附近而不是其内部情况。 
    模拟退火算法的核心在于搜索最优解的过程中,除了可以接受有化解之外,还有一个随机接受准则有限度的接受恶化解,并且接受恶化解概率几乎为0,因此模拟退火算法有可能从局部最优解中跳出,找到全局最优解。
  2. 模拟退火算法分析 
      模拟退火算法的思想来源于物理退火过程,最早针对组合优化问题提出。模拟退火算法的执行策略如下步骤构成:从任意一个解开始探测整个空间,并且扰动该解产生一个新解,按照Metropolis准则判断是否接受新解,相应下降控制温度,模拟退火算法流程图如图所示: 
    自己动手实现主题搜索引擎

4.2搜索部分

4.2.1建立倒排索引
  1. 单词文档矩阵

  单词-文档矩阵是表达两者之间所具有的一种包含关系的概念模型,x下图展示了其含义。图的每列代表一个文档,每行代表一个单词,打对勾的位置代表包含关系。 
自己动手实现主题搜索引擎 
从纵向即文档这个维度来看,每列代表文档包含了哪些单词,比如文档1包含了词汇1和词汇4,而不包含其它单词。从横向即单词这个维度来看,每行代表了哪些文档包含了某个单词。比如对于词汇1来说,文档1和文档4中出现过单词1,而其它文档不包含词汇1。 
  搜索引擎的索引其实就是实现“单词-文档矩阵”的具体数据结构,我们采用倒排索引的方式存储单词-文档映射关系。 
2. 倒排索引 
  倒排索引是实现“单词-文档矩阵”的一种具体存储形式,通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。倒排索引主要由两个部分组成:“单词词典”和“倒排文件”。 
3. 单词词典 
  搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。 
4. 倒排列表 
   倒排列表记载了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。 
5. 倒排文件 
  所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件即被称之为倒排文件,倒排文件是存储倒排索引的物理文件,为本项目为了便于开发,将倒排文件放入了内存。 
上图所示的单词-文档矩阵转化为倒排索引则如下图所示: 
自己动手实现主题搜索引擎 
建立对应文档集的倒排索引的算法一般如下:对所有文档进行分词,建立单词词典,对所有单词建立倒排表。

4.2.2搜索程序的设计
  1. 对用户输入进行分词处理,去掉停用词
  2. 到单词词典查询分词之后得到的每一个关键词,得到相应的文章ID
  3. 利用TF_IDF算法计算每个关键词的得分
  4. 计算每份文档的得分,并排序,得到相应排名结果

5.系统实现及测试

5.1结果

  结果如图所示,其中Web site url 可以是任意的,是爬虫的抓取站点: 
自己动手实现主题搜索引擎

5.2不足之处

  1. 根据数据库建立的词典文件和倒排索引表没有保存到本地,而是每次运行重新建立,因此第一次查询时间效率不够高
  2. 退火算法的参数设置测试不够多,应该有更多的测试,得到更加理想的效果
  3. 领域词库不够大,数据量偏少
  4. 没有做去重处理

源码下载地址:http://download.****.net/detail/wbcg111/9535759