04 爬虫应用——校园网搜索引擎(1)理论部分

本文详细介绍了校园网搜索引擎的工作原理及关键技术,包括网络爬虫的网页抓取、正则表达式的文本信息提取、倒排索引的词条索引构建、jieba分词组件的中文文本处理、关键词提取的文本分类以及deque双向队列的数据结构应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

5.2 校园网搜索引擎系统

1、步骤(理论部分)

(1)网络爬虫 爬取 这个网站,得到 所有网页链接(BFS 和 DFS)
(2)得到 网页源码,剥离 各种信息(新闻内容、标题、作者等信息)
(3)把 所有的网页的新闻内容 做成 词条索引,
一般采用 倒排表索引(反向表索引:关键字索引文档(建立复杂,后台进行,检索快!))
注:正排表索引:文档索引关键字(建立简单,但是检索复杂)

5.3 关键技术

1、正则表达式

按照某种规则去查找一些特定的字符串!

2、re模块

import re
re.match(r'^\d{3}\-\d{3,8}$', '010-12345' )

<re.Match object; span=(0, 9), match=‘010-12345’>

re.match(r'^\d{3}\-\d{3,8}$', '010 12345' )
t =  '19:05:25, 19:05:28'
m = re.match(r'^(\d\d)\:([0-9]{2})\:(\d{2})', t) # 三种方法匹配两个数字

print('m.string:', m.string)
print('m.re:', m.re)
print('m.pos:', m.pos)
print('m.endpos:', m.endpos)
print('m.lastgroup:', m.lastgroup)
print('m.group(0):', m.group(0))
print('m.group(1,2):', m.group(1,2))
print('m.groups():', m.groups())
print('m.groupdict():', m.groupdict())
print('m.start(2):', m.start(2))
print('m.end(2):', m.end(2))
print('m.span(2):', m.span(2))

m.string: 19:05:25, 19:05:28
m.re: re.compile(’^(\d\d)\😦[0-9]{2})\😦\d{2})’)
m.pos: 0
m.endpos: 18
m.lastgroup: None
m.group(0): 19:05:25
m.group(1,2): (‘19’, ‘05’)
m.groups(): (‘19’, ‘05’, ‘25’)
m.groupdict(): {}
m.start(2): 3
m.end(2): 5
m.span(2): (3, 5)

m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
print(m.group(0))
print(m.group(1))
print(m.group(2))

010-12345
010
12345

'a b   c'.split(' ')

[‘a’, ‘b’, ‘’, ‘’, ‘c’]

re.split(r'[\s\,]+', 'a,b, c d')
re.split(r'[\s\,\;]+', 'a,b;;  c d,; e')

[‘a’, ‘b’, ‘c’, ‘d’, ‘e’]

# re.match总是从开头去匹配,匹配非“开头”则会返回None
str1 = 'Hello World!'
print(re.match(r'World', str1))

None

print(re.search(r'World', str1))

<re.Match object; span=(6, 11), match=‘World’>

str1 = 'Hi, I am Shirley Hilton. I am his wife.'
print(re.search(r'hi', str1))
print(re.findall(r'\bhi|\bam\b', str1))

<re.Match object; span=(10, 12), match=‘hi’>
[‘am’, ‘am’, ‘hi’]

3、安装和使用jieba

jieba: 一个支持中文分词、高准确率、高效率的Python中文分词组件

三种分词模式:
(1)精确模式:最精确,用于 文本分析;
(2)全模式:扫描所有成词的词语,速度快,无法解决 歧义问题
(3)搜索引擎模式:精确模式基础上对 长词 再次切分,提高 召回率

import jieba
seq_list = jieba.cut('我来到北京清华大学', cut_all=True)
print('Full Mode:', '/'.join(seq_list))
print('-----------------------------------------')
seq_list = jieba.cut('我来到北京清华大学')
print(type(seq_list))
print('Default Mode:', '/'.join(seq_list))
print('-----------------------------------------')
seq_list = jieba.cut_for_search('我来到北京清华大学')
print('搜索引擎模式:', '/'.join(seq_list))
print('-----------------------------------------')
seq_list = jieba.cut('我来到北京清华大学')
for word in seq_list:
    print(word, end = ' ')
    
# 输出:
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\xue\AppData\Local\Temp\jieba.cache
Loading model cost 1.601 seconds.
Prefix dict has been built successfully.
Full Mode:/来到/北京/清华/清华大学/华大/大学
-----------------------------------------
<class 'generator'>
Default Mode:/来到/北京/清华大学
-----------------------------------------
搜索引擎模式: 我/来到/北京/清华/华大/大学/清华大学
-----------------------------------------
我 来到 北京 清华大学 

4、为jieba添加自定义词典

import jieba
jieba.load_userdict('dict.txt')
text = '故宫的著名景点包括乾清宫、太和殿和黄琉璃瓦等'
seg_list = jieba.cut(text, cut_all=False)
print('[精确模式]:', '/'.join(seg_list))

[精确模式]: 故宫/的/著名景点/包括/乾/清宫/、/太和殿/和/黄琉璃瓦/等

5、文本分类的关键词提取

import jieba.analyse

jieba.load_userdict('dict.txt')
text = '著名景点有乾清宫、太和殿和午门等,其中乾清宫非常精美,午门是紫禁城的正门,午门居中向阳'
seg_list = jieba.cut(text, cut_all=False)
print('分词结果:', '/'.join(seg_list))
tags = jieba.analyse.extract_tags(text, topK=5)
print('关键词:', ' '.join(tags))
tags = jieba.analyse.extract_tags(text, topK=5, withWeight=True)

print(tags)

分词结果: 著名景点/有/乾/清宫/、/太和殿/和/午门/等/,/其中/乾/清宫/非常/精美/,/午门/是/紫禁城/的/正门/,/午门/居中/向阳
关键词: 午门 清宫 著名景点 太和殿 向阳
[(‘午门’, 1.820036974397143), (‘清宫’, 1.0649939760842857), (‘著名景点’, 0.9929055465714286), (‘太和殿’, 0.7259291452642858), (‘向阳’, 0.6611633394878572)]

6、deque(双向队列)

from collections import deque

d = deque()
d.append(3)
d.append(8)
d.append(1)

d

deque([3, 8, 1])

d.appendleft(7)
print(d)

deque([7, 3, 8, 1])

d.popleft()
print(d)

deque([3, 8, 1])

d = deque(maxlen = 20)  # 双向队列满了之后,另一边会自动删除
for i in range(30):
    d.append(str(i))
print(d)

deque([‘10’, ‘11’, ‘12’, ‘13’, ‘14’, ‘15’, ‘16’, ‘17’, ‘18’, ‘19’, ‘20’, ‘21’, ‘22’, ‘23’, ‘24’, ‘25’, ‘26’, ‘27’, ‘28’, ‘29’], maxlen=20)

d = deque([1, 2, 3, 4, 5])
d.extend([0, 10])
print(d)
d.extendleft([6, 7, 8])
print(d)

deque([1, 2, 3, 4, 5, 0, 10])
deque([8, 7, 6, 1, 2, 3, 4, 5, 0, 10])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值