编辑推荐

《使用C#开发搜索引擎(第2版)》是介绍业界热门的Lucene.Net、使用WebBrowser做爬虫以及结合Solr/ElasticSearch开发ASP.NET搜索的书籍。《使用C#开发搜索引擎(第2版)》还介绍了在线智能客服(聊天机器人)开发框架。从C#语法开始,逐渐深入,是零基础实践面向未来的智能软件开发。对于学习复杂数据结构和自然语言处理相关应用开发也有参考价值。

内容简介

《使用C#开发搜索引擎(第2版)》介绍如何以C#作为工具开发智能搜索引擎系统。
《使用C#开发搜索引擎(第2版)》是一本介绍业界热门的Lucene.Net、使用WebBrowser做爬虫以及结合Solr/ElasticSearch开发ASP.NET搜索的书籍。书中从网络爬虫抓取数据开始;然后介绍中文分词、文本排重等文本挖掘技术和搜索结果展现;最后介绍在线智能客服(聊天机器人)开发框架。从C#语法开始,逐渐深入,是零基础实践面向未来的智能软件开发。
对于学习复杂数据结构和自然语言处理相关应用开发也有参考价值。

作者简介

罗刚,计算机软件硕士,毕业于吉林工业大学。2005年创立北京盈智星科技发展有限公司,2008年联合创立上海数聚软件公司。猎兔搜索创始人,当前猎兔搜索在北京和上海以及石家庄均设有研发部。带领猎兔搜索技术开发团队先后开发出猎兔中文分词系统、猎兔文本挖掘系统,智能垂直搜索系统以及网络信息监测系统等,实现互联网信息的采集、过滤、搜索和实时监测,其开发的搜索软件日用户访问量达万次以上。



目录

