搜索引擎:常用信息检索方式介绍与倒排索引实现(Python)

这篇具有很好参考价值的文章主要介绍了搜索引擎:常用信息检索方式介绍与倒排索引实现(Python)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.信息检索方式

(1)线性扫描

计算机对于文档内容检索有多种可能的方式,如直接从头遍历至尾端,根据我们输入的关键词提取内容。

这类检索方式与我们人类阅读的习惯相同,因此实现简单且很容易被接受。

若问你《三国演义》中是否存在’舌战群儒’这一词语,我们常常会选择浏览全文从中找出匹配的词语。



而从《三国演义》中提取出关键词 , 通过现代计算机不会花费太长时间;

但假如目标是世界文学合集呢?企业一年的财务报告呢?又或者是现代信息世界产生的规模更大的文档集。

尽管计算机算力强大,线性扫描的信息检索方式也仅仅只能够用于处理小文本。

(2)词项—文档关联矩阵

于是产生了词项—文档关联矩阵,我们利用空闲的算力,在计算机内部提前构建矩阵。

三国演义 红楼梦 水浒传 西游记 悟空传
孙悟空 0 0 0 1 1
贾宝玉 0 1 0 0 0

当我们输入关键词孙悟空时,将《西游记》《悟空传》两个文档作为结果返回。

这样的方式大大提高了检索速度

词项是索引的单位 而文档则是返回的结果。

从行来看,能够得到对应词项的文档向量;从列来看,则获取文档的词项向量。

当然这类方式也存在较大的不足 如上述我所举例的表格 能够看见矩阵中0值占比极高

在造成负担的同时 也极大地减缓了检索速度。

(3)倒排索引

对数据结构有一定涉猎的同学应该很快就能想到优化方式——稀疏数组。

我们建立词项词典与倒排记录表 从而完成对文档的高效检索。

词项词典 倒排记录表
孙悟空 4—>5
贾宝玉 2

倒排索引的两个部分。词典部分往往放在内存中,而指针指向的每个倒排记录表则往往存放在磁盘上。

二.倒排索引实现及常用语料处理方式

(1) 实现目标

读取文本文件 对不同的单行文档 进行词条化及归一化,

关注标点符号的去重 停用词的筛选以及大小写的转化。

建立倒排索引/词项字典。

(2) 完整代码

 import re
 import string
 from stop_words import get_stop_words
 from nltk.stem.porter import PorterStemmer
 
 
 # 列表去重
 def unique(word_list):
     return list(dict.fromkeys(word_list))
 
 
 # 移除停用词
 def stop_word(token):
     en_stop = get_stop_words('en')
     stopped_tokens = [i for i in token if i not in en_stop]
     return stopped_tokens
 
 
 # 词干提取
 def stem_extracting(stopped_tokens):
     p_stemmer = PorterStemmer()
     texts = [p_stemmer.stem(i) for i in stopped_tokens]
     return texts
 
 
 # Porter stemmer 并不是要把单词变为规范的那种原来的样子,
 # 它只是把很多基于这个单词的变种变为某一种形式!换句话说,
 # 它不能保证还原到单词的原本,也就是"created"不一定能还原到"create",
 # 但却可以使"create" 和 "created" ,都得到"creat" !
 
 def incidence_matrix(text, docID):
     # 目的:
     # 传入一段文本及其文档号
     # 获取其词项列表
 
     # 1.清除英文标点符号
     punctuation_string = string.punctuation
     lines = re.sub('[{}]'.format(punctuation_string), " ", text)
     # 2.将英文文本内容切片
     lsplit = lines.split()
     # 3.大小写转换
     for num in range(len(lsplit)):
         lsplit[num] = lsplit[num].lower()
     # 4.移除停用词 词干提取
     # lsplit = stem_extracting(stop_word(lsplit))
     # 5.去重并转字典
     lsplit_dic = dict.fromkeys(lsplit)
     # 6.记录文档号
     for word in lsplit_dic.keys():
         lsplit_dic[word] = [docID]
     return lsplit_dic
 
 
 def read_file(filename):
     result = {}
     count = 0
     with open(filename, 'r') as file_to_read:
         # 以只读形式打开该文件
         while True:
             # 以行为单位进行读取
             lines = file_to_read.readline()
             # 当某行内容为空时 停止读取
             if len(lines) == 0:
                 break
             count = count + 1
             lsplot = incidence_matrix(lines, count)
             result = dic_zip(result, lsplot)
     # 关闭文件读取
     file_to_read.close()
     return result
 
 
 def dic_sort(a_dic):
     b_dic = dict.fromkeys(sorted(a_dic))
     for word in b_dic.keys():
         b_dic[word] = a_dic[word]
     return b_dic
 
 
 # 不同文档字典 同一词项合并
 def dic_zip(a_dic, b_dic):
     # 将b_dic并入a_dic中
     for word in b_dic.keys():
         if a_dic.get(word, None):
             a_dic[word].extend(b_dic[word])
         else:
             a_dic[word] = b_dic[word]
     return a_dic
 
 
 def show_dic(a_dic):
     # 文档频率可用于做查询优化
     tplt = "{0:^10}\t{1:{3}^10}\t{2:^40}"
     print(tplt.format("词项", "文档频率", "倒排记录", chr(12288)))
     for word in a_dic.keys():
         print(tplt.format(word, len(a_dic[word]), str(a_dic[word]), chr(12288)))
 
 
 def main():
     # 读取filename下的英文文本文件 将每一行作为单独的文本
     # 建立倒排索引。
     filename = './Reverse_Index_Word2.txt'
     matrix = dic_sort(read_file(filename=filename))
     show_dic(matrix)
 
 
 if __name__ == '__main__':
     main()

