简易搜索引擎SEWeibo

背景

有一组微博事件数据,之前做了一些数据分析与挖掘的工作。想着用C++做一个简单的搜索引擎玩玩。

亮点:

  • 搜索支持关系关键字作为搜索条件,以文本情感极性作为初筛条件,以TF-IDF为搜索排序依据
  • 以Reactor模式为基础,实现C++后台,支持线程池、支持epoll实现I/O多路复用
  • 实现一个简单的前端,搭载在apache上
  • 引入redis实现缓存,引入日志系统

详细代码请到github:https://github.com/li-car-fei/SEWeibo

求求点个star~~

搜索关键步骤实现

预处理阶段:

  • 使用cppjieba对每个微博事件进行分词
  • 分词后计算每个事件的词频,并且根据情感词典计算每个事件的情感倾向分
  • 根据TF-IDF计算每个词在其出现的事件中的影响权重

实际搜索阶段:

  • 解析出搜索语句中的关键字:ANDORNOT
  • 按照搜索关键字分割搜索语句,并进行搜索,三个关键字分别对应搜索结果求交集、并集、非集
  • 将搜索语句视为一个事件,对其进行分词,计算词频、情感得分
  • 初筛:筛选出拥有搜索语句中所有词语的事件,并选出情感倾向与搜索语句相同的事件
  • 再筛:根据搜索语句的每个词语的权重值构成向量,再计算与备选集的余弦相似度,选取最相似的前k个返回
  • 根据搜索结果的事件ID,生成摘要并返回结果
  • redis 缓存

结果示例




Log 日志:

2023-11-10 17:06:15,951: INFO rootCategory : Log init success
2023-11-10 17:06:17,226: INFO rootCategory : cppjieba init!
2023-11-10 17:06:21,692: INFO rootCategory : 停词库,情感词表,网页库,偏移库,倒排索引库,情感得分表 读取数据成功!
2023-11-10 17:06:28,979: INFO rootCategory : >>client has connected 127.0.0.1:9006 >> 127.0.0.1:34133
2023-11-10 17:06:28,979: INFO rootCategory : search event: 蔡徐坤
2023-11-10 17:06:28,980: INFO rootCategory : redis key exists: 蔡徐坤
2023-11-10 17:06:28,980: INFO rootCategory : >>client has broken up 127.0.0.1:9006 >> 127.0.0.1:34133
...

细节

前端
  • 前端简单写的页面,用apache搭载,详见frontend文件夹
  • 后端返回json数据,前端用jquery进行解析渲染
单 Reactor 多线程模式
  • net 中实现 Reactor 相关、TCPConnection 相关;由 Acceptor 负责主线程连接相关,监听新的连接请求;回调函数挂载到 TCPConnection 上,由 EventLoop 从 epoll 中取出可操作的 socket 句柄,再调用 TCPConnection 中的回调函数进行处理;
  • threadpool 实现线程池,由回调函数中将业务处理函数添加到线程池的任务队列中,是和 Server 分离开的,不影响 Server 主线程监听连接;
  • using Task = function<void()>; 定义了添加到线程池任务队列的数据类型,是一个可调用对象(函数、函数指针、lambda表达式等皆可)
redis 缓存
  • 单例模式实现,将搜索语句与结果的JSON语句存储到缓存中
  • 在计算搜索匹配结果、词频、情感前先从缓存中查找有没有相应的key(即搜索语句文本),有则直接返回
  • 用于搜索运算消耗较大,使用缓存可以很好提高性能
log 日志
  • 基于log4cpp实现日志,单例模式
  • 在头文件中定义相应的宏,以实现简单调用日志接口
搜索细节
  • 关键字分割搜索语句,不同关键字对应不同的搜索结果合并
  • 首先搜索出包含搜索文本每个词的事件,并依据情感得分去除情感倾向不同的结果
  • 根据搜索规则匹配,合并得到搜索结果
  • 根据搜索语句的TF-IDF向量与搜索结果事件的向量计算余弦相似度并排序
  • 最终生成摘要并返回结果
// 执行查询void WordQuery::doQuery(RedisClient& redisClient, const string &s, const TcpConnectionPtr &ptr){// 先查询缓存auto redisResult = redisClient.get(s);if (redisResult.first){ptr->sendInEventLoop(redisResult.second);return;}// 提取关键字和搜索文本auto parseSearchTextResult = parseSearch(s);/*** 构建返回结果所需:*  (1)set<int> eventIds:事件id*  (2)map<int, map<string, int>> wordsMap : 词频记录(当前搜索语句所构建的event的) *  (3)map<int, vector<pair<string, double>>> vec :每个词与其权重(当前搜索语句所构建的event的) */set<int> eventIds;map<int, map<string, int>> wordsMaps;map<int, vector<pair<string, double>>> vecs;// 循环遍历关键字和搜索文本,构建结果searchThrough(eventIds, wordsMaps, vecs, parseSearchTextResult.first, parseSearchTextResult.second);// 根据第一个搜索map和搜索文本的vec 计算余弦排序,形成摘要string message = doReturn(eventIds, wordsMaps.begin()->second, vecs.begin()->second, ptr);// 设置缓存redisClient.set(s, message);}
依赖库
  • cppjieba:常用中文分词库
  • limonp:cppjieba中依赖的
  • jsoncpp:json相关实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/177584.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2013年7月18日 Go生态洞察:Go语言的第一个程序

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

