使用Python为收藏网站构建搜索引擎
我想做一个搜索引擎,主要是用我保存的书签文件,这个文件是CSV格式的。
我有很多和教育资源相关的书签,我希望能通过这个搜索引擎来快速找到某个特定主题或科目的相关内容。
我编程水平不太高(能写一些简单的C++和Java程序),最近刚开始学习Python。
我想知道,像这样的项目在一个月内能完成吗?
我查了一下,发现Python里有一个CSV模块,我唯一想到的就是在Udacity的CS101课程中学到的用Python做搜索引擎的项目。
我想问问,这个项目可行吗?我应该从哪里开始呢?
2 个回答
是的,Udacity的CS101课程是一个很好的入门选择。我大约在1到2年前完成了这个课程。它会一步一步教你用Python来构建一个搜索引擎。如果你以一个普通的速度学习,大约两周就能完成这个课程。理解了课程内容后,你就可以开始用你自己收藏的内容进行练习了。
我在工作中用Perl和Python实现了一个搜索引擎。第一个是为了处理一个生产问题匆忙搭建的,花了我2个小时,从构想到运行。现在我想把最终版本开源,但不太确定从哪里开始,因为这是为雇主做的工作。无论如何,这里是算法:
st={} #dictonary for search engine tree
for bokm in bookmarks:
bokm=re.sub('\W_',' ',bokm).toupper() #filter out junk chars
ct = st; #cursor for traversing and building our tree
for c in bokm.split():
if not ct[c]: ct[c]={}
ct = ct[c]
到这个时候,你已经有了一个由字符组成的字典树,里面存放着你的书签。这个算法只会从书签的开头开始查找匹配项,你可以修改算法,从任何一个单词开始进行哈希查找。确保使用pprint.pprint(st)来看看它的美丽之处。
假设你现在在搜索,输入了“dog”这个词:
def search(word, st):
word=re.sub('\W_',' ',word).toupper() #pass word through same filter!
ct = st #init our cursor
for c in word.split():
try:
ct = ct[c] #traverse the tree
except KeyError:
return False #pattern diverged, no match
return True #run out of word chars and every character matched. Found a match!
你几乎可以直接把这个代码放进去开始使用。它不会返回匹配了哪个模式,你需要在搜索树的分支末尾记录下来,然后在最后一个搜索字符后递归遍历子树,打印出所有匹配的书签。
附注:实现单词搜索的方法有很多种。这种方法的好处在于,它几乎可以瞬间找到匹配项,无论你的书签文件有多大。第二个好处是,search()可以修改为在你输入时实时显示结果,每按一个键,它都会逐个字符地遍历书签树,并且这个过程是瞬间完成的。