
搜索引擎的原理和分析指标
(1)搜索引擎的工作方式
搜索引擎的工作原理可以大致分为:
收集信息: 搜索引擎的一部分可以自动收集信息.
组织信息: 搜索引擎通过创建索引向其抓取的信息添加规则.
接受查询: 用户向搜索引擎输入关键字以提交查询,系统接受用户查询,并在排序后返回查询结果. 搜索引擎根据每个用户的不同关键字检查索引,快速找到用户所需的信息,并将其返回给用户. 当前,搜索查询结果主要作为包含某些摘要信息的网页链接给出. 这样,用户可以使用上面的链接访问包含所需信息的网站和网页. 在正常情况下,搜索引擎会在这些链接下提供一些摘要信息,从而可以帮助用户确定此链接是否包含所需的内容.
(2)搜索引擎评估和分析指标
在传统评估系统中,衡量搜索引擎的基本指标是召回率和精确度. 这两个标准已被广泛认为是主要标准. 准确率是搜索到的文档数与所有文档数之比;召回率是搜索到的相关文档数与实际相关文档数之比.
相关性-专门人员评估每个搜索引擎的前几个结果,评估标准是否为正相关等. 著名的指标包括DCG.
速度-用户输入搜索词并获取搜索结果的时间. 这是李开复先生提出的评估体系. 经验告诉我们搜索引擎原理与实践 pdf,0.2秒的速度会导致用户满意度下降,并减少将来重复使用的机会.
索引比例搜索引擎将了解该引擎自己的比例. 通过了解搜寻器搜寻到的网页(不包括重复项),我们通常不知道其他搜索引擎的规模,因此我们可以比较两方搜寻的结果,知道有多少个唯一网页可以推断出索引搜索引擎的大小.
新鲜度-搜索结果的及时性不仅限于新闻内容. 促销信息等其他信息也与及时性密切相关.
稳定性-称为搜索服务的系统的稳定性也是所有系统的主要标准.
(3)搜索引擎的组成和结构
通常,全文(文本)搜索引擎可分为三个模块,即搜寻器搜索和信息处理部分,索引处理部分和检索服务部分(用户查询部分):
搜寻器搜索部分主要通过Internet上的各种搜索策略来收集信息.
索引处理部分是了解搜寻器搜索部分捕获的信息,从中提取索引内容,生成文档库的索引表,并同时添加摘要.
检索服务部分是根据用户查询在索引中快速检索文档,评估相关性,对输出结果进行排序,并根据用户查询需求提供合理的反馈信息.
(1)Web爬网程序设计
网络爬虫可以理解为简单的浏览器机器人.
爬网程序可以自动爬网网页信息,根据某些策略收集网页,并判断它们是否与关键字相关. 这是整个系统的核心. Web搜寻器的类型很多,具体取决于搜寻策略. 最原始的是传统的爬行动物. 它也是最经典的,为传统的爬虫提供了一个或多个网页链接地址. 在搜寻过程中,搜寻器将不断添加新链接以获得下一个网页上的URL. 从理论上讲,搜寻器甚至可以搜寻整个Internet. 除非我们设置某些边界条件.

(1)基于Java网络编程设计爬虫;
(2)通过IO操作等,删除与要爬网的URL列表相对应的URL的网页代码;
(3)提取网页信息. 此设计使用传统的爬虫. 在这里,我们必须解释聚焦爬虫与传统爬虫之间的主要区别. 有针对性的爬虫可以设计匹配算法来确定网页是否与所需主题相关,并避免不必要的爬虫;