第1章使用C#开发搜索引擎
快速入门1
1.1各种搜索引擎2
1.1.1通用搜索3
1.1.2垂直搜索3
1.1.3站内搜索4
1.2搜索引擎的整体结构4
1.3搜索引擎的基本技术5
1.3.1网络爬虫5
1.3.2文本挖掘5
1.3.3全文索引6
1.3.4搜索语法介绍8
1.3.5搜索用户界面8
1.4C#开发快速入门9
1.4.1准备开发环境9
1.4.2基本语法9
1.4.3多维数组11
1.4.4位运算11
1.4.5枚举类型12
1.4.6面向对象13
1.4.7字符串15
1.4.8读写文件16
1.4.9集合类17
1.4.10泛型20
1.4.11委托和事件21
1.4.12lambda表达式24
1.4.13单元测试24
1.4.14扩展方法25
1.4.15类库26
1.5算法基础26
1.5.1双端队列27
1.5.2散列表31
1.5.3单链表36
1.5.4标准Trie树37
1.5.5二叉搜索树39
1.5.6三叉Trie树41
1.5.7平衡Trie树46
1.6本章小结48
1.7术语表48
第2章使用C#开发网络爬虫51
2.1网络爬虫抓取原理52
2.2爬虫架构54
2.2.1基本架构54
2.2.2分布式爬虫架构56
2.2.3垂直爬虫架构57
2.3下载网页58
2.3.1HTTP协议58
2.3.2下载静态网页61
2.3.3下载动态网页65
2.4线程池73
2.5网络爬虫的遍历与实现75
2.6网站地图77
2.7连接池78
2.8URL地址查新79
2.8.1嵌入式数据库79
2.8.2布隆过滤器82
2.9抓取RSS84
2.10解析相对地址86
2.11网页更新86
2.12信息过滤89
2.13垂直行业抓取94
2.14抓取限制应对方法94
2.14.1更换IP地址94
2.14.2抓取需要登录的网页98
2.14.3抓取ASP.net网页100
2.15保存信息103
2.15.1存入数据库103
2.15.2存成图像104
2.16日志105
2.17本章小结108
2.18术语表108
第3章索引各种格式文档113
3.1从HTML文件中提取信息114
3.1.1识别网页的编码114
3.1.2正则表达式116
3.1.3HtmlAgilityPack介绍120
3.1.4NSoup介绍124
3.1.5网页正文提取124
3.1.6结构化信息提取137
3.1.7查看网页的DOM结构140
3.1.8网页结构相似度计算141
3.2从非HTML文件中提取文本143
3.2.1TEXT文件144
3.2.2PDF文件144
3.2.3Office文件146
3.2.4Rtf文件147
3.3OCR148
3.3.1字形识别149
3.3.2图像二值化149
3.4本章小结153
3.5术语表154
第4章自然语言处理155
4.1统计机器学习156
4.2协同推荐157
4.3文档排重163
4.3.1生成SimHash164
4.3.2查找SimHash166
4.3.3用于短文本排重170
4.4中文关键词提取170
4.4.1关键词提取的基本方法171
4.4.2从网页中提取关键词174
4.5相关搜索174
4.6拼写检查175
4.6.1拼写检查的概率模型176
4.6.2模糊匹配问题176
4.6.3英文拼写检查180
4.6.4中文拼写检查183
4.7文本摘要184
4.7.1文本摘要的设计184
4.7.2实现文本摘要技术185
4.7.3Lucene.net中的动态摘要190
4.8文本分类191
4.8.1自动分类的接口定义191
4.8.2自动分类的实现191
4.9自动聚类197
4.9.1文档相似度197
4.9.2K均值聚类方法201
4.9.3K均值实现202
4.10拼音转换204
4.11句法分析树204
4.12信息提取211
4.12.1信息提取的规则及其实现211
4.12.2提取地域信息219
4.13本章小结221
4.14术语表221
第5章用C#实现中文分词223
5.1词224
5.2文本切分的基本方法224
5.3地名切分226
5.3.1地址类型标注227
5.3.2未登录词识别227
5.4有限状态机229
5.5查找词典算法231
5.6中文分词的原理232
5.6.1正向最大长度匹配法232
5.6.2逆向最大长度匹配法236
5.6.3处理未登录串240
5.7中文分词的流程与结构241
5.8切分词图243
5.8.1保存切分词图243
5.8.2生成全切分词图247
5.9概率语言模型的分词方法250
5.9.1准备数据251
5.9.2一元模型252
5.9.3N元模型257
5.10最大熵262
5.11未登录词识别264
5.12词性标注264
5.12.1隐马尔科夫模型266
5.12.2实现词性标注271
5.13本章小结275
5.14术语表276
第6章Lucene.net原理与应用277
6.1Lucene.net快速入门278
6.1.1索引文档278
6.1.2搜索文档280
6.1.3Lucene.net结构281
6.2Lucene.net深入介绍282
6.2.1索引原理282
6.2.2分析文本285
6.2.3遍历索引库288
6.2.4布尔查询原理289
6.2.5检索模型290
6.2.6收集最相关的文档291
6.3索引中的压缩算法296
6.3.1变长压缩296
6.3.2差分编码298
6.4创建和维护索引库299
6.4.1设计一个简单的索引库299
6.4.2创建索引库300
6.4.3向索引库中添加索引文档301
6.4.4删除索引库中的索引文档303
6.4.5更新索引库中的索引文档304
6.4.6索引的优化与合并304
6.5查找索引库305
6.5.1布尔查询306
6.5.2同时查询多列307
6.5.3跨度查询308
6.5.4通配符查询312
6.5.5过滤312
6.5.6按指定列排序313
6.5.7查询大容量索引318
6.5.8函数查询320
6.5.9定制相似度323
6.5.10评价搜索结果325
6.6中文信息检索325
6.6.1Lucene.net中的中文处理326
6.6.2Lietu中文分词的使用326
6.6.3定制Tokenizer328
6.6.4解析查询串329
6.6.5实现字词混合索引333
6.7抓取数据库中的内容336
6.7.1读取数据337
6.7.2数据同步338
6.8与爬虫集成338
6.9概念搜索341
6.10本章小结344
6.11术语表345
第7章实现搜索用户界面347
7.1搜索页面设计348
7.1.1用于显示搜索结果的
ASP.net348
7.1.2搜索结果条351
7.1.3搜索结果分页351
7.1.4设计一个简单的搜索页面352
7.2实现搜索接口353
7.2.1Lucene.net搜索接口353
7.2.2指定范围搜索357
7.2.3搜索页面的索引缓存与
更新358
7.3实现关键词高亮显示361
7.4实现分类统计视图362
7.4.1搜索结果分类统计与导航363
7.4.2层次树366
7.5相关搜索词368
7.6实现AJax自动完成369
7.6.1总体结构370
7.6.2服务器端处理371
7.6.3浏览器端处理372
7.7集成其他功能374
7.7.1拼写检查374
7.7.2再次查找374
7.7.3黑名单375
7.7.4搜索日志376
7.8本章小结377
第8章使用Solr开发网站搜索379
8.1搜索服务器端380
8.1.1Solr的结构380
8.1.2启动Solr服务器381
8.1.3开发支持Solr的中文分词384
8.1.4中文的Solr385
8.1.5索引数据388
8.1.6查询功能389
8.1.7高亮显示392
8.2Solr的.NET客户端393
8.2.1使用Solrnet393
8.2.2查询396
8.2.3分类统计397
8.2.4ASP.NET中使用Solrnet401
8.2.5删除数据405
8.2.6从数据库索引数据405
8.2.7翻页408
8.2.8实现多分类411
8.3查询语法412
8.3.1对空格的支持413
8.3.2日期加权413
8.4索引分布415
8.5本章小结417
第9章Elasticsearch开发分
布式搜索419
9.1搜索集群421
9.2安装422
9.3ES的.net客户端429
9.3.1连接搜索服务器429
9.3.2创建索引430
9.3.3插入数据431
9.4查询432
9.4.1布尔查询433
9.4.2嵌套类型和嵌套查询434
9.4.3查询结果437
9.4.4过滤器437
9.5高亮显示437
9.6分页442
9.7本章小结442
第10章在线客服案例分析445
10.1使用WebSocket446
10.2知识库447
10.3自动问答449
10.4本章小结453
参考资源455

