使用C#开发搜索引擎搜索引擎开发快速入门书籍罗刚【新华书店pdf下载pdf下载

使用C#开发搜索引擎搜索引擎开发快速入门书籍罗刚【新华书店百度网盘pdf下载

作者:
简介:本篇主要提供使用C#开发搜索引擎搜索引擎开发快速入门书籍罗刚【新华书店pdf下载
出版社:凤凰新华书店旗舰店
出版时间:2018-01
pdf下载价格:0.00¥

免费下载


书籍下载


内容介绍


内容介绍


内容介绍

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


关联推荐


关联推荐

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

 
目录


目录

目 录 D1章 使用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

目    录

D1章  使用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.4  C#开发快速入门   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.12  lambda表达式 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

D2章  使用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.1  HTTP协议   58

2.3.2  下载静态网页    61

2.3.3  下载动态网页    65

2.4  线程池   73

2.5  网络爬虫的遍历与实现        75

2.6  网站地图        77

2.7  连接池   78

2.8  URL地址查新         79

2.8.1  嵌入式数据库    79

2.8.2  布隆过滤器         82

2.9  抓取RSS          84

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

D3章  索引各种格式文档          113

3.1  从HTML文件中提取信息    114

3.1.1  识别网页的编码         114

3.1.2  正则表达式         116

3.1.3  Html Agility Pack介绍         120

3.1.4  NSoup介绍 124

3.1.5  网页正文提取    124

3.1.6  结构化信息提取         137

3.1.7  查看网页的DOM结构      140

3.1.8  网页结构相似度计算         141

3.2  从非HTML文件中提取文本         143

3.2.1  TEXT文件   144

3.2.2  PDF文件     144

3.2.3  Office文件  146

3.2.4  Rtf文件       147

3.3  OCR         148

3.3.1  字形识别    149

3.3.2  图像二值化         149

3.4  本章小结        153

3.5  术语表   154

D4章  自然语言处理          155

4.1  统计机器学习        156

4.2  协同推荐        157

4.3  文档排重        163

4.3.1  生成SimHash      164

4.3.2  查找SimHash      166

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.3  Lucene.net中的动态摘要 190

4.8  文本分类        191

4.8.1  自动分类的接口定义         191

4.8.2  自动分类的实现         191

4.9  自动聚类        197

4.9.1  文档相似度         197

4.9.2  K均值聚类方法 201

4.9.3  K均值实现 202

4.10  拼音转换      204

4.11  句法分析树 204

4.12  信息提取      211

4.12.1  信息提取的规则及其实现       211

4.12.2  提取地域信息  219

4.13  本章小结      221

4.14  术语表 221

D5章  用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  正向Z大长度匹配法         232

5.6.2  逆向Z大长度匹配法         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.3  N元模型     257

5.10  Z大熵 262

5.11  未登录词识别      264

5.12  词性标注      264

5.12.1  隐马尔科夫模型       266

5.12.2  实现词性标注  271

5.13  本章小结      275

5.14  术语表 276

D6章  Lucene.net原理与应用  277

6.1  Lucene.net快速入门     278

6.1.1  索引文档    278

6.1.2  搜索文档    280

6.1.3  Lucene.net结构 281

6.2  Lucene.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  收集Z相关的文档    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.1  Lucene.net中的中文处理 326

6.6.2  Lietu中文分词的使用        326

6.6.3  定制Tokenizer    328

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

D7章  实现搜索用户界面          347

7.1  搜索页面设计        348

7.1.1  用于显示搜索结果的

ASP.net     348

7.1.2  搜索结果条         351

7.1.3  搜索结果分页    351

7.1.4  设计一个简单的搜索页面         352

7.2  实现搜索接口        353

7.2.1  Lucene.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

D8章  使用Solr开发网站搜索 379

8.1  搜索服务器端        380

8.1.1  Solr的结构 380

8.1.2  启动Solr服务器         381

8.1.3  开发支持Solr的中文分词         384

8.1.4  中文的Solr 385

8.1.5  索引数据    388

8.1.6  查询功能    389

8.1.7  高亮显示    392

8.2  Solr的.NET客户端         393

8.2.1  使用Solrnet         393

8.2.2  查询    396

8.2.3  分类统计    397

8.2.4  ASP.NET中使用Solrnet      401

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

D9章  Elasticsearch开发分

布式搜索         419

9.1  搜索集群        421

9.2  安装        422

9.3  ES的.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

D10章  在线客服案例分析       445

10.1  使用WebSocket   446

10.2  知识库 447

10.3  自动问答      449

10.4  本章小结      453

参考资源         455

显示全部信息

在线试读


在线试读

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

D2章  使用C#开发网络爬虫

 