(4)根据某种搜索策略(例如深度搜索),设计从第一个链接开始,然后依次访问页面上的所有链接. 访问完成后,您可以设置递归算法以访问下一层,直到达到设置搜索策略为止.
(2)从网页中提取有效信息
从HTML页面提取内容时面临的主要问题是,我们必须找到一种方法来准确识别所需内容的一部分.
以下是一种使用正则表达式匹配并从网页中提取特定信息的方法:
正则匹配网页中所有URL链接:
<a[^>]*?>[\s\S]*?</a>
获取图片:
<img[^>]*?/?>
<div[^>]*?id="idname"[^>]*?>[\s\S]*?</div>
(3)收集信息的分词
Lucene带有多个标记器StandardAnalyzer,CJKAnalyzer和MMAnalyzer(非常简单的中文标记器).
MMAnalyzer当前被广泛使用,尤其是早期版本的Lucene. 这次设计的系统中,应用的分词组件是极其容易的中文分词组件.
对分词算法的设计和理解需要对数学和计算机科学有深入的了解. 这里没有做任何研究,只是简单地了解了常见的分词算法.
现有的中文分词算法可以分为三类,这里我们主要研究基于字符串匹配的分词方法.
基于字符串匹配的分词最容易理解. 它的实现非常简单,但是被广泛使用. 我们也可以称其为机械分词. 机械分词算法经过一系列步骤,例如,根据某种策略,通过建立字典,类似于我们搜索字典的行为. 您可以将要分析的字符串与机器词典中足够大的条目进行匹配. 找到某个字符串后,将成功输出匹配项. 我们可以理解它与合适的关键字匹配.
例如,搜索“暨南大学好与坏”,返回的结果将包含很多单词,例如“暨南大学”,“济南”,“大学”等. “大学”作为一个不可分割的词来索引记录并返回最终结果.
(1)实施索引技术和搜索
倒排索引不能通过特定记录来确定属性值. 与通常的理解相反,确定记录的属性值称为倒排索引(inverted index). 反向文件是利用反向索引的文件.
建立反向索引是搜索引擎的关键步骤. 倒排索引通常用关键字表示,其后是频率(出现次数),位置(它出现在哪一页上,包括有关日期,所有者等的信息),相当于几千万个页面. 像字典中的目录一样被索引. 用户希望查看要浏览的单词,并可以根据目录索引找到相关页面.
Lucene应用了反转的思想,并建立了一个反转的文件结构. 下面将解释对反转的理解. 其结构和相应的生成算法如下:
有两个日志A和B,
日志A的内容为“哈哈,今天很晴朗!”
日志B的内容是“哦,今天在下雨!”
(1)分析日志的关键字. Lucene与中的字段查询类似,它基于关键字索引和查询. 我们必须获取数据的关键字. 在这里,本文简要介绍分词:
现在有一个博客文章,可以理解为字符串. 第一步是查找所有单词. 英文单词更易于处理,而中文的描述如下.
日志中的“哈哈”一词没有实际意义. 这些不代表概念的词需要过滤掉.
在Lucene中,上述措施是由Analyzer类完成的. 经过上述处理,
日志1的所有关键字为: [今天] [是] [太阳].
日志2的所有关键字为: [明天] [是] [雨].

