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 ...
随机推荐
- 知识点干货—多线程同步【6】之synchronized
"明日复明日,明日何其多. 我生待明日,万事成蹉跎. 世人若被明日累,春去秋来老将至. 朝看水东流,暮看日西坠. 百年明日能几何?请君听我明日歌. 明日复明日,明日何其多! 日日待明日,万世 ...
- webpack最简示例
安装webapck webpack依赖node环境,所以在此之前要保证系统中有node环境. 打开cmd控制台 $ npm install webpack -g 全局安装webpack 配置模块 we ...
- 2017年总结的前端文章——border属性的多方位应用和实现自适应三角形
border属性是在实际的应用中使用频率比较高的一个属性,除了作为边框使用,利用border属性的一些特征以及表现方式,可以在实现一些比较常见的效果(如等高布局,上下固定内容滚动布局和绘制CSS图标等 ...
- SpringMVC源码情操陶冶-DispatcherServlet类简析(一)
阅读源码有利于陶冶情操,此文承接前文SpringMVC源码情操陶冶-DispatcherServlet父类简析 注意:springmvc初始化其他内容,其对应的配置文件已被加载至beanFactory ...
- console引起的eclipse 僵死/假死 问题排查及解决[转]
原文链接:http://www.iteye.com/topic/1133941 症状: 使用Eclipse win 64位版本,indigo及kepler都重现了,使用tomcat 6.0.39,jd ...
- POJ [P2289] Jamie's Contact Groups
二分+二分图多重匹配 辣鸡ACM式读入 对于这种奇葩的读入方法,还是老老实实的用scanf吧 #include <iostream> #include <cstdio> #in ...
- 洛谷 [P1220] 关路灯
本题是一道区间DP,很容易设计出状态, dp[i][j]代表关掉i到j的路灯所耗的电量,但是对于新到一个路灯来说,可以是原来直接来的,也可以是掉头来的,于是还需要添加一维 0代表在区间的左端,1代表在 ...
- qt中的多线程
1.dialog.h #define DIALOG_H #include <QDialog>#include"mythread.h"namespace Ui {clas ...
- PhpStorm的破解 汉化
以前一直习惯使用sublime,最近发现phpstorm比submit稍微更强大些,其很多插件都是直接可以使用,不需要另外去拓展了 其中的破解.汉化步骤就需要借助一些资源 (1)破解 安装完毕后,直接 ...
- Jenkins 登录信息无效。请重试。
刚开始安装的时候没有问题,去 D:\jenkins\secrets下找到initialAdminPassword这个文件 输入里面的密码就行 隔了一段时间登陆,登陆不上去了,这时候,可以去 D:\je ...