轻量级文本搜索引擎的后台设计、实现与优化
来源:互联网 发布:林疯狂时期的数据 编辑:程序博客网 时间:2024/05/21 07:57
转载请注明:转载 from http://blog.csdn.net/u011239443/article/details/51655480
主框架图
见: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 Page2 {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 算法:
1.3.2 生成库——建立倒排索引
索引:
一行一条索引
索引格式:
词语 Page_ID 词频 权值 Page_ID 词频 权值 ……
数据结构:
1 hash_map<std::string, std::set<std::pair<int, double> >, MyHashFn>
例子:
权值的计算:
IDF反映了一个特征词在整个文档集合中的情况,出现的愈多IDF值越低,这个词区分不同文档的能力越差。
大量实验表明使用以下公式效果更好:
向量空间模型:
若词语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>
1 class Task2 {3 public: 4 int fd; //Socket描述符 5 Task *next; //下一个任务6 };
1 vector<Task>
2.2 Socket工作详细
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 else4 { 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>。
ICTCLAS分词系统进行分词后的结果可能导致错误,例如:
1、对分词结果去停用词,如“的”“了”“呢”
2、简单的错别字分词优化算法
(1)当出现连续的单个汉字时,将其合并成一个词语
(2)当出现不连续单个汉字,且不是第一个字时,把 它并入左边词语
优化结果:
2.3.2 工作线程工作详细——查询模块
将查询语句的特征词的权值组成向量 a
网页中对应的特征词的权值组成向量 b
查询语句与该网页的Cosine相似度:
2.4 缓存保存线程工作详细
1 hash_map<string , string , MyHashFn > //纠错前,纠错后
1 map< set<string> ,vector<pair<int, vector<double> > > > // 关键词集合,查询结果
- 轻量级文本搜索引擎的后台设计、实现与优化
- 轻量级文本搜索引擎的后台设计、实现与优化
- [转]FTP搜索引擎的设计与实现(优化版)
- [转]FTP搜索引擎的设计与实现(优化版)
- [转]FTP搜索引擎的设计与实现(优化版)
- 搜索引擎的设计与实现
- 轻量级工作流引擎的设计与实现
- 农业垂直搜索引擎四》文本处理模块的设计与实现
- FTP搜索引擎的设计与实现
- FTP搜索引擎的设计与实现
- [转]FTP搜索引擎的设计与实现
- FTP搜索引擎的设计与实现
- FTP搜索引擎的设计与实现
- [转]FTP搜索引擎的设计与实现
- [转]FTP搜索引擎的设计与实现
- 元搜索引擎的设计与实现
- 一种轻量级对象池的设计与实现
- 一种轻量级对象池的设计与实现
- 【Spark Mllib】逻辑回归——垃圾邮件分类器与maven构建独立项目
- git pull fetch 更新本地文件区别
- Git基本常用命令
- 1 producer — n consumers 模型 实现
- 把数组排成最小的数
- 轻量级文本搜索引擎的后台设计、实现与优化
- Struts2学习【1】第一个完整程序
- Impala的分布式查询
- 驱动编写小经验(更新中......)
- Android x86 On Qemu
- 星宇专卖店POS收银软件管理系统 v2.49 官方版
- Android资源文件分类 res目录 assets目录
- 关于Mybatis 查询 查到空数据列的情况
- RDD Stage生成