精彩书摘

第2章使用C#开发网络爬虫

采购人员需要找到提供产品的有竞争力的厂家和价格,金融交易人员需要找到有潜力的投资公司,出版行业人士需要找到迅速变热的话题。这些都可以使用网络爬虫帮忙实现。
网络爬虫从互联网源源不断地抓取海量信息,搜索引擎结果中的信息都来源于此。如果把互联网比喻成一个覆盖地球的蜘蛛网,那么抓取程序就是在网上爬来爬去的蜘蛛。
在抓取信息时,应当首先关注一些高质量的网页信息。高质量的网页是指网民投票选择出来的网页,这里是访问量高的网站中的一些热门网页。但是尺有所短,寸有所长,很多访问量一般的网站包括了更多问题的答案。有点类似长尾效益。Alexa(http://www.alexa.com)专门统计网站访问量并发布网站世界排名。如果使用FireFox浏览器,可以通过alexa插件查看到当前访问的网站是否还有很多人在访问。如果使用IE浏览器,可以通过alexa工具条查看到当前访问网站的访问量排名。
有些文档的时效性很强,如新闻或者财经信息。大部分人想要知道的是当天股票市场的报道,只有很少人关心昨天的市场发生了什么。本章专门介绍如何抓取即时信息。
网络爬虫需要实现的基本功能包括下载网页以及对URL地址的遍历。为了高效、快速地遍历网站,还需要应用专门的数据结构来优化。爬虫很消耗带宽资源,设计爬虫时需要仔细地考虑如何节省网络带宽。
2.1网络爬虫抓取原理
既然所有的网页都可能链接到其他的网站,那么从一个网站开始,跟踪所有网页上的所有链接,就可能遍历整个互联网。
为了更快地抓取想要的信息,网页抓取首先从一个已知的URL地址列表开始遍历,对垂直搜索来说,一般是积累的行业内的网站。有人可能会奇怪,像Google或百度这样的搜索门户怎么设置这个初始的URL地址列表。一般来说,网站拥有者把网站提交给分类目录,如dmoz(http://www.dmoz.org/),爬虫则可以从开放式分类目录dmoz抓取。
抓取下来的网页中包含了想要的信息,一般存放在数据库或索引库这样的专门的存储系统中,如图2-1所示。

图2-1网络爬虫基本结构
在搜索引擎中,爬虫程序是从一系列种子链接把这些初始的网页中的URL提取出来,放入URL工作队列(Todo队列,也叫Frontier),然后遍历所有工作队列中的URL,下载网页并把其中新发现的URL再次放入工作队列。为了判断一个URL是否已经遍历过,可以把所有遍历过的URL放入历史表(Visited表)。爬虫抓取的基本过程如图2-2所示。
……

前言/序言

前言在出门之前,往往先用搜索引擎找下乘车路线。在购物之前,往往先用搜索引擎找到最合适的商品。搜索引擎已经成为人们大脑的外部记忆体。身边的事物对我们有着重要的影响。运行在本机操作系统上的搜索引擎也对我们有着重要的作用。目前,一些本地搜索引擎往往使用C#开发。《使用C#开发搜索引擎(第2版)》是一本讲解如何使用C#开发搜索引擎的改进版图书。随着人工智能技术的发展,搜索引擎中的算法已经越来越深刻地影响人的生活。人们生活质量的持续提高有赖于搜索引擎等相关技术的持续改进。在社会文明的早期,很多有效信息沉淀于书本和纸张。随着越来越多的信息显现于网络,网络爬虫变得更加有用。借助人的智能,网络爬虫软件可以更精准地抓取有效信息。通过阅读《使用C#开发搜索引擎(第2版)》,读者可以使用C#开发本地手工操作的网络爬虫软件。这是一本介绍如何使用C#开发网络爬虫的书,因为C#能够方便地调用浏览器内核,所以很容易解析动态网页。把网页转换成DOM树的表示形式,在C#中也是轻而易举的事。Lucene几乎已经成为全文搜索的同义词。随着.NET开发平台越来越强大,作为Lucene在.NET平台的移植版本,Lucene.net也越来越流行。Lucene.net来源于2002年的NLucene,当时采用.NET平台的首选语言C#移植Lucene,这个决定到现在看来仍然是正确的。几经波折,这个开源项目在2004年一度陷于停滞,但是后来也终于被阿帕奇基金会接纳成为孵化项目,并成功转正。你可能会好奇Lucene.net是怎么从Lucene移植过来的。可以使用Sharpen这样的移植工具,这样可以把Java源代码转化为C#源代码。当然还需要人工修改C#源代码中的错误。Lucene.net因为上手快、速度快、可扩展性好,赢得了很多开发人员的青睐。虽然已经有包括Autodesk等公司和项目采用了Lucene.net,但是这却是首次介绍Lucene.net的书,即使在全球范围内来看也是如此。通过Lucene.net源代码学习各种算法是一种不错的选择,如学习使用堆实现的优先队列等。随着Lucene4.0中灵活索引的推出,Lucene.net将来的版本性能会更好。这也是一本介绍如何使用C#开发中文分词和文本排重、拼写检查等自然语言处理技的书。使用C#灵活的语法来实现中文分词使得代码可读性更好。也许你希望能查找英文资料并能够自动翻译成为可读的中文,也许你希望能查找图像中的文字,但很多网站搜索的表现也经常让人失望。大型搜索引擎虽然功能强大,但是一些排序结果往往值得怀疑。《使用C#开发搜索引擎(第2版)》介绍了如何用C#调用支持分布式索引的Solr或者ElasticSearch。这样网站前端可以采用ASP.NET开发,而后端可以采用Linux搜索集群。这《使用C#开发搜索引擎(第2版)》不仅仅适合专业软件开发人员,希望了解搜索引擎工作原理的人也可以阅读。有很多人说,不是我不愿意,是我学不会技术。也许你需要一本更好的书,或者一位更好的老师。根据生活中的场景明白折半查找其实就是猜价格的游戏。有限状态机其实就是电话银行中缴费之前让人晕的一串数字输入。总之,学习技术,不仅仅很有用,还有可能比较有趣。希望快速入门的读者也可以参加我们开发的培训课程。《使用C#开发搜索引擎(第2版)》配套的光盘中提供了相关的源代码,有的来源于猎兔搜索多年的开发经验积累,有的是经典算法实现。其中很多都可以直接用于项目实践。也感谢开源软件的开发者们,他们无私的工作丰富了《使用C#开发搜索引擎(第2版)》的内容。参与《使用C#开发搜索引擎(第2版)》编写的还有崔智杰、王全军、石天盈、张继红、张进威、刘宇、何淑琴、任通通、徐友峰、孙宽,在此一并表示感谢。编者

其他推荐