集体智慧编程-第四章 搜索与查询
学习目标:
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