因为课业要求,搭建一个简单的搜索引擎,找了一些相关资料并进行了部分优化(坑有点多)

一.数据

数据是网络上爬取的旅游相关的攻略页面

这个是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—一个简单搜索引擎索引库的更多相关文章

  1. C 封装一个通用链表 和 一个简单字符串开发库

    引言 这里需要分享的是一个 简单字符串库和 链表的基库,代码也许用到特定技巧.有时候回想一下, 如果我读书的时候有人告诉我这些关于C开发的积淀, 那么会走的多直啊.刚参加工作的时候做桌面开发, 服务是 ...

  2. C 封装一个简单二叉树基库

    引文 今天分享一个喜欢佩服的伟人,应该算人类文明极大突破者.收藏过一张纸币类型如下 那我们继续科普一段关于他的简介 '高斯有些孤傲,但令人惊奇的是,他春风得意地度过了中产阶级的一生,而  没有遭受到冷 ...

  3. python -----一个简单的小程序(监控电脑内存,cpu,硬盘)

    一个简单的小程序 用函数实现!~~ 实现: cpu 使用率大于百分之50 时  ,  C 盘容量不足5 G 时, 内存 低于2G 时. 出现以上其中一种情况,发送自动报警邮件! 主要运用 到了两个 模 ...

  4. python的一个简单日志记录库glog的使用

    一. glog的简介 glog所记录的日志信息总是记录到标准的stderr中,即控制台终端. 每一行日志记录总是会添加一个谷歌风格的前缀,即google-style log prefix, 它的形式如 ...

  5. C 构造一个 简单配置文件读取库

    前言 最近看到这篇文章, json引擎性能对比报告 http://www.oschina.net/news/61942/cpp-json-compare?utm_source=tuicool 感觉技术 ...

  6. python一个简单的打包例子

    最近写了一些工具,想到分享给同事时好麻烦,并且自己每次用也是需要打开pycharm这些工具,感觉很麻烦,因此想到打包,网上有些例子,照做后又摸索很久方成,索性记录一下,以备不时之需. 主要参考:htt ...

  7. 一个简单搜索引擎的搭建过程(Solr+Nutch+Hadoop)

    最近,因为未来工作的需要,我尝试安装部署了分布式爬虫系统Nutch,并配置了伪分布式的Hadoop来存储爬取的网页结果,用solr来对爬下来的网页进行搜索.我主要通过参考网上的相关资料进行安装部署的. ...

  8. Parallel Python——一个简单的分布式计算系统

    如何建立一个高速的分布式计算平台?Parallel python此目的. Parallel Python(http://www.parallelpython.com/content/view/15/3 ...

  9. Python——一个简单的进度条的实现

    import math def process_bar(total_work,work_index,length): times = total_work / length # 长度倍数,用来缩放或扩 ...

随机推荐

  1. coding++:Spring IOC/DI 实现原理

    什么是 SpringIOC: spring ioc 指的是控制反转,IOC容器负责实例化.定位.配置应用程序中的对象及建立这些对象间的依赖.交由Spring容器统一进行管理,从而实现松耦合. “控制反 ...

  2. SpringBoot 集成ehcache

    1, 项目实在springboot 集成mybatis 的基础上的: https://www.cnblogs.com/pickKnow/p/11189729.html 2,pom 如下,有的不需要加, ...

  3. iOS 内存分配与分区

    RAM ROM RAM:运行内存,不能掉电存储. ROM:存储性内存,可以掉电存储,例如内存卡.Flash. 由于 RAM 类型不具备掉电存储能力(即一掉电数据消失),所以 app 程序一般存放于 R ...

  4. 在Ngnix中配置支持Websocket

    使用SignalR实现Websocket实时数据传输时,前后端各自实现编码后,无法将Websocket调试通过.沮丧之时,负责配置网络代理的同事说,网络访问这块使用了Ngnix代理设置,可能是造成We ...

  5. Failed RMAN Catalog Upgrade from 11.2.0.2 to 12.1.0.2 ( ORA-02296 RMAN-06004 )

    Failed RMAN Catalog Upgrade from 11.2.0.2 to 12.1.0.2  ( ORA-02296  RMAN-06004 ) 由于后期使用12c的数据库,需要对现有 ...

  6. vue2.0 操作数组下标不跟新ui,使用set()或$forceUpdate 也不能跟新视图情况

    在vue 2.0 中操作数组不跟新ui图,即使使用set()或 $forceUpdate也不能跟新视图,我在前段时间也遇到了一个问题,当时我使用的时element 的tree 组件 由于需要对tree ...

  7. Js闭包练习2020031801

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  8. jvm的类加载机制总结

    类的加载机制分为如下三个阶段:加载,连接,初始化.其中连接又分为三个小阶段:验证,准备,解析. 加载阶段 将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后再堆内创 ...

  9. 大曾Blogs使用说明书😊——Super ITZ

    大曾Blogs使用说明书 先敲黑板,四句话: pipe搜索,简洁,用于跳转,博客园及csdn和github 博客园炫酷界面,用于查看主要博文 csdn所有博客汇总,查看详细信息 github项目源码汇 ...

  10. C#如何正确的做深拷贝

    估计很多人在网上看到各种各样的DeepClone实现, 例如: 1. 通过BinaryFormatter进行二进制序列化 这玩意儿序列化出来的东西还带namespace类型, 尺寸非常大, 调试一下就 ...