Python—一个简单搜索引擎索引库
因为课业要求,搭建一个简单的搜索引擎,找了一些相关资料并进行了部分优化(坑有点多)
一.数据
数据是网络上爬取的旅游相关的攻略页面
这个是travels表,在索引中主要用到id和url两个字段。
页面中文文章内容的爬取用了newspaper3k这个包(如果页面里面文章字数过多,需要设置一下超时时间,不然会报错)
def article(url):
try:
a=Article(url,language="zh")
a.download()
a.parse()
return a.text
except:
pass
return -1
如果报错不退出程序,返回-1
二.分词
文章爬取下来之后的分词有两种模式,全文分词,分词后提取关键词
全文分词
def cutworf(url):
text=article(url)
seg_list=jieba.cut_for_search(text)
return seg_list
如果有很多的页面需要爬取,全文分词的速度会很慢,所以我用了关键词分词
jieba有提供两个关键词分词的方式 TF-IDF以及TextRank算法,在这里我不多详细的说明两个算法的区别。在经过分词结果的比较后,我选择了TF-IDF。
textrank = analyse.textrank
tfidf = analyse.extract_tags
def keyword(url): text =article(url)
if text==-1:
return -1
else:
# 基于TF-IDF算法进行关键词抽取
keywords = tfidf(text)
#print ("keywords by tfidf:")
# 输出抽取出的关键词
#for keyword in keywords:
#print (keyword + "/")
return keywords
三.建立索引
建立索引的数据结构,我参考了https://blog.csdn.net/qq_27483535/article/details/53149021这位博主的文章
创建3个链表类型,3个节点类型(括号中表示)。
Linklist(Node):对每一个网页分词后,将词加入此链表。
Weblist(Web):把网页按照所拥有的词加入词链表,接在词的后面。
Resultlist(Result):搜索结果加入此链表。
设定停用词
ignorewords=set(['的','但是','然而','能','在','以及','可以','使','我','我们','大家','高兴','啊','哦'])
停用词可以根据文章进行添加
把分词加入链表
def index(url,count):
#words=cutworf(url)
keys=keyword(url)
if keys==-1:
return -1
dickey=list(keys)
#dicn=list(words)
# for i in range(len(dicn)):
# word = dicn[i]
# if word in ignorewords: continue
# if ll.getlength() == 0:
# wl = linklist.WebList()
# wl.initlist(count)
# ll.initlist(word, wl)
#
# if ll.getlength() > 0:
# i = ll.index(word)
# if i == -1:
# wl = linklist.WebList()
# wl.initlist(count)
# ll.append(word, wl)
# # print(word)
# if i != -1:
# j = ll.getwh(i).index(count)
# if j == -1:
# ll.getwh(i).append(count) for i in range(len(dickey)):
word = dickey[i]
if word in ignorewords: continue
if kl.getlength() == 0:
wl = linklist.WebList()
wl.initlist(count)
kl.initlist(word, wl) if kl.getlength() > 0:
i = kl.index(word)
if i == -1:
wl = linklist.WebList()
wl.initlist(count)
kl.append(word, wl)
# print(word)
if i != -1:
j = kl.getwh(i).index(count)
if j == -1:
kl.getwh(i).append(count)
return 1
注释掉的部分是全文分词
最后就是遍历链表,加入索引库
对14000多条url进行处理大概花费25个小时
建议放到服务器上运行,用nohup命令,可以在关闭远程连接后让程序继续运行。会自动生成nohup.out文件,报错输出结果什么的可以在里面看到。
四.源代码
https://github.com/zucc31701019/SearchIndex
五.一些坑
这些运行时间很长的程序一定要加异常处理!!!不然运行一半报错了又要重头开始...
连接数据库不要在还没用到的时候连,在用之前再连接。我在分词之前连了数据库,然后运行 20多个小时以后,链表处理完了...数据库链接失效报错...因为连接之后太长时间没有进行操作,数据库会断开连接。
Python—一个简单搜索引擎索引库的更多相关文章
- C 封装一个通用链表 和 一个简单字符串开发库
引言 这里需要分享的是一个 简单字符串库和 链表的基库,代码也许用到特定技巧.有时候回想一下, 如果我读书的时候有人告诉我这些关于C开发的积淀, 那么会走的多直啊.刚参加工作的时候做桌面开发, 服务是 ...
- C 封装一个简单二叉树基库
引文 今天分享一个喜欢佩服的伟人,应该算人类文明极大突破者.收藏过一张纸币类型如下 那我们继续科普一段关于他的简介 '高斯有些孤傲,但令人惊奇的是,他春风得意地度过了中产阶级的一生,而 没有遭受到冷 ...
- python -----一个简单的小程序(监控电脑内存,cpu,硬盘)
一个简单的小程序 用函数实现!~~ 实现: cpu 使用率大于百分之50 时 , C 盘容量不足5 G 时, 内存 低于2G 时. 出现以上其中一种情况,发送自动报警邮件! 主要运用 到了两个 模 ...
- python的一个简单日志记录库glog的使用
一. glog的简介 glog所记录的日志信息总是记录到标准的stderr中,即控制台终端. 每一行日志记录总是会添加一个谷歌风格的前缀,即google-style log prefix, 它的形式如 ...
- C 构造一个 简单配置文件读取库
前言 最近看到这篇文章, json引擎性能对比报告 http://www.oschina.net/news/61942/cpp-json-compare?utm_source=tuicool 感觉技术 ...
- python一个简单的打包例子
最近写了一些工具,想到分享给同事时好麻烦,并且自己每次用也是需要打开pycharm这些工具,感觉很麻烦,因此想到打包,网上有些例子,照做后又摸索很久方成,索性记录一下,以备不时之需. 主要参考:htt ...
- 一个简单搜索引擎的搭建过程(Solr+Nutch+Hadoop)
最近,因为未来工作的需要,我尝试安装部署了分布式爬虫系统Nutch,并配置了伪分布式的Hadoop来存储爬取的网页结果,用solr来对爬下来的网页进行搜索.我主要通过参考网上的相关资料进行安装部署的. ...
- Parallel Python——一个简单的分布式计算系统
如何建立一个高速的分布式计算平台?Parallel python此目的. Parallel Python(http://www.parallelpython.com/content/view/15/3 ...
- Python——一个简单的进度条的实现
import math def process_bar(total_work,work_index,length): times = total_work / length # 长度倍数,用来缩放或扩 ...
随机推荐
- angular自启动过程
angularJS的源代码整体上来说是一个自执行函数,在angularJS加载完成后,就会自动执行了. 即,在window上暴露一个唯一的全局对象angular, 如果window.angular已经 ...
- 题解 P2642 【双子序列最大和】
前言 其实这道题的关键就是在于预处理,其方法类似于 合唱队形 正文 求最大子段和 要想求出双子序列最大和,首先我们要会求出最大子段和 最大子段和的求值方法很简单 定义 \(f_i\) 为以第 \(i\ ...
- 动态规划-TSP问题-最短超级串
2020-03-03 22:55:08 问题描述: 给定一个字符串数组 A,找到以 A 中每个字符串作为子字符串的最短字符串. 我们可以假设 A 中没有字符串是 A 中另一个字符串的子字符串. 示例 ...
- 通过源码理解Spring中@Scheduled的实现原理并且实现调度任务动态装载
前提 最近的新项目和数据同步相关,有定时调度的需求.之前一直有使用过Quartz.XXL-Job.Easy Scheduler等调度框架,后来越发觉得这些框架太重量级了,于是想到了Spring内置的S ...
- Rasa Stack:创建支持上下文的人工智能助理和聊天机器人教程
相关概念 Rasa Stack 是一组开放源码机器学习工具,供开发人员创建支持上下文的人工智能助理和聊天机器人: • Core = 聊天机器人框架包含基于机器学习的对话管理 • NLU = 用于自然语 ...
- 16.如何查找所需的maven的依赖
http://mvnrepository.com/ 1.先打开上面的网址 搜索需要的依赖,点进去 2.选择需要的版本 3.红框中的就是依赖的地址 此外也有其他自动化构建工具所需要的地址
- Downgrade ASM DATABASE_COMPATIBILITY (from 11.2.0.4.0 to 11.2.0.0.0) on 12C CRS stack.
使用Onecommand完成快速Oracle 12c RAC部署后 发现ASM database compatibilty无法设置,默认为11.2.0.4.0. 由于我们还有些数据库低于这个版本,所以 ...
- JavaScript登录记住密码操作
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- Educational Codeforces Round 84 (Rated for Div. 2)
A. Sum of Odd Integers(思维) 思路 这一题看完ans之后觉得是真简单,不过有一些地方还是要理解的. 这一题输出YES,有两个条件 kk%2 == n%2k,这个条件的意思是 k ...
- PTA数据结构与算法题目集(中文) 7-36 社交网络图中结点的“重要性”计算 (30 分)
PTA数据结构与算法题目集(中文) 7-36 社交网络图中结点的“重要性”计算 (30 分) 7-36 社交网络图中结点的“重要性”计算 (30 分) 在社交网络中,个人或单位(结点)之间通过某 ...