轻量级文本搜索引擎的后台设计、实现与优化

主框架图

见:http://r.photo.store.qq.com/psb?/V12VvuOZ2vxbmG/M2gzPWfnBLS8buBT*16Y2xm9QkAAp8TmePOlIPC1MlM!/r/dFMAAAAAAAAA

1.1 生成库——词频库、词语索引库

流程:

项目包:

1.1.1 生成库——中文语料文件

主要流程:

中科院分词系统  ICTCLAS 的使用,例子:

杭州市长春药店。  -》   杭州市/ns 长春/nz 药店/n 。

1.1.2 生成库——词频库

数据结构:

1 hash_map<string ,  int ,  MyHashFn >

例子

1.1.3 生成库——词语索引库

数据结构:

1 hash_map<string ,  set<string> ,  MyHashFn >

例子

1.1.3 生成库——词语索引库

UTF-8编码

截取一个汉字,UTF-8可根据汉字的第一个字节移位推出长度

1字节 0xxxxxxx 
  2字节 110xxxxx 10xxxxxx 
  3字节 1110xxxx 10xxxxxx 10xxxxxx 
  4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

1 if(word[i] & (1 << 4))
2     key = word.substr(i, 4);
3 else if(word[i] & (1 << 5))
4     key = word.substr(i, 3);
5 else if(word[i] & (1 << 6))
6     key = word.substr(i, 2);
7 else
8     key = word.substr(i, 1);

1.2 生成库——网页库、网页偏移库

流程:

项目包

1.2.1 生成库——网页库

网页记录:

一行一条网页记录( string )

网页记录格式:

<doc><docid>网页号</docid>

<docurl>网页URL</docurl>

<doctitle>网页标题</doctitle>

<doccontent>网页内容</doccontent></doc>

数据结构

1 struct Page
2 {
3    int ID;
4    string  url,title,content;
5 };
1 hash_map< int , Page> 

例子:

1.2.1 生成库——网页偏移库

偏移记录:

一行一条偏移记录

偏移记录格式:

Page_ID    偏移量    本页大小

数据结构

1 hash_map<int, std::pair<int, int> >

例子:

1.3 生成库——网页去重、建立倒排索引

流程:

项目包:

1.3.1 生成库——网页去重

Top-K 算法:

•将每张网页频数top10的单词作为该网页的特征。若词频一样,则按字符序。

•两网页特征相似度 >= 60% , 则两网页重复。

1.3.2 生成库——建立倒排索引

索引:

一行一条索引

索引格式:

词语  Page_ID  词频  权值  Page_ID 词频  权值   ……

数据结构:

1 hash_map<std::string, std::set<std::pair<int, double> >, MyHashFn>

例子:

权值的计算:

•1、TF*IDF框架

•TF(Term Frequency) 词频

•DF (Document Frequency) 词语出现的文档数目

•N  总共的文档数目

•IDF (Invert Document Frequency) 逆文档频率

•IDF (Invert Document Frequency) 逆文档频率

IDF反映了一个特征词在整个文档集合中的情况,出现的愈多IDF值越低,这个词区分不同文档的能力越差。

大量实验表明使用以下公式效果更好:

向量空间模型:

•Cosine相似度计算

若词语W在包含100个词语的A网页中出现了50次,在包含1000个词语的B网页出现了100次,显然A中W的权值应该更大,但是计算结果却相反。因此,应该对权值进行标准化:

            

2.1 线程池资源

•网页

1 hash_map< int , Page>

•网页偏移

1 hash_map<int, std::pair<int, int> >

•倒排索引

1 hash_map<std::string, std::set<std::pair<int, double> >, MyHashFn>

•词频

1 map<string ,  int>

•词语索引

1 map<string ,  set<string>>

•停用词

1  hash_map<std::string, std::string, MyHashFn>

•Epoll Events 、 Socket

•工作线程、缓存保存线程

•线程池纠错缓存、线程池查询结果缓存

•任务队列

1 class Task
2   {
3       public:
4       int fd; //Socket描述符
5       Task *next; //下一个任务
6   };
1  vector<Task>

2.2 Socket工作详细

•建立Socket

•注册Epoll

•监听到Socket描述符,accept客户端,注册读操作

•监听到读操作,添加任务

