集体智慧编程——搜索与排名

目录

1. 搜索引擎的组成

1.1 数据类

1.2 查询类


1. 搜索引擎的组成

  • 首先找到一种搜索文档的方法,可以是爬虫;
  • 其次,为文档建立索引,表中包含文档及不同单词的位置信息;
  • 通过查询返回一个经过排序的文档列表。

1.1 数据类

数据类包括以下内容:

# 数据类
class crawler:
    # 初始化并传入数据库名称
    def __init__(self,dbname):
        pass

    def __del__(self):
        pass

    def dbcommit(self):
        pass

    # 用于获取条目的id,如果条目不存在,将其加入到数据库中
    def get_entry_id(self,table,field,value,createnew=True):
        return None
    
    # 为每个网页建立索引
    def add_to_index(self,url,soup):
        print('Indexing %s' %url)
      
    # 从网页中提取文字
    def get_text_only(self,soup):
        return None

    # 根据任何非空白字符进行分词处理
    def separate_words(self,text):
        return None

    # 判断url是否已经建立过索引
    def is_indexed(self,url):
        return False

    # 添加关联两个网页的链接
    def add_link_ref(self,url_from,url_to,link_text):
        pass

    # 广度搜索优先爬虫
    def crawl(self,pages,depth=2):
        pass

    # 创建数据库表
    def create_index_tables(self):
        pass

类主要实现的功能逻辑为:

  1. 建立数据库表:
    1. urllist表:保存已经索引过的url列表;
    2. wordlist表:保存所有分词得到的单词列表;
    3. wordlocation表:保存的单词在文档中所处位置;
    4. link表:保存两个urlId指明两者的链接关系;
    5. linkwords表:利用字段wordid和linkid记录单词与链接时间关系(比如说链接文本和链接的关系);
    6. 建立Schema,加快查询速度
  2. 爬虫:
    1. 广度优先爬虫,深度为2;
    2. 调用add_to_index()方法给每个url地址建立索引;
    3. 调用get_text_only()方法提取网页内容;
    4. 调用add_link_ref()方法添加两网页的指向关系
  3. 建立索引:
    1. 基于内容进行分词;
    2. 词干提取法(indexing提取为index);
    3. 加入索引,建立单词与url的关系。

1.2 查询类

查询类包含以下内容:

class searcher:
    # 连接数据库
    def __init__(self,dbname):
        self.con = sqlite.connect(dbname)

    # 关闭数据库
    def __del__(self):
        self.con.close()

    # 为列表中的每个单词建立一个指向wordlocation表的引用,
    # 并根据对应的urlid将它们连接起来进行联合查询
    # 如查询两个单词ID为10和17,则返回(1,327,23)(1,327,162)(1,333,23)
    # 返回的意思为,urlid为1的327位置和23位置分别含有单词id为10和17的两个单词
    # 返回的list根据单词位置进行组合
    def get_match_rows(self,q):
        return rows,wordids

    # 评价函数,返回得分
    def get_scored_list(self,rows,words):
        return total_scores

    # 归一化处理,因为评价函数有些是大的好,有些小的好,归一化保证相同的值域和变化方向
    def nomalize_scores(self,scores,small_is_better=0):
        return dict

    ## 评价函数,基于单词频度
    def frequency_score(self,rows):
        return self.nomalize_scores

    ## 评价函数,基于单词在文档中的位置
    def location_score(self,rows):
        return self.nomalize_scores

    ## 评价函数,基于单词距离
    def distance_score(self,rows):
        return self.nomalize_scores

    ## 评价函数 利用外部回指链接 基于简单技术
    def inbound_link_score(self,rows):
        return self.nomalize_scores

    # 计算pagerank值
    def calculate_pagerank(self,iterations):
        pass

    ## 评价函数 基于pagerank值
    def pagerank_score(self,rows):
        return self.nomalize_scores

    ## 评价函数 基于链接文本
    def link_text_score(self,rows,wordids):
        return self.nomalize_scores

查询类主要实现的功能逻辑为:

  1. 开关数据库;
  2. 基于查询字符串进行分词,并返回查询的urlid和单词位置信息;
  3. 建立评分体系,评价方法分为基于网页内容的排名和基于外部回指链接的排名,具体方法有:
    1. 基于单词频度:出现的次数越多分数越高;
    2. 基于单词在文档中的位置:位置越靠前,分数越高,主题往往在文档开始处;
    3. 基于单词距离:查询条件多个单词往往靠的很近;
    4. 基于外部回指链接的简单计数:外部指向的链接越多,分数越高,需配置前三种的任意一种使用,否则只会简单返回匹配搜索条件的所有网页;
    5. 基于PageRank算法:网页的重要性依据指向该网页的所有其他网页的重要性;
    6. 利用链接文本:链接文本往往会更有价值,开发者会倾向于提供一些解释其内容的简单描述;
    7. 利用神经网络:利用神经网络判断返回的url的重要性

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值