信息检索实验三:企业搜索系统的设计与实现

1 实验目的

本次实验目的是对企业检索系统的设计与实现过程有一个全面的了解。本次实验设计的内容包括:对数据建立索引,实现文档的搜索,并对检索结果排序;实现企业搜索中的分权限访问。

2 实验内容

2.1 建立索引

本次实验使用到的数据是实验 1 中爬取的网页数据。首先要对 1000 个网页的网页内容建立索引,其次也要对爬取到的所有附件文档建立索引。然后实现一个简单的检索系统,实现数据和文档检索(可以分开实现,也可以合二为一),并且能够精确的对检索结果进行排序。这一部分要求同学们做成简单的 UI 应用或者是 Web 应用,来保证易用性。

3.2 分权限访问

可以自己定义多种不同的“企业角色”(至少 4 种),这些角色对数据或文 档的访问权限不同,然后为每条数据增加访问权限。然后在现有检索系统的基础上加入分权限访问功能,使得不同角色的用户在使用检索系统时,只能看到自己具有访问权限的那部分内容。同时在 3.1 的基础上对应用界面改进,便于切换企业角色。
分权限访问的实现一般有以下两种模式:

  1. 检索条件控制:对检索条件加以限制,仅在用户访问权限内的文档中检索。
  2. 检索结果过滤:检索结果的后处理,过滤掉用户不具备访问权限的结果。

3 实验过程及结果

3.1 建立索引

首先对实验 1 抓取网页和文档分别构建倒排索引,供检索模型使用;另一方面根据向量空间模型计算两两网页之间的余弦相似度,供推荐模块使用。最后利用概率检索模型中的 BM25 公式计算给定关键词下的文档相关性评分,根据评分给出排序结果。

3.1.1 构建索引

在扫描文档时,不但记录某词项出现与否,还记录该词项出现的次数,即词项频率(tf);同时我们记录该文档的长度(ld),以及某词项在不同文档中出现的次数,即文档频率(df)。

这样就得到了如上图的倒排索引。左边部分被称为词典,存储的网页和文档中所有不同的词项;右边部分被称为倒排记录表,存储的是出现 Term_i 的那些文档信息。倒排索引中存储的变量都是为了给后续检索模型使用。
(1)分词:jieba 分词能够将一个中文句子切成一个个词项,这样就可以统计 tf, df 了。
(2)去停用词:有些词,如”的“、”地“、”得“、”如果“等,几乎每篇文档都会出现,他们起不到很好的区分文档的效果,这类词被称为”停用词“,我们需要把他们去掉。去停词的步骤可以在 jieba 分词之后完成。
(3)存储倒排记录表:用矩阵方式存储时空效率都不高。所以采用图 1 的方式,词典用 B-树或 hash 存储,倒排记录表用邻接链表存储方式,这样能大大减少存储空间。如果要将图 1 保存到数据库,可以对倒排记录表序列化成一个长的字符串,写入到一个单元格,读取的时候再反序列化。比如每个 Doc 内部用’\t’连接,Doc 之间用’\n’连接,读取的时候 split 即可。
倒排索引构建算法使用内存式单遍扫描索引构建方法(SPIMI),其实就是依次对每篇新闻进行分词,如果出现新的词项则插入到词典中,否则将该文档的信息追加到词项对应的倒排记录表中。
3.1.2 BM25 检索模型
检索模型有很多,比如向量空间模型、概率模型、语言模型等。其中最有名的、检索效果最好的是基于概率的 BM25 模型。
给定一个查询 Q 和一篇文档 d,d 对 Q 的 BM25 得分公式为

公式中变量含义如下:

  • qtf :查询中的词频
  • tf :文档中的词频
  • ld :文档长度
  • avg_l :平均文档长度
  • N :文档数量
  • df :文档频率
  • b,k1,k3 :可调参数