•监听到写操作,输出查询结果

2.3.1 工作线程工作详细——纠错模块

•编辑距离算法

指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。

例子:

计算X字符串 与 Y字符串 的 编辑距离

dp[i][j] 为 X串的前i个字符 和 Y串的前j个字符 的编辑距离

1 if(X [i - 1] == Y[j - 1])
2     dp[i][j] = dp[i - 1][j - 1];   //最后字符相同
3 else
4 {
5     int t1 = dp[i - 1][j];                   // 删除X第i个字符
6     t1 = t1 < dp[i][j - 1] ? t1 : dp[i][j - 1];   //删除Y第j个字符
7     t1 = t1 < dp[i - 1][j - 1] ? t1 : dp[i - 1][j - 1];//最后字符改相同
8     dp[i][j] = t1 + 1;
9 }

由于需要进行汉语的编辑距离计算,这里的char转变为string,string转变为vector<string>。

•取任务

•receive客户端

•分词

•分词优化、去停用词

ICTCLAS分词系统进行分词后的结果可能导致错误,例如:

1、对分词结果去停用词,如“的”“了”“呢”

2、简单的错别字分词优化算法

(1)当出现连续的单个汉字时,将其合并成一个词语

(2)当出现不连续单个汉字,且不是第一个字时,把  它并入左边词语

优化结果:

•查询查询结果缓存

•若查到,根据查询结果集合生成JSON,注册写操作,结束工作

•若未查到,每个词语分别查询纠错缓存

•若查到,直接返回正确词语

•若未查到,进行纠错(如编辑距离相同,选最高的词频),更新纠错缓存

2.3.2 工作线程工作详细——查询模块

•再次查询查询结果缓存

•若查到,根据查询结果集合生成JSON,注册写操作,结束工作

•若未查到,查询包含所有关键词的页面

•建立向量空间模型,计算Cosine相似度

•排序,生成查询结果集合

•生成JSON,注册写操作,结束工作

•Cosine相似度计算

将查询语句的特征词的权值组成向量 a

网页中对应的特征词的权值组成向量 b

查询语句与该网页的Cosine相似度:

2.4 缓存保存线程工作详细

•纠错cache

1 hash_map<string , string , MyHashFn >  //纠错前,纠错后

•查询结果cache

1 map< set<string> ,vector<pair<int, vector<double> > >  > //   关键词集合,查询结果 

•定时扫描线程池中的工作线程

•每扫描一个工作线程,将工作线程中的cache内容覆盖写入线程池cache,再将线程池中的cache内容覆盖写入该工作线程

•扫描结束后,将线程池中的cache写回到磁盘

时间: 2024-08-25 21:01:24

轻量级文本搜索引擎的后台设计、实现与优化的相关文章

Google搜索排名优化-面向搜索引擎的网站设计

内容摘要:网站在搜索营销方面最主要的缺点: 行业知识:不知道搜索引擎对吸引的新用户的重要性,在搜索引擎排名服务中追求“傻瓜相关”,购买一些其实没有太多实际意义的行业关键词.其实能够用户输入的关键词越多,其目标性越强,这样的客户价值越高.用户能够直接定位到产品具体内容页比到网站首页有价值的多: 发布技术:网站的网页进入Google的索引量非常小,主要是由于大量使用动态网页造成的.需要将动态页面链接改写成静态 链接: 页面设计:页面标题重复,关键词不突出,过渡使用JavaScript脚本/图片/Fl

