建立索引:

索引就像图书馆每个书架上的小牌子,你要找某一本书,譬如一本学习python语言的书,你就先搜索“信息与计算机分部”,然后搜索“编程语言”,这样就可以在相应的架子上找到你想找的书了。搜索引擎的索引与此类似,所不同的是它会为所有网页的每个词语都建立索引,当你输入一串搜索字符串,程序会先进行分词,然后再依照每个词的索引找到相应网页。比如在搜索框中输入“从前有座山山里有座庙 小和尚”,搜索引擎首先会对字符串进行分词处理“从前/有/座山/山里/有/座庙/小和尚”,然后按照一定规则对词做布尔运算,比如每个词之间做“与”运算,然后在索引里搜索“同时”包含这些词的页面。当然在本篇中的这个简陋的引擎的索引功能也非常简陋,首先它是一个英文的搜索引擎分词相对简单(中日韩文的分词就比较复杂,例如“北京大学生”,怎么才能识别并分成"北京/大学生",而不是"北京大学/生"),其次它每次只能提交一个词来做查询词,包含多词的字符串输入就查不到页面了。。。(当然读者可以自己加上多词查询,如果不考虑太复杂的逻辑运算规则,让所有词做“与”运算,这个功能还是很容易实现的)

网页排名(page rank):

这个以谷歌创始人Larry Page命名的算法大概是互联网最著名的算法了,当年这个算法,帮助谷歌在搜索质量上一举打败了当时最流行的Yahoo,AltaVista等引擎,为谷歌崛起成为世界上最了不起的科技巨头立下了汗马功劳。

page rank是用来衡量网页质量如何的,索引找到的网页会用pagerank算法计算出一个PR值,这个得分在呈现结果排序中占一定权重,得分高的网页将被排在前面显示给用户。那么它是怎么实现的呢?它基于这样一种假设,越多的网页链接到这个网页,说明这个网页的在整个网络中受认可的程度越高,也即这个网页质量越好——这等同于互联网上其他所有网页给它投票,有一个链到它的链接说明给它投了一票,票数越高越好。但是是不是所有的票数权重都一样呢?显然不是的,链接到这个网页的网页本身PR值越高,则其投票的权重应该越大,这就好像董事会投票大股东的一票比小股东的一票更有份量。但这就存在一个问题了,你要知道一个页面的PR值就需要知道链接到它的页面的PR值,而链接到它的页面的PR值又需要依赖于其他页面的PR值,如此一直追究下去就变成了鸡生蛋蛋生鸡的问题了。现假设初始条件,互联网所有页面PR值的初始值为1/N,N是整个网络页面的总数,那么用

公式进行迭代,其中p(j)代表链接到p(i)的网页,Lp(j)代表这个页面中链接的数目,之所以要除以页面链接数量,这是很好理解的,当一个页面链接数量很多时,它每个链接投票的份量就相应地被分散了。可以证明,按照这个公式求取每个页面i的值,并进行迭代,当迭代很多轮时,PRp(i)的值会趋于一个稳定值,在应用中迭代次数一般取10次,超过10次以后PRp(i)的值变化就很小了。

现在还是存在一个问题,如果一个页面没有任何外部页面链接到它,那么它的PR值就是0了呢?为了使PRp(i)函数能够更平滑,我们在公式里增添一个阻尼系数d,在这里我们不妨取0.8,公式变成如下形式:

这样的话即使某个页面孤立存在,它的PR值也不至于变为零,而是一个很小的值。我们也可以从另一个角度理解阻尼系数,PR值衡量的其实是某个页面被访问的可能性的大小,链接到它的网页越多,通过这些链接点开它的可能性当然就越大,但在没有任何外部链接的情况下,一个网页是不是就不可能被访问呢?当然不是,因为还可以从地址框直接键入url访问,而且也会有人希望通过搜索引擎找到这个页面,所以我们在公式里加了阻尼系数,当然这里给1-d取一个比较小的数才可以。

当然了,网页PR值也不是唯一一个决定网页排名的因素,页面和用户搜索词(query)的相关程度也是重要的衡量因素,与搜索词相关度越高的页面应该放在越前面显示给用户。关于相关程度的算法,以及网页排名的其他注意事项,将在下一篇博文中介绍。

2.用python实现一个搜索引擎的原型

为什么是 Python:

首先,我们要明白,这是一篇菜鸟给菜鸟写的新手科普文,也是菜鸟自己刚刚上完搜索udacity引擎这门课以后给自己写的一个课程总结笔记。我觉得Python应该是菜鸟最好的一门入门语言了,鉴于它简明的语法、动态语言都有的垃圾自动回收机制、丰富方便的内置数据结构和方法、网络上丰富的开源库和开源框架,这门语言几乎什么都能干,而且干什么都很方便。虽然从性能上讲,这种解释型语言都是渣渣,虽然从编程思想上讲,它不像Lisp这种东西是实现满版都是括号递归的——但是,我们是菜鸟新手,我们的层次还没太多机会去接触这些问题呢!而和大学标配入门语言C和C++比起来,python真是简单到不知道哪里去了(我真怀疑,就大学那点c的学习,如果没有额外的用功,能用c写点什么出来呢?随便写点什么都要被乱七八糟的指针和老也分配不对的内存搞死啊。)另外,在接下来的代码里头,你会看到python的内置结构和方法是多么适合写这类文本处理的东西啊。OK,talk is cheap,show you my code!Hey we go!

#the search engine is divided into 3 modules:web crawl,build and use of index,page rank#----------------------------web_crawl--------------------------------defget_page(url):try:importurllibreturnurllib.urlopen(url).read()except:return""defget_next_target(page):start_link=page.find(', [list of pages it links to]index={}whiletocrawl:page=tocrawl.pop()ifpagenotincrawled:content=get_page(page)add_page_to_index(index,page,content)outlinks=get_all_links(content)graph[page]=outlinksunion(tocrawl,outlinks)crawled.append(page)returnindex,graph#--------------------------------build_index-----------------------------------defadd_page_to_index(index,url,content):words=content.split()forwordinwords:add_to_index(index,word,url)defadd_to_index(index,keyword,url):ifkeywordinindex:index[keyword].append(url)else:index[keyword]=[url]deflookup(index,keyword):ifkeywordinindex:returnindex[keyword]else:returnNone#---------------------------------page_rank---------------------------------defcompute_ranks(graph):d=0.8# damping factornumloops=10ranks={}npages=len(graph)forpageingraph:ranks[page]=1.0/npagesforiinrange(0,numloops):newranks={}forpageingraph:newrank=(1-d)/npagesfornodeingraph:ifpageingraph[node]:newrank=newrank+d*(ranks[node]/len(graph[node]))newranks[page]=newrankranks=newranksreturnranksdefquick_sort(url_lst,ranks):url_sorted_worse=[]url_sorted_better=[]iflen(url_lst)<=1:returnurl_lstpivot=url_lst[0]forurlinurl_lst[1:]:ifranks[url]<=ranks[pivot]:url_sorted_worse.append(url)else:url_sorted_better.append(url)returnquick_sort(url_sorted_better,ranks)+[pivot]+quick_sort(url_sorted_worse,ranks)defordered_search(index,ranks,keyword):ifkeywordinindex:all_urls=index[keyword]else:returnNonereturnquick_sort(all_urls,ranks)#---------------------------------test-----------------------------------index,graph=crawl_web('http://udacity.com/cs101x/urank/index.html')ranks=compute_ranks(graph)printordered_search(index,ranks,'Hummus')#>>> ['http://udacity.com/cs101x/urank/kathleen.html',# 'http://udacity.com/cs101x/urank/nickel.html',# 'http://udacity.com/cs101x/urank/arsenic.html',# 'http://udacity.com/cs101x/urank/hummus.html',# 'http://udacity.com/cs101x/urank/index.html']#print ordered_search(index, ranks, 'the')#>>> ['http://udacity.com/cs101x/urank/nickel.html',# 'http://udacity.com/cs101x/urank/arsenic.html',# 'http://udacity.com/cs101x/urank/hummus.html',# 'http://udacity.com/cs101x/urank/index.html']#print ordered_search(index, ranks, 'babaganoush')#>>> None本文章出自http://073palmer.blogspot.com/2012/06/python.html

对于初步了解搜索引擎的朋友启发很大,以上代码在ide 中测试过了,性能有待提升;有兴趣的朋友欢迎留言讨论。

