nimi SearchEngin 项目思路及算法
最近做一个轻量文本搜索项目,在项目实行过程中,如果使用余弦求网页相似度,不能适应海量网页查重。看了那本《这就是搜索引擎 核心技术详解》后,对simhash算法有一定的理解,并且喜欢上了这个算法。关于simhash的使用,看博客http://blog.csdn.net/u013209147/article/details/48227113 。
以下是项目的算法。每次读取一个文档就进行查重,以便于适应日后用网络爬虫抓取网页,动态地进行查重得需要。查重的过程还行,simhash值在set中,此处还可以进一步优化。花时间比较多的在于对网页的处理上(分词,词频统计等),还好这只是预处理,不是响应客户端。
一、预处理
1、DirScan.hpp 递归遍历语料文件夹,将所有文档的绝对路径保存到vector<string> oldVec 中;
2、DuplicateRemoval 对上述的 oldVec 进行遍历操作:
循环做以下操作:
1)根据vector<string>中的一个路径读取一篇网页到字符串。
2)使用"cppjiaba 工具"对字符串进行分词,词频统计,取topN个关键字。
3)使用"simhash 工具"将topN关键字映射成一个代表网页特征的64bit simhash值。
4)将"simhash"中的isEqual()方法,传入find_if(),将待选网页的64bit simhash与set<uint64_t>中的simhash值比较,判断海明距离与3(默认为3,可以自定义)的关系。
5)如果isEqual()返回true;则说明海明距离小于3,即判定此网页与已选网页中的某一篇重复。返回步骤 1)。
如果isEqual()返回false;则说明不重复,做进一步操作步骤 6)。
6)将simhash值插入到set<uint64_t>中,并将此网页的路径加入到新的数组vector<string> newVec中。
7)循环上述操作,指导下标指向oldVec的结尾。结束后得到一个装有不重复网页的路径的数组 newVec。
类或者模块之间的关系:
cppjiaba <- dict
Simhasher.hpp <- cppjiaba
Simhasher.hpp <- jenkins.h(产生哈希值的工具)
DuplicateRemoval.hpp <-Simhasher.hpp
最终我们使用DuplicateRemoval就可以完成网页去重的工作。
3、FileHandle.hpp 对网页进行格式化
将DuplicateRemoval处理的结果传给FilaHandle.cpp的对象,就可以得到一个网页库文件和一个文件偏移文件。
4、BuildIndex 建字典(哈希加链表优化词典)和倒排文件(……,<docid,TF,weight>,……)
使用Cppjieba,根据偏移文件读取网页库,对每一篇网页进行分词,词频统计……。
二、服务端编程
1)接收客户端请求的字符串str
2)使用cppjieba分词库对str进行分词(使用full模式)
3)将分词结果保存到一个数组中
4)对数组进行遍历操作,根据倒排文件寻找对应的网页,读取出的网页根据单词的权重进行排序。
5)读取网页,并用XMLParser.hpp(已经封装好)解析XML格式的文档
6)用cppjson工具将解析结果封装成json字符串返回客户端。
以上仅供参考,可能还会有优化的地方。项目的代码还差一点完成,之后见github。
版权声明:本文为博主原创文章,未经博主允许不得转载。
nimi SearchEngin 项目思路及算法的更多相关文章
- 《专访 RocketMQ 联合创始人:项目思路、技术细节和未来规划》
专访 RocketMQ 联合创始人:项目思路.技术细节和未来规划 木环 阅读数:138092017 年 2 月 20 日 18:00 编者按 这些年开源氛围越来越好,各大 IT 公司都纷纷将一 ...
- SSM项目思路整合NEW
#首先进行项目思路整体分析,具体包括哪些模块,如何实现等: 一)搭建环境 1.导包: (Spring核心包4个 + 面向切面的包4个 + SpringJDBC和事务的包各一个, SpringMVC两个 ...
- Django问卷调查项目思路流程
Django问卷调查项目思路流程: 1 后端思路 : 需求分析 ---- 找出各实体对应关系 ---- 设计model架构 ---- 统一资源封装 --- 提供资源API入口 ---- 设计项目实体功 ...
- 人脸跟踪开源项目HyperFT代码算法解析及改进
一.简介 人脸识别已经成为计算机视觉领域中最热门的应用之一,其中,人脸信息处理的第一个环节便是人脸检测和人脸跟踪.人脸检测是指在输入的图像中确定所有人脸的位置.大小和姿势的过程.人脸跟踪是指在图像序列 ...
- SSM项目思路整合NEW2
上接于 https://www.cnblogs.com/shijinglu2018/p/10374541.html ...... 三)客户管理模块开发 说明:其实大致思路差不太多,都是首先根据前端页面 ...
- 创建java项目思路
一.搭建 1.创建搭建项目 2.创建分层 二.理解项目(理清总体思路) 1.是否有共同部分(过滤或者拦截) 常用量 (static) 2.搭建单表基本增(是否需要返回值) 删(条件) 查(条 ...
- LCA 最近公共祖先 Tarjan(离线)算法的基本思路及其算法实现
首先是最近公共祖先的概念(什么是最近公共祖先?): 在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点,而最近公共祖先,就是两个节点在这棵树上深度最大的公共的祖先节点. 换句话说,就是两个点在这棵 ...
- [小专题]另一种字符串匹配的思路——Shift-And算法
吐槽:前两天打组队赛遇到一个字符串的题考了这个(见:http://acm.hdu.edu.cn/showproblem.php?pid=5972 ) 当时写了个KMP瞎搞然后TLE了(害),赛后去查了 ...
- JavaWeb笔记——注册登录系统项目思路
功能: > 注册 > 登录 --------------------------------- JSP: * login.jsp --> 登录表单 * regist ...
随机推荐
- 机器学习--kNN算法识别手写字母
本文主要是用kNN算法对字母图片进行特征提取,分类识别.内容如下: kNN算法及相关Python模块介绍 对字母图片进行特征提取 kNN算法实现 kNN算法分析 一.kNN算法介绍 K近邻(kNN,k ...
- keepalived深度结合lvs_dr模式
keepalived与dr模式结合 keepalived介绍 keepalived可提供vrrp以及health-check功能,可以只用它提供双机浮动的vip(vrrp虚拟路由功能), 这样可以简单 ...
- JAVA List根据字段排序以及取前几条数据
1.经常会遇到对组装的list排序或提取list中前几条数据,例如: 根据时间排序: list.sort((o1, o2) -> o2.getCreateTime().compareTo(o1. ...
- php5.3 安装 Zend Guard Loader
解包 tar -zxvf ZendGuardLoader-php-5.3-linux-glibc23-x86_64.tar.gz 复制 ZendGuardLoader.so 至 PHP 扩展目录 cp ...
- 利用QuickCHM制作chm
CHM是一种常见的帮助文件格式,也是电子书的一种格式. 下面是使用QuickCHM制作chm的步骤: 1.先将所有的word文档存储为mht格式,点击,文件--另存为网页,如下 2.确保所有的word ...
- MIT-线性代数笔记(7-11)
第 07 讲 求解 Ax=0 :主变量,特解 矩阵的秩Rank(A):矩阵主元的个数. 找出“主变量”pivotvariables,主列,即主元所在的列,其他列,称为自由列.(自由列表示可以自由或任意 ...
- 练手项目:利用pygame库编写射击游戏
本项目使用pygame模块编写了射击游戏,目的在于训练自己的Python基本功.了解中小型程序框架以及学习代码重构等.游戏具有一定的可玩性,感兴趣的可以试一下. 项目说明:出自<Python编程 ...
- TJ4运行环境
http://springwq2011.blog.51cto.com/4332889/966028 http://blog.csdn.net/u013573789/article/details/45 ...
- windows FileZilla Server 开启FTP over TLS
FileZilla Server官方下载地址: https://filezilla-project.org/download.php?type=server FileZilla Server 开启FT ...
- Ubuntu系统下crontab的使用
最近一个项目,需要用到一个定时任务,先说crontab的常用命令. crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数 crontab -l //列出 ...