定向数据爬虫和搜索引擎(Directional Spider)设计文档

  定向数据网络爬虫和搜索引擎项目设计 (新闻数据抓取.分析.加工.检索) 版本号:            v 1.0.0 编写人:          张  文  豪 日  期:       2014年6月10日 文档说明:这个文档还在编写之中,文章中很多写在“保留”二字的不是每月东西,而是没有写.虽然没有具体实现,但是我觉得我把我的经验和思考都写进去了.虽然对于读者来说这个文档相当粗糙,但是是我一个很看重的东西.如果真的有人愿意认真阅读这篇文章,我会很开心和大家交流探讨,欢迎留言和联系我. [

轻量级文本编辑器,Notepad最佳替代品:Notepad++

[crifan推荐]轻量级文本编辑器,Notepad最佳替代品:Notepad++ 版本:v3.0 Crifan Li 摘要 本文主要介绍了笔者crifan推荐的轻量级文本编辑器,Notepad最佳替代品:Notepad++,内容主要包含notepad,notepad2,notepad++,ultraEdit的比较,使用Notepad++前要了解的知识,Notepad++的插件,Notepad++的安装过程,Notepad++的各种常见和不常见的功能的详解 本文提供多种格式供: 在线阅读 HTM

精品软件 推荐 相当优秀的轻量级文本编辑器 Notepad2

Notepad2 是一个相当优秀的轻量级文本编辑器.Notepad2 是基于 Scintilla 开发,体积小巧.运行快速,与系统默认记事本具备相同资源消耗,但提供了大量实用功能,如代码高亮.编码转换.行号显示.多步 Ctrl+Z.增强的查找替换等等,是代替系统默认 Notepad 的极致选择. Notepad2 是一款开源软件,XhmikosR 又在 Notepad2 基础上二次开发了更加实用强大的 Notepad2-mod,额外提供代码折叠.书签.自动完成.支持更多代码格式高亮等功能,更加地

浅析ASP网站后台设计

现在学习ASP语言很少啦,逐渐被PHP,asp.net,jsp所代替. 这里介绍ASP网站后台设计技巧 1.用户名规则: 字符大于4, 不能在黑名单里(比如不能跟管理员有重名,不能有任何包含本站域名的相关信息如:yongfa365admin,不用能"admin"等字样), 最好不要以数字开头, 字母的话要转换成小写的写入数据库, 注册时应该可以检查是否被占用. 2.后台菜单式权限设置 结构: 后台用户权限判断: 根据session("username")查他是哪个组

腾讯优测优社区干货精选|手Q红包后台设计

文 / 腾讯 邓建俊 优测小优有话说: 以为优社区除了测试知识就没有其他东西啦?手Q大牛带你走一波红包的后台设计!!! ------------------------------------------------------------------ 1. 前言 2016除夕夜注定是一个不平凡的夜晚,除了陪家人吃团圆饭.看春晚,还得刷一刷.摇一摇.咻一咻,忙得不亦乐.相信大部分读者也已经体验过手Q的刷一刷抢红包,玩法简单中奖率高,得到了许多用户的好评. 那么对于后台而言,要实现这个亿万级用户的

腾讯优测优社区干货精选|手Q刷一刷红包后台设计总结

文 / 腾讯 邓建俊 优测小优有话说: 以为优社区除了测试知识就没有其他东西啦?手Q大牛带你走一波红包的后台设计!!! 1. 前言 2016除夕夜注定是一个不平凡的夜晚,除了陪家人吃团圆饭.看春晚,还得刷一刷.摇一摇.咻一咻,忙得不亦乐.相信大部分读者也已经体验过手Q的刷一刷抢红包,玩法简单中奖率高,得到了许多用户的好评. 那么对于后台而言,要实现这个亿万级用户的抢红包系统,我们将会面临哪些问题? (1)海量的并发请求,预估峰值800w/s 800w/s的预估峰值请求,红包系统必须要保证在如此高

仿wordpress管理后台设计的后台管理框架

仿wordpress管理后台设计的后台管理框架 本Markdown编辑器使用[StackEdit][6]修改而来,用它写博客,将会带来全新的体验哦: html的padding-top来实现整体下移,然后top使用position:fixed定位到顶部. leftbg的position:absolute来实现左侧背景定位. 左右分栏是利用float特性,让右侧可以自动适应. <!DOCTYPE html> <html> <head> <meta charset=&q

定向数据爬虫和搜索引擎(Directional Spider)设计(一) —— 元素分析

Insert title here 定向数据爬虫和搜索引擎(Directional Spider)设计(一) -- 元素分析 前言 页面定向数据抓取目的就是尽可能的抓取在互联网中获取到你感兴趣的数据.因为是定向抓取,同时需要保证对抓取的数据进行数据加工处理,做到对应的数据规范,方便后期检索. 简单的说这个的数据基础就是通信领域当中信息获取和信号分析.本文从结构上分析我所理解的做搜索引擎需要涉及到的数据和关系. 对应的程序设计也需要以此为基础进行设计.程序设计在今后会讲到.同时本文会设计到基本的搜