NLP第二课(搜索)
最近压力太大了,持续性修改0注释的代码,变量为阿拉伯数字的代码,压力山大,摆正心态,没有那些bug,还需要我们来做些什么呢?如果一个特别出色的项目,也体现不出来你个人的出色。几句牢骚,我们今天来继续说下NLP。
我们先来抛出一个问题,我们要坐地跌,从西直门站到苏州街站,我们在北京的小伙伴都知道,坐4号线,然后在海淀黄庄换成10号线就到了,或者我们直接打开导航,搜一下就可以了。说起来很简单,想起来也很简单,但是做起来不是那么简单了。我们现有所有线路的站点,以及换成车站的数据(爬取过程略去)。我们现有的数据是这样的:
1号线:
苹果园-古城-八角游乐园-八宝山-玉泉路-五棵松-万寿路-公主坟-军事博物馆-木樨地-南礼士路-复兴门-西单-天安门西-天安门东-王府井-东单-建国门-永安里-国贸-大望路-四惠-四惠东
2号线:
西直门-积水潭-鼓楼大街-安定门-雍和宫-东直门-东四十条-朝阳门-建国门-北京站-崇文门-前门-和平门-宣武门-长椿街-复兴门-阜成门-车公庄-(西直门)
4号线:
国家图书馆-动物园-西直门-新街口-平安里-西四-灵境胡同-西单-宣武门-菜市口-陶然亭-北京南站-马家堡-角门西-公益西桥
5号线:
宋家庄-刘家窑-蒲黄榆-天坛东门-磁器口-崇文门-东单-灯市口-东四-张自忠路-北新桥-雍和宫-和平里北街-和平西桥-惠新西街南口-惠新西街北口-大屯路东-北苑路北-立水桥南-立水桥-天通苑南-天通苑-天通苑北
6号线:
金安桥-苹果园-杨庄-西黄村-廖公庄-田村-海淀五路居-慈寿寺-花园桥-白石桥南-车公庄西-车公庄-平安里-北海北-南锣鼓巷-东四-朝阳门-东大桥-呼家楼-金台路-十里堡-青年路-褡裢坡-黄渠-常营-草房-物资学院-通州北关-通运门-北运河西-北运河东-郝家府-东夏园-潞城
7号线:
北京西站-湾子-达官营-广安门内-菜市口-虎坊桥-珠市口-桥湾-磁器口-广渠门内-广渠门外-双井-九龙山-大郊亭-百子湾-化工-南楼梓庄-欢乐谷景区-垡头-双合-焦化厂
8号线北:
朱辛庄-育知路-平西府-回龙观东大街-霍营-育新-西小口-永泰庄-林萃桥-森林公园南门-奥林匹克公园-奥体中心-北土城-安华桥-安德里北街-鼓楼大街-什刹海-南锣鼓巷-中国美术馆
8号线南:
珠市口-天桥-永定门外-木樨园-海户屯-大红门-大红门南-和义-东高地-火箭万源-五福堂-德茂-瀛海
9号线:
郭公庄-丰台科技园-科怡路-丰台南路-丰台东大街-七里庄-六里桥-六里桥东-北京西站-军事博物馆-白堆子-白石桥南-国家图书馆
10号线:
巴沟-苏州街-海淀黄庄-知春里-知春路-西土城-牡丹园-健德门-北土城-安贞门-惠新西街南口-芍药居-太阳宫-三元桥-亮马桥-农业展览馆-团结湖-呼家楼-金台夕照-国贸-双井-劲松-潘家园-十里河-分钟寺-成寿寺-宋家庄-石榴庄-大红
门-角门东-角门西-草桥-纪家庙-首经贸-丰台站-泥洼-西局-六里桥-莲花桥-公主坟-西钓鱼台-慈寿寺-车道沟-长春桥-火器营-(巴沟)
13号线:
西直门-大钟寺-知春路-五道口-上地-西二旗-龙泽-回龙观-霍营-立水桥-北苑-望京西-芍药居-光熙门-柳芳-东直门
14号线西:
张郭庄-园博园-大瓦窑-郭庄子-大井-七里庄-西局
14号线东:
北京南站-陶然桥-永定门外-景泰-蒲黄榆-方庄-十里河-北工大西门-平乐园-九龙山-大望路-金台路-朝阳公园-枣营-东风北桥-将台-高家园-望京南-阜通-望京-东湖渠-来广营-善各庄
15号线:
俸伯-顺义-石门-南法信-后沙峪-花梨坎-国展-孙河-马泉营-崔各庄-望京东-望京-望京西-关庄-大屯路东-安立路-奥林匹克公园-北沙滩-六道口-清华东路西口
16号线:
西苑-农大南路-马连洼-西北旺-永丰南-永丰-屯佃-稻香湖路-温阳路-北安河
八通线:
四惠-四惠东-高碑店-传媒大学-双桥-管庄-八里桥-通州北苑-果园-九棵树-梨园-临河里-土桥
昌平线
昌平西山口-十三陵景区-昌平-昌平东关-北邵洼-南邵-沙河高教园-沙河-巩华城-朱辛庄-生命科学园-西二旗
亦庄线:
宋家庄-肖村-小红门-旧宫-亦庄桥-亦庄文化园-万源街-荣京东街-荣昌东街-同济南路-经海路-次渠南-次渠-亦庄火车站
房山线:
郭公庄-大葆台-稻田-长阳-篱笆房-广阳城-良乡大学城北-良乡大学城-良乡大学城西-良乡南关-苏庄-阎村东
机场线
东直门-三元桥-3号航站楼-2号航站楼
大兴线
公益西桥-新宫-西红门-高米店北-高米店南-枣园-清源路-黄村西大街-黄村火车站-义和庄-生物医药基地-天宫院
S1线
石厂-小园-栗园庄-上岸-桥户营-四道桥-金安桥
西郊线
巴沟-颐和园西门-茶棚-万安-植物园-香山
数据大概就这些,那么我们怎么来搜索我们想要的数据呢?我们还是先分析一下我们的问题。我们要从西直门出发,到达苏州街,很容易我们就知道了我们要做4号线,然后呢?然后我们去哪?
我们在西直门上车以后,有积水潭,新街口,动物园,大钟寺,车公庄。这5个方向可以选择。我们先(随便)写一个程序,不管是哪,先走着。
我们现将数据清洗一下,变成我们想要的样子:{'苹果园': ['古城', '金安桥', '杨庄'], '古城': ['苹果园', '八角游乐园'], '八角游乐园': ['古城', '八宝山'], '八宝山': ['八角游乐园', '玉泉路'], '玉泉路': ['八宝山', '五棵松'], '五棵松': ['玉泉路', '万寿路'], '万寿路': ['五棵松', '公主坟'], '公主坟': ['万寿路', '军事博物馆', '莲花桥', '西钓鱼台'], '军事博物馆': ['公主坟', '木樨地', '北京西站', '白堆子'], '木樨地': ['军事博物馆', '南礼士路'], '南礼士路': ['木樨地', '复兴门'], '复兴门': ['南礼士路', '西单', '长椿街', '阜成门'], '西单': ['复兴门', '天安门西', '宣武门', '灵境胡同'], '天安门西': ['西单', '天安门东'], '天安门东': ['天安门西', '王府井'], ...},也就是这样的。我们用每一个站当作key,可以到达的车站我们设置为value列表。
然后我们先来看一下我们的代码吧
def breadth_first_search(start, arrive, connrction_grpah):
pathes = [[start]]
visitied = set() while pathes:
path = pathes.pop(0)
froninter = path[-1] if froninter in visitied:
continue
successors = connrction_grpah[froninter] for city in successors:
new_path = path + [city]
pathes.append(new_path) if city == arrive:
return new_path
visitied.add(froninter)
我们可以看得出来,我们拿到我们的始发站,然后去我们刚才清洗的字典里遍历,可以得到我们由始发站可以到达的第一站,然后我们在依次遍历这些站。我们可以看到,我们先遍历一站就到的车站,然后再依次遍历两站可以到达的车站,依次类推,我们可以看到,我们遍历了所以我们到达的车站,是一层层遍历的,这里引出我们今天想说的,也就是广度优先遍历。举一个栗子,就是我们遍历一个大树,我们先优先获得主干,先看主干有没有我们想要的,没有,好,我们继续,在看枝干,然后再看叶子,也就是说我们的每一层是几乎同时遍历的搜索遍历的,与此相反,我们还有一个深度优先搜索,我们来看一下代码
def depth_first_search(start, arrive, connrction_grpah):
pathes = [[start]]
visitied = set() while pathes:
path = pathes.pop(0)
froninter = path[-1] if froninter in visitied:
continue
successors = connrction_grpah[froninter] for city in successors:
if city in path:
continue
new_path = path + [city]
pathes.append(new_path) if city == arrive:
return new_path
visitied.add(froninter)
pathes = sorted(pathes, key=len, reverse=True)
和上一个代码几乎一样的,只不过加了一个排序,也是说,我们拿到了新的线路,我们还是会继续搜索该线路,直到该条路走不通了,我们才会继续走另外的路,也就是上面说的,我们先看大树的主干,然后看枝干,看叶子,再回过头来,再看另一个枝干,另一个叶子,这也就是我们说的深度优先搜索。
这篇博客写的比较仓促,时间比较紧,工作压力大,而且我也是第一次接触算法,很多知识还有待学习,开始的时候我认为我的python基础还可以,实操起来却不是那样了。
我们下篇博客回来说说导数和梯度下降,来得及就再说一下基于导数来作拟合的操作。
NLP第二课(搜索)的更多相关文章
- Kali Linux Web 渗透测试视频教程— 第二课 google hack 实战
Kali Linux Web 渗透测试— 第二课 代理简介 文/玄魂 课程地址: http://edu.51cto.com/course/course_id-1887.html 目录 shellKal ...
- 【C++探索之旅】第一部分第二课:C++编程的必要软件
内容简介 1.第一部分第二课:C++编程的必要软件 2.第一部分第三课预告:第一个C++程序 C++编程的必要软件 经过上一课之后,大家是不是摩拳擦掌,准备大干一场了呢. 这一课我们来做一些C++开发 ...
- 【C语言探索之旅】 第三部分第二课:SDL开发游戏之创建窗口和画布
内容简介 1.第三部分第二课: SDL开发游戏之创建窗口和画布 2.第三部分第三课预告: SDL开发游戏之显示图像 第三部分第二课:SDL开发游戏之创建窗口和画布 在上一课中,我们对SDL这个开源库做 ...
- 【C语言探索之旅】 第二部分第二课:进击的指针,C语言的王牌!
内容简介 1.课程大纲 2.第二部分第二课: 进击的指针,C语言的王牌 3.第二部分第三课预告: 数组 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言 ...
- 【C语言探索之旅】 第二课:工欲善其事,必先利其器
内容简介 1.课程大纲 2.第一部分第二课:工欲善其事,必先利其器 3.第一部分第三课预告:你的第一个程序 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C ...
- TCP/IP 网络精讲:OSI七层模型(第二课)
内容简介 1.前言 2.第一部分第二课:互联网的创立,OSI七层模型 3.第一部分第三课预告:OSI第一层,连接你的机器 前言 PS:昨天做了课程大纲之后,发现这个坑挖得有点大.不过既然挖了,岂有不跳 ...
- Elasticsearch7.X 入门学习第二课笔记----基本api操作和CRUD
原文:Elasticsearch7.X 入门学习第二课笔记----基本api操作和CRUD 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链 ...
- CI(CodeIgniter)框架入门教程——第二课 初始MVC
本文转载自:http://www.softeng.cn/?p=53 今天的主要内容是,使用CodeIgniter框架完整的MVC内容来做一个简单的计算器,通过这个计算器,让大家能够体会到我在第一节课中 ...
- OpenCV 第二课 认识图像的存储结构
OpenCV 第二课 认识图像的存储结构 Mat Mat 类包含两部分,矩阵头和矩阵体.矩阵头包含矩阵的大小,存储方式和矩阵体存储空间的指针.因此,Mat中矩阵头的大小是固定的,矩阵体大小是不定的. ...
随机推荐
- 第2个word发布的博客
//接收的为空时,则表示客户端下线,跳出循环 if (r == 0) { break; }; string str = Encoding.UTF8.GetString(buffer, 0, r); ...
- hibernateHQL
HQL 即Hibernate Query Language的缩写 hql和sql区别/异同 HQL ...
- CDN(Content Delivery Network)原理
CDN即内容分发网络,一般包括分发服务系统,负载均衡系统和管理系统. 分发服务系统,其基本的工作单元就是各个cache服务器.负责直接响应用户请求,将内容快速分发到用户:同时还负责内容更新,保证和源站 ...
- JavaScript操作数据库JS操作Access数据库
avaScript操作数据库JS操作Access数据库,跟其他语言操作差不多,总结了一下习惯代码,仅供参考学习.现在在F盘有文件abc.mdf,表名为Student,一共2个字段,Id数字类型主键,s ...
- 查找发布地图的 REST URL并查询相关信息
1.登录ArcGIS Server Manager 2.登录后,里面是以前自己发布的地图服务 3.点击自己发布的地图,然后按下功能选项,再点击箭头来找到URL 4.点击进去,分别能从红圈中找到相关的信 ...
- Gradle Wrapper简述
个人博客:http://www.enjoytoday.cn Gradle更多介绍参考:http://www.enjoytoday.cn/categorys/Gradle 案例源码:GitHub gra ...
- [b0037] python 归纳 (二二)_多进程数据共享和同步_管道Pipe
# -*- coding: utf-8 -*- """ 多进程数据共享 管道Pipe 逻辑: 2个进程,各自发送数据到管道,对方从管道中取到数据 总结: 1.只适合两个进 ...
- 以聚合数据免费接口为例,通过 Class 类继承方法,让小程序实现项目化接口调用
微信小程序数据来源,是通过接口实现的.但接口如何调,数据如何取?每个人都有不同的方法,下面以聚合数据免费接口为例. 配置接口 config.js 聚合数据请求接口需要以key作为参数. const c ...
- shell脚本模板----自动生成开头注释信息
每当我们新建一个shell脚本都要去写一些繁琐的注释信息,这会浪费掉我们很多的时间,有没有感觉很痛苦呢? 哈哈 下面给大家分享一个shell脚本的模板文件,把它拷贝到用户的家目录下并命名成 .vim ...
- 渗透测试学习 十三、 SQLmap使用详解
SQLmap介绍 sqlmap是一个由python语言编写的开源的渗透测试工具,它主要是检测SQL注入漏洞,是一款功能强大的SQL漏洞检测利用工具. 他可以检测的数据库有:access.msSQL.M ...