尝试使用python模拟搜索引擎工作原理,做一个简单的搜索引擎
搜索引擎原理简单的来解释通过检索输入信息中的索引来返回索引对应的信息,所以主要的算法有两个:一是检索信息中是否存在索引,二是索引对应数据库中的信息。
检索信息中是否存在索引
我是选择的直接扫描输入信息中是否包含索引库中的索引,非常简单暴力的方法。
import list1 #list1指索引库
keywords = input()
if key not in list1():
list_temporary_storage = []
# 临时列表,将筛选出来的有效键临时储存
dictionary_temporary_storage = {}
# 临时字典,将筛选出来的有效键和对应的字符串长度储存
for key_exist in dictionary.keys():
if key_exist in key:
list_temporary_storage.append(key_exist)
# 筛选有效键(当字典中存在的键在问题中时,判断该键为有效键)
else:
continue
if len(list_temporary_storage) == 0:
# 临时列表长度为零即字典中没有键和有效键,记录新键
new_reply = input()
if new_reply.lower() == 'none':
return '好吧'
elif type(new_reply.lower()) is str:
with open(r'data_base/replenish_dictionary.txt', 'a') as f:
f.write(str(key) + ' ' + str(new_reply))
f.write('\n')
# 将问题与回答加入txt文件,使得信息得以保存
return ''
elif type(new_reply) is int:
with open(r'date_base/dict.txt', 'a')as f:
f.write(str(key) + ' ' + new_reply)
f.write('\n')
return '数据库更新成功'
else:
for efficacious_key in list_temporary_storage:
dictionary_temporary_storage[efficacious_key] = len(efficacious_key)
# 在临时字典中添加有效键和对应的有效键长度
list_temporary_storage_2 = list(dictionary_temporary_storage.items())
# 将临时字典中的键值对转化为元组储存在临时列表2中
list_temporary_storage_2.sort(key=lambda x: x[1], reverse=True)
# 对临时列表2中的元组按照第二个元素从大到小排列(使第一个元组中的第一个元素为最长的有效键)
list_temporary_storage_3 = [x[0] for x in list_temporary_storage_2]
# 将元组中的第一个元素储存到临时列表3中
if type(dictionary[list_temporary_storage_3[0]]) is list:
# 判断最长的有效键对应的值是否为列表
import random
if '因为' or '所以' or ',' or ',' in key:
number = random.choice(range(1, len(dictionary[list_temporary_storage_3[0]])))
# 去掉第一个回答
else:
number = random.choice(range(0, len(dictionary[list_temporary_storage_3[0]])))
# 在列表中任选一个答案回答
print(dictionary[list_temporary_storage_3[0]][number])
elif type(dictionary[list_temporary_storage_3[0]]) is str:
# 当数据类型为字符串时
print(dictionary[list_temporary_storage_3[0]])
# 直接返回键对应的值
elif type(dictionary[list_temporary_storage_3[0]]) is int:
dictionary[list_temporary_storage_3[0]] = str(dictionary[list_temporary_storage_3[0]])
# 当数据类型为整型时,先将数据类型改为字符串,便于调取相应的文件
filepath = 'data_base/1/' + dictionary[list_temporary_storage_3[0]] + '/' \
+ dictionary[list_temporary_storage_3[0]] + '.txt'
file_open = open(filepath.rstrip())
information = file_open.read()
print(information)
file_open.close()
del list_temporary_storage_2
del list_temporary_storage_3
return ''
del list_temporary_storage
del dictionary_temporary_storage
# 删除临时列表和字典
else:
# 同42到62行
if type(dictionary[key]) is list:
# 判断最长的有效键对应的值是否为列表
import random
number = random.choice(range(0, len(dictionary[key])))
# 在列表中任选一个答案回答
print(dictionary[key][number])
elif type(dictionary[key]) is str:
# 当数据类型为字符串时
print(dictionary[key])
# 直接返回键对应的值
elif type(dictionary[key]) is int:
dictionary[key] = str(dictionary[key])
# 当数据类型为整型时,先将数据类型改为字符串,便于调取相应的文件
filepath = 'data_base/1/' + dictionary[key] + '/' + dictionary[key] + '.txt'
file_open = open(filepath.rstrip())
information = file_open.read()
print(information)
索引对应数据库中的信息
我一下就想到的是用字典中的键值对来表示索引对应数据,同时为了可以让数据库可以更新而把数据库单独拎了出来用txt文本文档来记录
def txt_read(files):
"""将txt文件中的信息改为字典写入"""
txt_dict = {}
file_open = open(files.rstrip())
for line in file_open.readlines():
line = str(line).replace("\n", " ")
txt_dict[line.split(' ', 1)[0]] = line.split(' ', 1)[1]
# split()函数用法,逗号前面是以什么来分割,后面是分割成n+1个部分,且以数组形式从0开始
file_open.close()
return txt_dict
def txt_read_1(files):
"""将另外一个用于记录历史事件txt文件中的信息改为字典写入"""
txt_dict_1 = {}
file_open = open(files.rstrip(), encoding="UTF-8")
for line in file_open.readlines():
line = str(line).replace("\n", " ")
path = line.split('/', 1)[-1]
txt_dict_1[line.split('/', 1)[0]] = int(path)
file_open.close()
return txt_dict_1
txt文件
今年是中国共产党建党一百周年,所以数据库选的是党史
我还单独写了一个计时的部分,可以作为长时间不使用提醒,为了和搜索引擎同时进行,创立一个子进程。
计时模块(timecheck.py)
import time
import os
def timecheck():
"""用于计时和作出超时反应"""
n = 0 # 每次循环刷新n值
while True: # 这是一个无限循环!
if n < 60:
time.sleep(1) # 每一秒钟检测一次n值
n += 1
elif n >= 60:
os.system('cls') # 页面刷新
print('你已经有60秒没有跟我说话了哦,我会寂寞的哦\n如果还不会用的话可以试试输入‘说明’')
print('输入区:')
time.sleep(300) # 每次执行一次超时提醒后5分钟不做提示
子进程
from multiprocessing import Process
from functions.timecheck import timecheck
import os
import time
if __name__ == '__main__':
while True:
P = Process(target=timecheck, args=()) # 调用timecheck函数发起子进程
P.start() # 子进程时间检测与父进程判断一起运行
keywords = input('输入区:')
P.terminate() # 当输入后强制结束进程
到这里基本上整个搜索引擎已经构建完成了,不过只是完成了一个不完整的搜索引擎,商用的搜索引擎还有网络爬虫来自动更新数据库(当然商用的搜索引擎也不是用python写的),像索引中的分词这里也没有还原,也还有很多更先进的技术就不提及了,这里的搜索引擎只能算是为了学习编程语言的项目。
点击这里下载文件:搜索引擎文件
欢迎大家评论说说自己的意见