集体智慧编程-第四章 搜索与查询

 学习目标:
 1.检索网页
 2.建立索引
 3.对网页进行搜索
 4.以多种不同方式对搜索的结果进行排名

搜索引擎的组成

建立搜索引擎的首要步骤是找到一种搜集文档的方法,之后需要为这些文档建立索引。

通常要建立一张大表,表中包含了文档及所有不同的单词的位置信息。文档本身不需要保存在数据库中,索引信息只需简单的保存一个指向文档所在的位置的引用即可,最后一步是通过查询返回一个经过排序的文档列表。

 此处的奥妙是对结果的排列方式

下面将介绍几种基于网页内容的度量方法,比如单词频度,然后再介绍几种基于网页外部信息的度量方法,如PageRank算法,PageRank方法会考察其他网页对当前网页的引用情况

在最后,将建立一个神经网络,用以对查询结果进行排名。通过了解人们在得到搜索结果以后都点击了哪些链接,神经网络会将搜索结果和过程关联起来。它会利用这一信息来改变搜索结果的排列顺序,以更好地反映人们过去的点击情况。

 

     

接下来会创建两个类,一个用于检索网页和创建数据库,另一个通过查询数据库进行全文
搜索。

import urllib.request as url
from bs4 import BeautifulSoup
#    from urlparse import urljoin  
# thon3中将urlparse并入urllib             

#构造一个单词列表,这些单词将被忽略
ignorewords=['the','of','to','and','a','in','is','it']

 

 

 

import urllib.request as url


class crawler:
    #初始化crawler类并传入数据库名称
    def __init__(self,dbname):
        pass
    
    def __del__(self):
        pass
    def dbcommit(self):
        pass
    #辅助函数,用于获取条目的id,并且如果条目不存在,就将其加入数据库中
    def getentryid(self,table,field,value,createnew=True):
        return None
    
    #为每个网页建立索引
    def addtoindex(self,url,soup):
        print('Indexing %s' % url)
        
    #从一个HTML网页中提取文字(不带标签的)
    def getnextonly(self,soup):
        return None
    #根据任何非空白字符进行分词处理
    def seperatewords(self,text):
        return None
    #r如果url已经建过索引,则返回true
    def isindexed(self,url):
        return False
    
    #添加一个关联两个王爷的链接
    def addlinkref(self,urlFrom,urlTo,linkText):
        pass
    
    #从一小组网页开始进行广度优先搜索,直至某一给定深度
    #期间为网页建立索引
    def crawl(self,pages,depth=2):
        for i in range(depth):
            newpages=set()
            for page in pages:
                try:
                    c=url.urlopen(page)
                    print(c)
                except:
                    print("Cloud not open %s" % page)
                    continue
                soup=BeautifulSoup(c.read())
                self.addtoindex(page,soup)
                
                links=soup('a')
                for link in links:
                    if('href' in dict(link,attrs)):
                        url=urljoin(page,link['href'])
                        if url.find("'") !=-1:continue
                        url=url.split('#')[0] #去掉位置部分
                        if url[0:4]=='http' and not self.isindexed(url):
                            newpages.add(url)
                        linkText=self.gettextonly(link)
                        self.addlinkref(page,url,linkText)
                
                self.dbcommit()
            pages=newpages
        
    
    #创建数据库表
    def createindextables(self):
        pass

 

posted @ 2020-08-30 01:23  求进步的娃  阅读(202)  评论(0编辑  收藏  举报