最近做一个轻量文本搜索项目,在项目实行过程中,如果使用余弦求网页相似度,不能适应海量网页查重。看了那本《这就是搜索引擎  核心技术详解》后,对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 项目思路及算法的更多相关文章

  1. 《专访 RocketMQ 联合创始人:项目思路、技术细节和未来规划》

    专访 RocketMQ 联合创始人:项目思路.技术细节和未来规划   木环 阅读数:138092017 年 2 月 20 日 18:00   编者按 这些年开源氛围越来越好,各大 IT 公司都纷纷将一 ...

  2. SSM项目思路整合NEW

    #首先进行项目思路整体分析,具体包括哪些模块,如何实现等: 一)搭建环境 1.导包: (Spring核心包4个 + 面向切面的包4个 + SpringJDBC和事务的包各一个, SpringMVC两个 ...

  3. Django问卷调查项目思路流程

    Django问卷调查项目思路流程: 1 后端思路 : 需求分析 ---- 找出各实体对应关系 ---- 设计model架构 ---- 统一资源封装 --- 提供资源API入口 ---- 设计项目实体功 ...

  4. 人脸跟踪开源项目HyperFT代码算法解析及改进

    一.简介 人脸识别已经成为计算机视觉领域中最热门的应用之一,其中,人脸信息处理的第一个环节便是人脸检测和人脸跟踪.人脸检测是指在输入的图像中确定所有人脸的位置.大小和姿势的过程.人脸跟踪是指在图像序列 ...

  5. SSM项目思路整合NEW2

    上接于 https://www.cnblogs.com/shijinglu2018/p/10374541.html ...... 三)客户管理模块开发 说明:其实大致思路差不太多,都是首先根据前端页面 ...

  6. 创建java项目思路

    一.搭建 1.创建搭建项目 2.创建分层 二.理解项目(理清总体思路) 1.是否有共同部分(过滤或者拦截) 常用量 (static) 2.搭建单表基本增(是否需要返回值)   删(条件)    查(条 ...

  7. LCA 最近公共祖先 Tarjan(离线)算法的基本思路及其算法实现

    首先是最近公共祖先的概念(什么是最近公共祖先?): 在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点,而最近公共祖先,就是两个节点在这棵树上深度最大的公共的祖先节点. 换句话说,就是两个点在这棵 ...

  8. [小专题]另一种字符串匹配的思路——Shift-And算法

    吐槽:前两天打组队赛遇到一个字符串的题考了这个(见:http://acm.hdu.edu.cn/showproblem.php?pid=5972 ) 当时写了个KMP瞎搞然后TLE了(害),赛后去查了 ...

  9. JavaWeb笔记——注册登录系统项目思路

    功能:   > 注册   > 登录 --------------------------------- JSP:   * login.jsp  --> 登录表单   * regist ...

随机推荐

  1. HTML5图形绘制

    要在HTML5中绘制图形,首先要放置一个canvas元素 <canvas id="canvas" width="400" height="300 ...

  2. Win10微软帐户切换不回Administrator本地帐户的解决方法--(转,虽转但亲测有效)

    在Win10系统中经常会用到微软帐户登录,如应用商店等地方,不过一些用户反馈原来使用Administrator帐户被绑定微软帐户后无法切换回本地帐户,连[改用本地帐户登录]按钮都没有,那么怎么解决呢? ...

  3. 填坑:在 SegmentFault 开发单页应用之图片引用的问题探索

    前言 前段时间,SegmentFault 低调上线了 技术号 模块,方便用户对数据进行集中管理.在开发过程中,第一次引入了 MV* 框架. SF 的基本架构还是后端路由,这也使得页面频繁地整体请求,体 ...

  4. JS代码中加上alert才能正常显示效果

    模拟一个生成验证码的效果,发现JS代码中加上alert可以正常刷新,没有alert时图片就会丢失,找到解决方法,但是还不是很明白,先记录下来. 生成验证码的servlet代码如下: package s ...

  5. CTSC 2017 滚粗记

    CTSC 2017 滚粗记 结束好几天了一直没写. 明天就要去参加二轮省选了,填一下坑吧. 所以可能很多东西已经忘了 Day -2 [5.5 Fri] 周五晚上是其他学信竞的同学来机房的时间... 也 ...

  6. BZOJ 3720: Gty的妹子树 [树上size分块]

    传送门 题意: 一棵树,询问子树中权值大于$k$的节点个数,修改点权值,插入新点:强制在线 一开始以为询问多少种不同的权值,那道CF的强制在线带修改版,直接吓哭 然后发现看错了这不一道树上分块水题.. ...

  7. BZOJ 1937: [Shoi2004]Mst 最小生成树 [二分图最大权匹配]

    传送门 题意: 给一张无向图和一棵生成树,改变一些边的权值使生成树为最小生成树,代价为改变权值和的绝对值,求最小代价 线性规划的形式: $Min\quad \sum\limits_{i=1}^{m} ...

  8. BZOJ 2199: [Usaco2011 Jan]奶牛议会 [2-SAT 判断解]

    http://www.lydsy.com/JudgeOnline/problem.php?id=2199 题意:裸的2-SAT,但是问每个变量在所有解中是只能为真还是只能为假还是既可以为真又可以为假 ...

  9. SDN第四次上机作业

    1.建立以下拓扑,并连接上ODL控制器. 2.利用ODL下发流表,使得h3在10s内ping不通h1,10s后恢复. 3.借助Postman通过ODL的北向接口下发流表,再利用ODL北向接口查看已下发 ...

  10. mysql必知必会

    春节放假没事,找了本电子书mysql必知必会敲了下.用的工具是有道笔记的markdown文档类型. 下面是根据大纲已经敲完的章节,可复制到有道笔记的查看,更美观. # 第一章 了解SQL## 什么是S ...