互联网搜索引擎设计与实现(上)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
互联网搜索引擎设计与实现(上)下载引擎+ 文档预处理
目录
1.项目要求 (3)
2. 系统环境 (3)
3. 项目总体设计 (3)
4. 详细设计 (4)
4.1 下载引擎 (4)
4.2 去标签和符号 (6)
4.3 去停用词或找词干 (7)
5. 运行结果 (9)
5.1 下载文档模块 (9)
5.2 文档预处理模块 (10)
5.3 删除停用词模块 (12)
5.4 自动化执行整个模块 (13)
6. 日志 (14)
7. 收获与感想 (14)
附录Ⅰ:下载引擎 (15)
附录Ⅰ:中文文档预处理 (17)
附录Ⅰ:英文文档预处理 (20)
附录Ⅰ:停用词表转字典 (23)
附录Ⅰ:删除停用词 (24)
附录Ⅰ:自动化shell脚本 (27)
1.项目要求
(一)建立并实现文本搜索功能
⏹利用/调用开源搜索引擎Lucene(/)或者
Lemur(/)实现文本搜索引擎。查阅相关资料,安装软件。
⏹对经过预处理后的500个英文和中文文档/网页建立搜索并实现搜索功能。
⏹通过上述软件对文档建立索引(Indexing),然后通过前台界面或者已提供
的界面,输入关键字,展示搜索结果。
⏹前台可通过网页形式、应用程序形式、或者利用已有的界面工具显示。
⏹必须实现英文搜索功能。中文搜索功能作为可选项。
(二)比较文档之间的相似度
⏹通过余弦距离(Cosine Distance)计算任意两个文档之间的相似度,列出文
档原文,并给出相似度值。
(三)对下载的文档,利用K-Means聚类算法进行聚类。
⏹将下载的500个中文/英文文档聚为20个类,并显示聚类之后所形成的三个
最大的类,及每个类中代表性的文档(即,离类中心最近的五个文档)。
⏹距离计算公式,可采用余弦距离,也可用欧式距离。
2. 系统环境
操作系统:Windows 10专业版
编程语言:Java1.8,HTML5, CSS3, Javascript
编程软件:Eclipse Photon Release (4.8.0)、HBuilder 8.8.0.201706142254
开源搜索引擎:Lucene5.5.5
JAR包:
IK分词器:ik2012lucene4.jar
Lucene中文分词器:lucene-analyzers-smartcn-5.5.5.jar
Lucene 标准分词器:lucene-analyzers-common-5.5.5.jar
Lucene核心包:lucene-core-5.5.5.jar
Lucene搜索结果高亮标注:lucene-highlighter-5.5.5.jar、lucene-memory-5.5.5.jar
Lucene短语查询:lucene-queryparser-5.5.5.jar
索引查看器:luke-5.5.0-luke-release
3. 项目总体设计
该项目是对项目一的补充,由于项目一爬取的内容为网页,为了能让系统检索的结果更好的在前端展示,本项目采用B/S架构,前端为WEB端,能够直接打开检索出来的源HTML 文档。
在搜索引擎上,为了更好的保证该IR系统的稳定性,编程语言采用Java1.8。Java在开
源搜索引擎Lucene上技术已经非常成熟,较Python而言具有先天优势。虽然Apache公司也提供的Lucene的python版本,但各个版本之间的兼容性比较差,且在检索效率和矩阵运算的效率上显然不如Java。
项目前端为浏览器,用户通过浏览器与后端交互。关键字(词)查询时,用户在前端输入关键字,后端返回结果集,并显示在前端。文本相似度查询时,用户上传两个网页预处理之后的txt文档,后端接收文档内容,返回两篇文档的相似度。做聚类处理时,用户通过前端选择需要聚类的数据集合(英文/中文),返回聚类的结果并呈现给用户。
为了更好的满足以上内容,本项目采用MVC模式来设计本项目。
图1. 项目结构
最后,编写linux的shell脚本调用各个模块,将各个模块集成一个完整的自动化系统。
4. 详细设计
4.1 下载引擎
文档的下载通过网络爬虫实现,该过程调用urllib库。
urllib通过urllib.request.Request()函数模拟浏览器的请求体向服务器发出请求,通过urllib.request.urlopen(url)函数获取url链接的数据。
其次,现在大部分的url链接都采用了https安全协议,如果直接使用urllib.request.Request(url)打开https链接,是没法跳过安全认证直接获取数据的,因此,需要设置打开链接时跳过https认证,如下:
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
req = urllib.request.Request(url, headers=headers)
context = ssl._create_unverified_context()
respond = urllib.request.urlopen(req, context=context, timeout=0.5)
批量爬取html文件时,首先需要从一个url爬取数据,然后从爬取的数据中用正则表达式匹配url,并将返回的url列表添加到一个队列中去。
起始的url对爬取的速率和效率都至关重要,为了方便起见,我们直接把一个超链接比