什么是数据泄露?泄露途径有哪些?企业如何免遭数据泄露?

数据泄露指将机密信息、私人信息或其他敏感信息发布到不安全的环境中。数据泄露可能由意外引起&#xff0c;也可能是蓄意攻击的结果。 每年都有数百万人卷入数据泄露&#xff0c;包括意外看错病人图表的医生&#xff0c;以及大规模尝试访问政府计算机以发现敏感信息。 因为敏…

spring cloud alibaba 简介

微服务搭建组件选型 1.服务注册中心 Nacos(spring-cloud-alibaba) 2.服务通信 OpenFeign(spring-cloud) 3.服务熔断、降级、限流 Sentinel(spring-cloud-alibaba) 4.网关 Gateway(spring-cloud) 5.服务配置中心 …

查询站点真实IP地址,绕过CDN

一.如何判断站点是否使用了CDN&#xff1f; 使用其他省市的电脑进行ping看返回的IP地址是否相同通过第三方网站查询 站长工具 3.nslookup命令 二. 如何绕过CDN获取真实IP 子域名查询&#xff0c;因为很多站点只对主域名进行了CDN加速网站邮件头信息微步在线DNS查询

Java学习之路 —— 异常、集合、Stream

文章目录 1. 异常2. 集合2.1 遍历2.1.1 迭代器2.1.2 增强for循环2.1.3 Lambda 2.2 List2.3 Set2.3.1 HashSet2.3.2 LinkedHashSet2.3.3 TreeSet 2.4 Map 3. Stream 1. 异常 Exception&#xff1a;叫异常&#xff0c;是程序员可以捕捉的。异常又分为了2类&#xff1a; 运行时异…

吊椅在欧盟做EN581报告认证

什么是EN 581标准&#xff1f; EN 581标准是欧洲标准化委员会制定的关于户外家具机械物理性能要求的标准。该标准主要涉及耐候性、抗静态载荷、耐磨性、抗腐蚀性等方面的要求。 5.2 如何提高家具的抗静态载荷性能&#xff1f; 提高家具的抗静态载荷性能可以通过增加家具结构的…

无烟火焰:探索酒精壁炉的魅力

随着技术的不断发展&#xff0c;现代生活的很多方面都发生了变化&#xff0c;包括我们如何取暖和装饰我们的家。酒精壁炉是一个迅速崭露头角的家居装饰方式&#xff0c;为家庭带来了一种别具一格的现代化火焰体验。 过去&#xff0c;我们可能依赖于传统的木材壁炉或煤气取暖系统…

.pcd文件格式

更详细的格式介绍可以查看我的这篇博客 『Open3D』安装与点云格式通识_open3d安装_NNNNNathan的博客-CSDN博客文章浏览阅读1.9k次。介绍了open3d的安装和当前适用与存储点云信息的文件格式&#xff0c;并详细介绍了pcd与ply两种格式。_open3d安装https://blog.csdn.net/qq_413…

职场新人,如何提高自我管理能力?

作为职场新人&#xff0c;一定要学会个人管理。 入职三个月多&#xff0c;我总结了一个经验&#xff0c;作为职场新人&#xff0c;我越加觉得自我管理重要性。 在职场一个普遍的现象&#xff1a;在领导眼里&#xff0c;同样的问题在老职员身上不是问题&#xff0c;在新员工身…

CFCA国密证书

CFCA是中国金融认证中心的缩写&#xff0c;即China Financial Certification Authority。它是一家经过中国人民银行和国家信息安全机构批准成立的国家级权威安全认证机构&#xff0c;也是国际CA浏览器联盟组织&#xff08;CA/Browser Forum&#xff09;的成员&#xff0c;遵循全…

后端接口性能优化分析-数据库优化

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&…

智能财务管理,明细筛选一目了然,轻松掌握个人财务状况!

你是否曾经因为复杂的个人财务状况而感到困扰&#xff1f;你是否曾经因为无法快速筛选财务明细而感到烦恼&#xff1f;现在&#xff0c;我们为你带来了一款全新的智能财务管理工具&#xff0c;可以轻松解决你的这些问题&#xff01; 首先第一步&#xff0c;我们要进入晨曦记账…