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 ...
随机推荐
- Docker之镜像
镜像(Images) 镜像是Docker的三大核心之一,类似于虚拟机,作用和虚拟机是一样的,唯独是组成部分会有些区别.简单的说如果我们想启动一个容器就必须要有镜像.docker运行容器前需要本地存在对 ...
- toString()方法细节
toString(),每一个非基本类型的对象都有一个toString()方法,当编译器需要一个Sting,而你只有一个对象时,该方法会自动调用. class WaterSource { private ...
- JavaScript中的类继承
JavaScript是一个无class的面向对象语言,它使用原型继承而非类继承.这会让那些使用传统面向对象语言如C++和Java的程序员们感到困惑.正如我们所看到的,JavaScript的原型继承比类 ...
- Tensorflow简单CNN实现
觉得有用的话,欢迎一起讨论相互学习~Follow Me 少说废话多写代码~ """转换图像数据格式时需要将它们的颜色空间变为灰度空间,将图像尺寸修改为同一尺寸,并将标签依 ...
- nongsanli
之后的内容只能追加,不可以修改,删除. 1. mysql可以对字段进行MD5加密, 加密插入:INSERT INTO t_user(id,username,PASSWORD) VALUES('5 ...
- form表单中get和post两种提交方式的区别
一.form表单中get和post两种提交方式的区别? 1.get提交表单中的内容在链接处是可见的.post不可见 2.post相比于get是安全的 3.post不收限制大小,get有限制大小(黑马视 ...
- python os模块实用函数
os.sep可以取代操作系统特定的路径分隔符.windows下为 “\\” os.name字符串指示你正在使用的平台.比如对于Windows,它是'nt',而对于Linux/Unix用户,它是'pos ...
- 玩转spring boot——国际化
前言 在项目开发中,可能遇到国际化的问题,而支持国际化却是一件很头疼的事.但spring boot给出了一个非常理想和方便的方案. 一.准备工作 pom.xml: <?xml version=& ...
- Springboot security cas源码陶冶-FilterSecurityInterceptor
前言:用户登录信息校验成功后,都会获得当前用户所拥有的全部权限,所以对访问的路径当前用户有无权限则需要拦截验证一发 Spring security过滤器的执行顺序 首先我们需要验证为啥FilterSe ...
- JSP基础篇
JSP可以认为是加上了Java代码块的HTML文件,常常和CSS,JS结合使用,下面是一个JSP的基本的例子. <%@ page language="java" conten ...