目录
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
类主要实现的功能逻辑为:
- 建立数据库表:
- urllist表:保存已经索引过的url列表;
- wordlist表:保存所有分词得到的单词列表;
- wordlocation表:保存的单词在文档中所处位置;
- link表:保存两个urlId指明两者的链接关系;
- linkwords表:利用字段wordid和linkid记录单词与链接时间关系(比如说链接文本和链接的关系);
- 建立Schema,加快查询速度
- 爬虫:
- 广度优先爬虫,深度为2;
- 调用add_to_index()方法给每个url地址建立索引;
- 调用get_text_only()方法提取网页内容;
- 调用add_link_ref()方法添加两网页的指向关系
- 建立索引:
- 基于内容进行分词;
- 词干提取法(indexing提取为index);
- 加入索引,建立单词与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
查询类主要实现的功能逻辑为:
- 开关数据库;
- 基于查询字符串进行分词,并返回查询的urlid和单词位置信息;
- 建立评分体系,评价方法分为基于网页内容的排名和基于外部回指链接的排名,具体方法有:
- 基于单词频度:出现的次数越多分数越高;
- 基于单词在文档中的位置:位置越靠前,分数越高,主题往往在文档开始处;
- 基于单词距离:查询条件多个单词往往靠的很近;
- 基于外部回指链接的简单计数:外部指向的链接越多,分数越高,需配置前三种的任意一种使用,否则只会简单返回匹配搜索条件的所有网页;
- 基于PageRank算法:网页的重要性依据指向该网页的所有其他网页的重要性;
- 利用链接文本:链接文本往往会更有价值,开发者会倾向于提供一些解释其内容的简单描述;
- 利用神经网络:利用神经网络判断返回的url的重要性