搜索引擎进行信息检索的优化策略方法(一个问题,如何从一篇文章搜索到你需要的关键字)

优采云 发布时间: 2022-01-15 15:03

  搜索引擎进行信息检索的优化策略方法(一个问题,如何从一篇文章搜索到你需要的关键字)

  首先,对不起,这是一个头条派对。我们经常使用谷歌和百度搜索引擎来寻找我们想要的东西。或许你想过这样一个问题,他们怎样才能快速找到你需要的信息。本文将为大家介绍一个简单的搜索引擎实现,“哦,不是搜索引擎,是全文搜索!”

  背景

  为了说明背景,公司做了一个网站的功能,需要在网站中搜索文章的信息。第一个想到的就是使用数据库的全文检索功能,但是查了资料后发现感觉不好,于是就去查第三方全文检索软件或者库,有很多成熟的,比如Lucene,Sphinx等,我觉得如果能集成一个第三方的就好了,于是查了一下,发现是用Java写的,但是我是一个Java 菜鸟。这很麻烦,所以我冒险并决定自己实现一个。

  问题分析与实施

  用过搜索引擎的人都知道,我们在搜索栏中输入我们需要查找的关键字,点击“搜索”就可以得到一个结果页,这个结果页的内容就是我们要找的关键字。

  第一个问题,如何从一篇文章中搜索到你需要的关键词文章

  我想任何有一定基础的人都可以实现这个问题,并且有很多人在讨论如何更有效地实现它。在这里,我将讨论一个通俗易懂的算法(复杂的没有自己研究过^_^),例如有一段如下:

  *敏*感*词*!

  我们需要从中找到爱这个词。最初,我想写一个简单的搜索算法。就算时间有限,也请自己拿主意(很多编程语言都支持字符串搜索)!显然我们可以很容易地写一个算法来找到这个词。而且我们会发现这个搜索在一个小的文章中找到关键词的速度是可以接受的。看来我们可以自满了!

  事实上,现在高兴还为时过早。我们的网站不可能只有一个文章,未来可能会有上千个文章。我们应该如何处理它?

  第二个问题,用上面的方法搜索,如果文章太多会怎样

  让我们做一个简单的假设来计算:

  服务器收录1000篇文章文章,假设读取一篇文章文章耗时50毫秒,每次文章搜索耗时0.1毫秒

  经过不精确的计算,读取文件一共需要50000毫秒(50秒,其实消耗的时间可能不会那么多,虽然操作系统和数据库会做一些优化,但时间还是会相当可观的) ,搜索文件内容大约需要100毫秒(0.1秒,实际需要根据文章的大小来确定)。经过简单的计算,很明显,这个搜索的速度是完全不能接受的。其他的谷歌、百度却需要数百毫秒才能检索到数亿个列表。

  所以,上面的方法根本行不通,我们需要一个新的方法。

  倒排索引开始发挥作用

  我们还是用一个例子来说明问题,假设有5句话,内容如下:

  我真的很爱她

  她是个漂亮的女人,我很喜欢

  我是一个开源爱好者

  什么是爱?我不知道

  我不知道发生了什么事

  我们可以清楚的看到这五个句子中有“我”这个词,也就是说,如果我们在这五个句子中搜索“我”,那么我们会得到五条记录。经过前面的分析,理论上每一句都搜索是没有问题的,但实际情况是,当数据量很大的时候,是完全不能接受的。

  我们可以看到,如果我们搜索“me”,那么我们会得到一个所有 ID 的列表 [1, 2, 3, 4, 5],这是什么意思?显然,这意味着我们可以将“我”这个词作为索引,然后将每个引用这个词的句子的 ID 记录到一个列表中。使用该规则对“I”、“Yes”和“She”进行索引,我们可以得到以下结果:

  我:[1、2、3、4、5]

  是:[2,3,4,5]

  她:[1, 2]

  我们可以轻松地根据单词获取相关列表,而不必每次都搜索它们,不是很快吗?这就是倒排索引!

  另一个问题,如何分隔 文章 的单词

  倒排索引中存储相关的词和文章的ID以便快速检索是毫无疑问的,但是另一个问题来了,我们如何将文章的内容按词或词组织起来如何分离(本技术术语称为分词。)?

  我们先看一个简单的英文:

  你好世界,你好搜索引擎!

  我们可以很容易地划分英语单词,因为英语单词之间有空格或标点符号,这对大多数人来说并不具有挑战性。

  我们再看一个中文句子:

  你好世界,你好搜索引擎

  作为人类,我们可以轻松区分里面的单词,比如“hello”,但是如何让计算机知道“hello”是一个单词呢?中文不像英文那样可以被简单的空格和标点符号分割。

  让我们想象一下,如果我们告诉程序“hello”是一个单词,那么程序可以区分它。如何才能做到这一点?首先,我们得有一个字典,里面存储了所有中文的词组(其实是不可能的,这个问题后面再讨论);我们扫描文章的内容,将当前扫描结果与字典中的单词进行比较,如果匹配,则说明扫描的词组是词组。

  但是我们会遇到这样的问题,比如:

  中华人民共和国

  其中,“中国”、“人民”、“共和国”可以单独使用,但“中华人民共和国”是从人们习惯上取来的词。对于这样的情况,我们可以使用最大匹配的原则,即尽可能匹配。更多的词,让我们在很大程度上得到符合我们使用习惯的词。

  我们也可能会遇到更极端的问题,比如:

  乒乓球拍卖

  这句话很模棱两可,可以有多种解读方式,给分词带来很大难度。

  另外,分词系统可以根据词的出现频率对词组进行细分,从而解决词典中没有收录的分词问题。

  分词是一门高级知识。上述分词方法可以解决大部分问题,但并不全面。有兴趣的可以自行查找相关资料。

  分词后,将分离出来的词和ID组合起来存储在倒排索引中,建立索引,然后需要完成搜索功能。

  搜索

  搜索的原理前面已经讲过,根据关键字,然后查找倒排索引得到文章的引用列表。这很简单,一切顺利。

  但是搜索通常不只是搜索一个词,也许是一个句子。我们如何搜索一个句子?请按照以下步骤操作:

  首先,我们需要对要搜索的词进行分词,得到相关搜索词(关键字)的列表,使用词组找到所有相关的文章列表,因为几个词(关键字)可能指向同一篇文章文章@ > ,所以需要合并找到的文章列表,返回合并后的文章列表

  这将找到所有相关的 文章,但是以这种方式搜索的 文章 列表是有缺陷的,因为我们不知道每个 文章 匹配的程度,以及一些 文章@ > 可能只匹配最前面的一个关键字,而有的文章 关键字除了在列表的末尾之外都匹配,显然这不符合人们的搜索要求。

  提高搜索结果的准确性

  这里我们提供一个简单的解决方案:我们计算匹配的单词。引用次数越多,匹配度越高,可以考虑越准确。

  此外,我们可以在构建索引时存储更复杂的信息:例如,文章 由标题和正文组成。索引中标题的权重为10,正文的权重为1。组件来累积权重和引用。索引读取完成后,再次按照权重和被引次数排序,将权重和被引次数最高的放在结果列表的最前面,从而得到更理想的结果。

  总结

  本文只介绍简单全文搜索的实现和原理。如果你想做一个专业级的搜索引擎,这些知识是完全不够的。你需要了解爬虫、自然语言分析处理、海量数据存储等。

  希望这个 文章 对你有用!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线