(3) 运行结果

可以读取更大规模的文档,此处选取小文本是为了便于展示。

归一化的处理被我注释掉了 需要时可以删除#符号。文章来源地址https://www.toymoban.com/news/detail-476495.html

 #读入的文档
 new home sales top forecasts
 home sales rise in july
 increase in home sales in july
 july new home sales rise
 
 # 运行结果
 "D:\Program Files\Python\python.exe" 
     词项        文档频率                     倒排记录                  
 forecasts       1                         [1]                   
    home         4                     [1, 2, 3, 4]              
     in          2                        [2, 3]                 
  increase       1                         [3]                   
    july         3                      [2, 3, 4]                
    new          2                        [1, 4]                 
    rise         2                        [2, 4]                 
   sales         4                     [1, 2, 3, 4]              
    top          1                         [1]                   
 
 Process finished with exit code 0
 

到了这里,关于搜索引擎:常用信息检索方式介绍与倒排索引实现(Python)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot封装Elasticsearch搜索引擎实现全文检索

    注:本文实现了Java对Elasticseach的分页检索/不分页检索的封装 ES就不用过多介绍了,直接上代码: 创建Store类(与ES字段对应,用于接收ES数据) Elasticsearch全文检索接口:不分页检索 Elasticsearch全文检索接口:分页检索 本文实现了Java对Elasticsearch搜索引擎全文检索的封装 传入

    2024年02月04日
    浏览(32)
  • 揭秘阿里自研搜索引擎 Havenask 在线检索服务

    作者:谷深 Havenask 是阿里巴巴智能引擎事业部自研的开源高性能搜索引擎,深度支持了包括淘宝、天猫、菜鸟、高德、饿了么在内几乎整个阿里的搜索业务。本文针对性介绍了 Havenask 的在线服务,它具备高可用、高时效、低成本的优势,帮助企业和开发者量身定做适合业务

    2024年02月02日
    浏览(36)
  • 【搜索引擎】Document indexing and retrieval: 文档索引与检索

    作者:禅与计算机程序设计艺术 搜索引擎作为互联网信息获取的一种重要手段之一,无论是在PC、移动端还是电脑上使用,都可以快速找到想要的信息。而对于文档信息的搜索引擎索引构建,则是一个更加复杂的问题。 文档索引与检索(Document Indexing and Retrieval, DIR)的目标是建

    2024年02月08日
    浏览(31)
  • Python实战:在搜索引擎开发中的倒排索引与检索算法

    在信息检索领域,搜索引擎是一个至关重要的工具,它可以帮助用户在大量的数据中找到所需的信息。而倒排索引是搜索引擎的核心技术之一,它能够提高检索的效率。 倒排索引是一种数据结构,它将文档的内容和文档的ID关联起来。在倒排索引中,每个词项都有一个列表,

    2024年04月26日
    浏览(25)
  • 后端架构师必知必会系列:搜索引擎与全文检索

    作者:禅与计算机程序设计艺术 什么是搜索引擎?它是指在互联网上搜集、整理并快速索引海量信息的数据结构与数据库,对用户的查询请求进行快速、准确的响应的技术。搜索引擎又分为互联网搜索引擎(英语: internet search engine)和本地搜索引擎(英语: local search engine)。 全文

    2024年02月05日
    浏览(36)
  • 【搜索引擎设计:信息搜索怎么避免大海捞针?

    在前面我们提到了网页爬虫设计:如何下载千亿级网页?中,我们讨论了大型分布式网络爬虫的架构设计,但是网络爬虫只是从互联网获取信息,海量的互联网信息如何呈现给用户,还需要使用搜索引擎完成。因此,我们准备开发一个针对全网内容的搜索引擎,产品名称为“

    2024年01月17日
    浏览(32)
  • 网络空间搜索引擎信息收集

    简介 网络空间搜索引擎不同于普通的搜索引擎(百度等),而是直接搜索网络中的主机,将主机信息汇聚成数据库,然后显示出主机的 IP、端口、中间件、摄像头、工控设备 banner 等其他网络设备信息。可以按照普通的搜索引擎的规则来搜索,如:ip:“192.168.1.1”。 Shodan 简介

    2024年01月17日
    浏览(29)
  • 信息搜集-Google搜索引擎

    原文地址https://www.freebuf.com/articles/web/342474.html Google搜索引擎: 这里之所以要介绍google搜索引擎,是因为它有别于百度、搜狗等内容搜索引擎,其在安全界有着非同一般的地位,甚至专门有一名词为google hacking用来形容google与安全非同寻常的关系; google基本语法: 利用google暴库

    2024年02月15日
    浏览(31)
  • 知识点搜索:如何高效利用搜索引擎获取准确信息?

          在网络时代,搜索引擎已经成为人们获取信息的主要渠道,它的出现让人们可以在短时间内获取大量的信息,而不用费尽心思去查找各种资料。但是,有些人在使用搜索引擎时却无从下手,不知道如何进行搜索。本文将会介绍如何高效利用搜索引擎获取准确的信息。

    2024年02月22日
    浏览(33)
  • 搜索引擎常用技巧

    常用的引擎: baidu.com google.com bing.com 双引号 “” 双引号 “” 可以让搜索的精准匹配,而 不会对我们输入的进行​切分 。 例如,我们搜索 “python range 用法”,通过结果可以看出使用双引号和不使用双引号结果是不一样的。​ 排除符号:- python -jianshu 排除某

    2024年02月08日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包