采购人员需要找到提供产品的有竞争力的厂家和价格,金融交易人员需要找到有潜力的投资公司,出版行业人士需要找到迅速变热的话题。这些都可以使用网络爬虫帮忙实现。

网络爬虫从互联网源源不断地抓取海量信息,搜索引擎结果中的信息都来源于此。如果把互联网比喻成一个覆盖地球的蜘蛛网,那么抓取程序J是在网上爬来爬去的蜘蛛。

在抓取信息时,应D1先关注一些高质量的网页信息。高质量的网页是指网民投票选择出来的网页,这里是访问量高的网站中的一些热门网页。但是尺有所短,寸有所长,很多访问量一般的网站包括了更多问题的答案。有点类似长尾效益。Alexa (http://www.alexa.com)专门统计网站访问量并发布网站SJ排名。如果使用FireFox浏览器,可以通过alexa插件查看到D前访问的网站是否还有很多人在访问。如果使用IE浏览器,可以通过alexa工具条查看到D前访问网站的访问量排名。

有些文档的时效性很强,如新闻或者财经信息。大部分人想要知道的是D天股票市场的报道,只有很少人关心昨天的市场发生了什么。本章专门介绍如何抓取即时信息。

网络爬虫需要实现的基本功能包括下载网页以及对URL地址的遍历。为了高效、快速地遍历网站,还需要应用专门的数据结构来优化。爬虫很消耗带宽资源,设计爬虫时需要仔细地考虑如何节省网络带宽。

2.1  网络爬虫抓取原理

既然所有的网页都可能链接到其他的网站,那么从一个网站开始,跟踪所有网页上的所有链接,J可能遍历整个互联网。

为了更快地抓取想要的信息,网页抓取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所示。

 

图2-2  网页遍历流程图

抓取的主要流程代码如下:

 

class Crawler{

         static List todo = new List (); //要访问的链接

         static List visited = new List (); //已经访问过的链接

         static string startPointAddress = "http://www.lietu.com";

 

         public void Crawler(){ //爬虫的开始点

                 RequestSite(startPointAddress); //访问种子站点

 

                 while(todo.Count >0) {//如果有需要遍历的链接,则逐个遍历

                        String currentURL = todo[0];

                        RequestSite(currentURL); //访问链接

                             todo.RemoveAt(currentURL);//从todo表中删除

                        visited.Add(currentURL);

                 }

         }

 

         void RequestSite(string url){

                WebRequest req=(WebRequest.Create(url));

                HttpWebResponse res=(HttpWebResponse)(req.GetResponse());

                Stream st=res.GetResponseStream(); 

                StreamReader rdr=new StreamReader(st); 

                string s=rdr.ReadToEnd();

                todo.AddRange(GetLinks(s));//增加链接到队列的尾部

         }

 

         List GetLinks(string htmlPage){

                //通过正则表达式提取链接

                Regex regx = new Regex("http://([\\w ?\\.\\w ]) ([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\\-\\=\\ \\\\\/\\?\\.\\:\\;\\'\\,]*)?", RegexOptions.IgDreCase);

 

                MatchCollection mactches = regx.Matches(htmlPage);

 

                List results = new List ();

                foreach (Match match in matches){

                      if(!visited.Contains(match.Value))

                          results.Add(mattch.Value);

                }

                return results;

         }

}

 

如果采用Queue来实现todo,则对每个增加到todo的元素都需要用对象封装。

ArrayDeque允许在末端增加或删除元素。因为ArrayDeque底层采用数组实现,所以增加到ArrayDeque的元素不需要用对象封装。ArrayDeque性能比Queue更好。所以用ArrayDeque来实现todo队列。Wintellect.PowerCollections中包含一个ArrayDeque的实现。

有个URLSeen存储。这里的visitedJ是URLSeen存储。如果visited是全局W一的,那J需要同步了。

服务器的名称通过DNS服务器转换成对应的IP地址,也J是说,通过DNS取得该URL域名的IP地址。需要选择一个好的DNS服务器。在Windows下DNS解析的问题可以用 nslookup命令来分析,例如:

 

C:\Users\Administrator>nslookup www.lietu.com

服务器:  linedns.bta.net.cn

Address:  202.106.196.115

 

非QW应答:

名称:    www.lietu.com

Address:  211.147.214.145

 

根据服务器名称取得IP地址的代码如下:

 

String hostname = "www.lietu.com";//如果是"www.baidu.com",则会返回多项IP

 

IPHostEntry host = Dns.GetHostEntry(hostname);

Console.WriteLine("GetHostEntry({0}) returns:", hostname);

 

foreach (IPAddress ip in host.AddressList) {

    Console.WriteLine("    {0}", ip);

}

显示全部信息