python搜索软件或应用_搜索引擎(简陋版)python相关推荐

  1. python制作软件很复杂_零基础学Python难吗,或者有什么其他数据加工软件推荐?...

    之前因为一个问题的回答:零基础想系统的学习金融学.量化投资.数据分析.Python,需要哪些课程和书籍.获赞1000+.大概整理一下之前的答案,回答下这个问题. 金融领域的量化分析如今是很受重视的,所 ...

  2. 学python去哪做项目_有哪些适合 Python 刚入门者去做的项目?

    学软件开发的都知道实战项目对于学好一门语言是很重要的.在这里可以向大家推荐几个Python实战项目 项目1.Python 图片转字符画 本课程用 50 行 Python 代码完成图片转字符画小工具.通 ...

  3. python 的库如何开发_一篇文章入门Python生态系统

    译者按:原文写于2011年末,虽然文中关于Python 3的一些说法可以说已经不成立了,但是作为一篇面向从其他语言转型到Python的程序员来说,本文对Python的生态系统还是做了较为全面的介绍.文 ...

  4. python零基础书推荐_零基础学习Python(Python初学者、Python入门)常见问题:资料、社区、书籍推荐...

    Python web开发 QQ学习群:338985564 ,欢迎各位加入,一起学习. 本文针对零基础的,想学习Python者.本文会不定时更新. 一.学会使用搜索引擎,尤其是Google. 推荐阅读文 ...

  5. python能开发什么产品_三周学 Python ?不,三周做个产品

    我的同事在看到毫无开发经验的我用三周时间,不但从零基础用上了 Python,还做出了一个客户关系管理系统,强烈邀请我分享经验.惶恐,因为我并没有出色的智商,也没有觉得三周学 Python 是一个体现自 ...

  6. python后端开发学什么_零基础学Python,这是阿里Python8年开发经验写给你的学习路线图...

    今天给大家分享一位前辈整理的一个Python web学习路线.这位前辈由于有编程基础,所以采用了自学Python的方式.学完后主要做后端开发.希望对你有所启发. 整理的一个 python web 学习 ...

  7. python导入模块的常用方法_(9)python模块的定义、导入、优化,常用模块

    [1]模块的定义 模块:用来从逻辑上组织python代码(变量,函数,类,逻辑等:核心就是实现一个功能)本质上就是.py结尾的 python 文件 比如: 文件名 test.py ,对应的模块名就是 ...

  8. python搜索文献 速成_0基础5天速成Python,你也能发top期刊

    最近在后台有很多朋友留言: "马上要毕业了,每天在家里找文献,写论文,但是校园网下载有限制.谷歌学术又经常崩,毕业论文一大堆参考文献需要导入,我该怎么办?" 作为研究人员,大家很多 ...

  9. 趣学python教孩子学编程_《趣学Python——教孩子学编程》学习笔记第1-3章

    第1章 Python不是大蟒蛇 1.1 关于计算机语言 计算机程序是一组让计算机执行某种动作的指令.软件就是计算机程序的集合. 一种编程语言就是一种特定的与计算机交谈的方式,这种方式使用计算机和人都能 ...

最新文章

  1. Docker学习(三)-----Docker镜像常用命令
  2. 反欺诈中所用到的机器学习模型有哪些?
  3. xshell如何登陆堡垒机_Xshell连接有跳板机(堡垒机)的服务器
  4. php转java知乎_php程序员来谈谈php和java
  5. c语言程序执行时无法输入字符串,C语言程序设计中键盘输入数据的方法分析
  6. VS网站开发的发布部署的不同情况说明
  7. Caffe学习笔记2
  8. 分享SharpZipLip使用代码
  9. JavaSE——常用类库(String类)
  10. stat在python中_stat模块接口
  11. 第二百五十八天 how can I 坚持
  12. 记录接触过的开源与非开源
  13. 计算最大值和最小值(分治法)
  14. java web/Maven项目结构分析
  15. 面向对象分析和设计的几个关键步骤_超市设计中不容忽视的小细节
  16. 速读原著-Android应用开发入门教程(应用程序开发的结构)
  17. 【开源之美】nanomsg(2) :req/rep 模式
  18. linux下合并多个文件夹内容成为一个文件夹
  19. 无插件纯Web HTML5 3D机房 进阶篇(新增设备、线缆、巡查等功能)
  20. 隐藏服务器header与web软件版本信息

热门文章

  1. 让百度搜索结果出现图片
  2. linux signal(附常见的信号含义)
  3. 路由器修改html加广告,openwrt利用Privoxy实现js广告植入
  4. csdn排名上升规则测试
  5. 市场分析:洞悉客户决策过程
  6. linux用cvs提交新文件夹,使用CVS进行项目开发管理
  7. 关于 SAP Spartacus 重定向部分外部 url 到后台系统的问题
  8. steam搬砖项目:靠谱吗,细说下搬砖的核心内容
  9. mysql要求cpu主频还是核数_CPU主频和核数哪个重要 CPU高主频好还是多核数好
  10. 物联网设备数据是如何流转的:基于EMQX与TDengine的前后端分离项目实践