第一个公式是外部公式,一个查询 Q 可能包含多个词项,比如“苹果手机”就包含“苹果”和“手机”两个词项,我们需要分别计算“苹果”和“手机”对某个文档 d 的贡献分数 w(t,d),然后将他们加起来就是整个文档 d 相对于查询 Q 的得分。
第二个公式就是计算某个词项 t 在文档 d 中的得分,它包括三个部分。第一个部分是词项 t 在查询 Q 中的得分,比如查询“中国人说中国话”中“中国”出现了两次,此时 qtf=2,说明这个查询希望找到的文档和“中国”更相关,“中国”的权重应该更大,但是通常情况下,查询 Q 都很短,而且不太可能包含相同的词项,所以这个因子是一个常数,我们在实现的时候可以忽略。第二部分类似于 TFIDF 模型中的 TF 项。也就是说某个词项 t 在文档 d 中出现次数越多,则 t 越重要,但是文档长度越长,tf 也倾向于变大,所以使用文档长度除以平均长度 ld/avg_l
起到某种归一化的效果,k1 和 b 是可调参数。
第三部分类似于 TFIDF 模型中的 IDF 项。也就是说虽然“的”、“地”、“得”等停用词在某文档 d 中出现的次数很多,但是他们在很多文档中都出现过,所以这些词对 d 的贡献分并不高,接近于 0;反而那些很稀有的词如”糖尿病“能够很好的区分不同文档,这些词对文档的贡献分应该较高。
所以根据 BM25 公式,我们可以很快计算出不同文档 t 对查询 Q 的得分情况,然后按得分高低排序给出结果。
首先将句子分词得到所有查询词项,然后从数据库中取出词项对应的倒排记录表,对记录表中的所有文档,计算其 BM25 得分,最后按得分高低排序作为查询结果。

3.1.3 推荐阅读

虽然主要的检索功能实现了,但是我添加了一个“推荐阅读”的功能。当用户浏览某条具体新闻时,我在页面底端给出 5 条和该新闻相关的新闻,也就是一个最简单的推荐系统。
推荐模块的思路是度量两两新闻之间的相似度,取相似度最高的前 5 篇新闻作为推荐阅读的新闻。
一篇文档可以用一个向量表示,向量中的每个值是不同词项 t 在该文档 d 中的词频 tf。但是一篇较短的文档(如新闻)的关键词并不多,所以我们可以提取每篇新闻的关键词,用这些关键词的 tf-idf 值构成文档的向量表示,这样能够大大减少相似度计算量,同时保持较好的推荐效果。
jieba 分词组件自带关键词提取功能,并能返回关键词的 tf-idf 值。所以对每篇新闻,我先提取 tf-idf 得分最高的前 25 个关键词,用这 25 个关键词的 tf-idf 值作为文档的向量表示。由此能够得到一个 1000*m 的文档词项矩阵 M,矩阵每行表示一个文档,每列表示一个词项,m 为 1000 个文档的所有互异的关键词(大概 10000 个)。矩阵 M 当然也是稀疏矩阵。
得到文档词项矩阵 M 之后,利用 sklearn 的 pairwise_distances 函数计算 M 中行向量之间的 cosine 相似度,对每个文档,得到与其最相似的前 5 篇新闻 id,并把结果写入数据库。

3.1.4 界面设计

利用开源的 Flask Web 框架搭建了展示系统,搜索引擎只需要两个界面,一个是搜索界面,另一个是展示详细新闻的页面。编写好这两个模板页面并调用前面给出的接口,得到数据,展示出来就可以。由于数据量不大,所以第一页中后面几个结果相关度就不是很高了。这里可以设置一个得分阈值,超过这个阈值才作为查询答案返回。

3.1.5 实验结果

本次实验使用的数据库设计:

表名 数据
Files 实验 1 爬取的附件
Files_postings 附件的倒排记录表
news 实验 1 爬取的新闻(网页)
postings 新闻的倒排记录表
knearest 每篇新闻最相似的前 5 篇新闻 id
Users 注册的用户

网页查询结果:

附件查询结果:

详细内容页:

3.2 分权限访问

本节实验在 3.1 的基础上对网页和附件增加了访问权限,并增加了注册登录功能,过滤掉用户不具备访问权限的查询结果,使得不同等级的用户访问相应权限的网页和附件。

3.2.1 权限划分