(2)建立倒排索引. 获得关键字后,我们可以建立倒排索引. 上面的对应关系是: “日志ID”对应于“日志中的关键字”. 倒排的索引将变为: “日志中的关键字”,以对应于“具有此关键字的所有日志ID”.
日志A和B在颠倒后变为颠倒:
关键字
明天
仅在日志中找到关键字是不够的. 您还需要了解日志中两个位置,关键字的出现位置和出现次数:
1)字符位置,它出现在日志中;
2)关键字位置,单词是日志中关键字的数量(阶段查询快速,节省了索引空间),这里我们使用第二个位置.
关键字
发生地点
今天
A [1]
明天
Lucene索引实现的核心实现是刚才的操作. Lucene在这里放弃了索引中经常使用的B +树结构,并以字符顺序排列关键字,因此我们使用Binary Search来快速获得关键字的位置.
(3)进一步压缩和实现. Lucene引入了字段的概念来表达信息的位置. 在“淘宝技术十年”一书中,淘宝的原始产品搜索架构Searcher使用了这种类似的存储结构. 在创建索引时,将域的详细信息写入字典文件中,一个字段信息对应一个关键字,可以大大减少存储费用. Lucene还将把以上三列另存为字典文件(术语字典),频率文件(频率)和位置文件(位置). 字典文件是Lucene中重要的数据结构. 该文件具有每个关键字的记录,还可以保存指向其他文件的指针. 这样我们就可以找到关键字的位置频率信息.
(4)建立索引后,很容易使用二进制搜索进行定位,查询速度非常快,
如果您使用普通的序列匹配算法,则将花费大量时间.
(2)中文分词技术
词汇是最小的语言组成部分,它可以独立发挥作用. 与英语不同,中文的英语单词之间没有自然的分隔符. 但是,中文远非如此简单. 中文写作的基本单位是单词,单词与单词之间没有特殊的区别标记. 同时,有大量的多义性. 在中文搜索引擎中,中文分词是信息处理和检索的基础和关键. 例如,英语句子“今天很好”. 中文是: “今天很好. ”对于英语句子,计算机可以轻松地通过空格区分三个单词,但更难于理解“今天”和“天真”. 如何将汉字序列放在中文中,即我们通常所说的读句子,处理一系列有意义的单词,称为中文分词.
中文分词技术是人工智能中的一种自然语言处理技术. 对于一个句子,例如有趣的“前门在这里,请下后门”,我们可以区分生活,但是如何使计算机像人的大脑一样,让计算机理解这一过程,这很重要人工智能的研究方向,它是分词算法.
开源社区中有很多中文分词工具,例如盘古分词,平顶中文分词等. IK得到了广泛的应用.
IK分析器是一个开源的中文分词工具包. 从第一个版本开始,IKAnalyzer已启动了多个主要版本. 首先,IK分析器和Luence作为主要应用,将中文分词词典和分析算法结合在一起. 但是,随着进一步的发展,IK Analyzer成为独立的,并成为所有系统的开放式分词组件. 但是,最好与Lucene结合使用. IK分析器可以实现更好的分词,而无需标记词性. IK Analyzer通过配置字典文件可以进一步增强分词效果.
(3)分词和索引
以下说明了常见的插件工具,即CJKAnalyzer的概念:
如果处理了汉字,CJK会将这两个字符视为条目.
例如,赵千孙李,使用CJKAnalyzer分析器对单词进行分段之后,您将获得以下条目:

赵谦谦孙孙莉.
此外,程序将根据所选词典库将条目逐一匹配. 这是一项非常耗时的任务. 具体过程可以参考源代码中的实现.
以下是CJKAnalyzer单词分割的简单实验.
我们输入一段文字: “植树节,我们来到山上,每个人都一起努力,每个人都很高兴. ”
public class BingoAnalyzer {
public static void main(String[] args) {
try {
File file = new File("E:\\bingo\testbingo1.txt");
FileReader endWords = new FileReader("E:\\bingo\testbingo2.txt");
Reader reader = new FileReader(file);
Analyzer bal = new CJKAnalyzer();
TokenStream ts = bal.tokenStream("", reader);
Token t = null;
int n = 0;
while((t = ts.next()) != null ){
n ++ ;
System.out.println("词条"+n+"分词结果 :"+t.termText());
}
System.out.println("产生词条"+n+" 条");
} catch (Exception e) {
e.printStackTrace();
}
}
}
上面的程序仅演示了如何对单词进行分段,其输出如下:
1个单词分割的结果: 植树
2个词分割的结果: 分割我
输入3个单词的结果: 来吧
4个单词分割的结果: 到山上
输入5个字的结果: Shangda
6词分词的结果: 嘉义
7词分词的结果: 齐新
8字分割的结果: 努力工作
9词分词的结果: 每移动一次
条目的10个单词的结果: 个人
11字分割结果: 全部
12字结果: 开心
生成12个条目.
我们可以看到将生成一定数量的垃圾条目,其中一些尚不可用. 如果使用Lucene标准令牌StandardAnalyzer,则成本将降低大约一半. 但是效率很低,而且都必须处理重复的条目.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-232076-1.html
你真心很棒