由于实验 1 抓取的网页和附件没有明显的权限界限,所以实验中只是对网页和附件的权限进行了简单的划分。“企业角色”分为 1 级,2 级,3 级,4 级,级别越高访问权限越大,n 级用户只能访问数据级别小于 n 的数据。

  • 网页权限的划分:
    一共 1175 个网页,均分为 4 级,每级 300 个
    数据库截图如下:
  • 附件权限的划分:
    一共 334 个附件,均分为 4 级,每级 80 个,在这节实验中,我把附件的数据库与网页的数据库合并了,从上图可以看出,id 为 1~380 (300+80) 属于第 1 级数据。
    这里有一点需要注意,python 不能读取.dox 后缀的文件,需要将.dox 批量转化为.docx,处理如下:
 import docxdef doSaveAas():files = listdir('D:\\Work\\IR\\Lab3\\document')word = wc.Dispatch('Word.Application')for item in files:if 'docx' in item:continueif 'doc' in item:doc = word.Documents.Open('D:\\Work\\IR\\Lab3\\document\\' + item)  # 目标路径下的文件doc.SaveAs('D:\\Work\\IR\\Lab3\\document\\' + item + 'x', 12, False, "", True, "", False, False, False,False)  # 转化后路径下的文件doc.Close()os.remove('D:\\Work\\IR\\Lab3\\document\\' + item)  # 删除文件word.Quit()

3.2.2 注册登录
注册登录为用户划分了 4 个等级
注册页面如下:注册时需要用户声明自己的等级

登录页面如下:

users 数据库截图:

这里的 password 在注册时对用户的密码进行了加密,生成一个 hash 值
password = sha256_crypt.encrypt( str(form.password.data)) # 对密码加密,生成一个hash值[每次调用生成不同的hash]

3.2.3 实验结果

等级为 2 的用户登录


后台打印的返回网页记录:

等级为 4 的用户登录

后台打印的返回网页记录:

可以看出,不同等级的用户搜索系统返回的结果不同。

4 实验心得

至此,整个企业搜索系统构建完毕,总体效果令人满意,不过还是有很多可以改进的地方。下面总结一下本系统的优点和不足。

  • 优点
    倒排索引存储方式。因为不同词项的倒排记录表长度一般不同,所以没办法以常规的方式存入关系型数据库。通过将一个词项的倒排记录表序列化成一个字符串再存入数据库,读取的时候通过反序列化获得相关数据,整个结构类似于邻接表的形式。
    推荐阅读实现方式。利用特征提取的方法,用 25 个关键词表示一篇新闻,大大减小了文档词项矩阵规模,提高计算效率的同时不影响推荐新闻相关性。
  • 不足
    构建索引时,为了降低索引规模,提高算法速度,我将纯数字词项过滤了,同时忽略了词项大小写。虽然索引规模下降了,但是牺牲了搜索引擎的正确率。
    在推荐阅读模块,虽然进行了维度约减,但是当数据量较大时(数十万条新闻),得到的文档词项矩阵也是巨大的,会远远超过现有 PC 的内存大小。所以可以先对新闻进行粗略的聚类,再在类内计算两两 cosine 相似度,得到值得推荐的新闻。
    在分权限时,由于抓取的新闻和附件没有明显的权限界限,所以只按照编号进行了简单的权限划分,在实际企业搜索系统构建时应对文件的访问权限做明确的划分。

♻️ 资源

大小: 36.4MB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87379042

基于Python 实现企业搜索系统(信息检索)【100010418】相关推荐

  1. python毕业设计开题报告-基于Python的教学互动系统的设计与实现开题报告

    基于Python的教学互动系统的设计与实现开题报告 背景: 在各种信息技术与课堂的不断探索中,我们一直在寻找一个能提高教学效率的方式,同时可以发现要提高教学效率,在课堂教学中必不可少的就是师生间的互动 ...

  2. 如何实施好基于MOSS的企业搜索项目(上)

    文章目的:希望通过此文,能让读者了解搜索的本质和基于MOSS的企业搜索方案,在此基础上站在项目管理角度掌 握如何实施好这类方案的项目的关键点,确保企业搜索项目成功交付.由于文章长度限制,本文分上下两部 ...

  3. 基于python的简单名片系统

    基于python的简单名片系统,适合python初学者,或者教学者试讲. card_list=[] #记录所有的名片字典def show_menu():print("*"*50)p ...

  4. python网络安全毕业设计_基于Python的网络爬虫系统的设计与实现

    2018 年第 12 期 信息与电脑 China Computer&Communication 软件开发与应用 基于 Python 的网络爬虫系统的设计与实现 刘 杰 葛晓玢 闻顺杰 (铜陵职 ...

  5. 基于Python的人工智能美颜系统

    基于Python的人工智能美颜系统使用PyQt5模块搭建可视化界面,使用Dlib模型(shape_predictor_68_face_landmarks.dat)实现人脸关键点检测和定位,人脸美颜(美 ...

  6. 基于python的分布式扫描器_基于python的服务器监测系统的设计

    基于 python 的服务器监测系统的设计 高正 ; 徐浩 ; 余曼 [期刊名称] <电脑知识与技术> [年 ( 卷 ), 期] 2017(013)002 [摘要] 本文介绍了一种基于 P ...

  7. Java EE 企业网站_基于jsp的企业网站系统-JavaEE实现企业网站系统 - java项目源码...

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的企业网站系统, 该项目可用各类java课程设计大作业中, 企业网站系统的系统架构分为前后台两部分, 最终实现在线上 ...

  8. python开发的著名软件公司_软件开发公司_软件外包_项目外包平台基于Python开发一个全文检索系统...

    基于Python开发一个全文检索系统.功能要求为: 使用全文检索引擎对文本进行检索.文本的格式为Word.PDF.TXT. 同时按数据域进行复合条件检索.数据域指文本对应的信息,例如创建人.文件编号. ...

  9. python实现文件共享_基于Python的分布式文件共享系统的实现

    龙源期刊网 http://www.qikan.com.cn 基于 Python 的分布式文件共享系统的实现 作者:朱亚林 纪宏伟 来源:<智能计算机与应用> 2015 年第 04 期 摘 ...

最新文章

  1. python 操作word页眉表格_python批量设置多个Excel文件页眉页脚的脚本
  2. ThinkPHP5执行流程分析
  3. c语言启动程序句柄无效,电脑中玩英雄联盟提示“句柄无效”是怎么回事
  4. 掌门教育微服务体系 Solar 第 3 弹:Nacos 企业级落地下篇
  5. ITK:使用均方执行二维平移配准
  6. qt将光标相对于桌面的位置转换为相对于窗口的位置
  7. C++实现一个基于mfc的学生信息管理系统
  8. mybatis批量更新报错问题解决
  9. matlab 求不规则体积,matlab,求不规则三维图形体积?
  10. Win7系统显示文件扩展名的方法
  11. 什么是智能DNS解析?
  12. 往事如烟 - 梧桐叶落
  13. 【Unity】Obi插件系列(六)—— Obi Cloth
  14. 直播商城源码,商城开发实现商城底部导航栏
  15. Android 对话框(Dialogs)
  16. Istio-智能DNS
  17. 商用三相水表行业调研报告 - 市场现状分析与发展前景预测
  18. word文档图标变成白纸_Word图标变成白框加WORD图标的解决方案
  19. 服务器显示桌面计算机,Windows Server 2012/2016桌面显示我的电脑图标
  20. 西电2020计算机考研,西安电子科技大学研究生院,西电2020年考研成绩最新信息!...

热门文章

  1. windows商显和Android商显,Android、 Windows、Linux谁更优?视美泰细说智慧数字标牌操作系统...
  2. GAMS将har数据转换为gdx数据和Access数据过程中的异步问题
  3. 《脱口秀大会2》第一期,主题:有本事再刷存在感
  4. 计算机画家的阅读答案,计算机眼中的世界名画
  5. 安科瑞ASJ60-LD16A剩余电流监测仪 照明灯配电箱漏电流保护装置
  6. 基于Spring MVC + Spring + MyBatis的【图书信息管理系统(一)】
  7. smpboot_create_threads
  8. input上传文件 ie8拒绝访问 解决办法
  9. w ndows控制面板怎样打开,Windows10系统下怎样使用快捷键打开控制面板
  10. Google Guava的EventBus(事件总线)基本使用