简易搜索引擎SEWeibo

news2025/3/12 23:48:16

背景

有一组微博事件数据,之前做了一些数据分析与挖掘的工作。想着用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.coloradmin.cn/o/1211321.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

win10关闭讲述人、粘滞键功能的快捷键启动

简单记录下在win10关闭讲述人、粘滞键快速启动的快捷键&#xff0c;这两个功能对正常人没什么用。误触发很烦。 禁用讲述人 按windows键&#xff0c;输入“轻松使用设置”&#xff0c;点“讲述人”&#xff0c;如下图取消讲述人开关和快捷键的勾选。 禁用粘滞键 按windows…

CSGO游戏搬砖还能做吗?CSGO饰品未来走势如何?

CSGO饰品市场会崩盘吗&#xff1f;CSGO还能做多久&#xff1f; 如何看待CSGO饰品市场的整体走向&#xff1f; 从整体来说&#xff0c;CSGO的饰品市场与规模肯定会持续不断的上升&#xff0c;大盘不会发生特别大的波动&#xff0c;目前处于稳定期&#xff01;&#xff01;&…

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

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

一文详解oa人事系统!

一、什么是OA系统 OA系统全称为Office Automation&#xff0c;即办公自动化系统。它是一种专门为企业和机构的日常办公工作提供服务的综合性软件平台&#xff0c;具有信息管理、流程管理、知识管理&#xff08;档案和业务管理&#xff09;、协同办公等多种功能。 OA系统可以帮…

vue中bus的详细使用

vue中关于兄弟组件bus的使用方法 首先&#xff0c;bus可以用在任何组件之间的传值 废话不多说&#xff0c;请看下面代码解说 首先&#xff0c;先创建bus.js文件&#xff0c;然后在引用&#xff0c;这里有两种引用方法&#xff1a;局部引用和全局引用。 // bus.js文件内容 imp…

【Spring进阶系列丨第一篇】初识Spring开发

前言 小伙伴们大家好&#xff0c;我是陈橘又青&#xff0c;今天起 《Spring进阶系列》 开始更新。本专栏将涵盖Spring框架的核心概念、配置管理、Web开发、AOP、Boot、Security、Data、Integration和Batch等多个主题。通过理论讲解和实际案例的剖析&#xff0c;帮助读者深入理解…

南湖HIT论坛|《医疗数据安全风险分析及防范实践(2023)》正式发布

11月11日&#xff0c;2023年南湖HIT论坛在浙江嘉兴隆重举行。作为颇受HIT从业者关注的年度盛会——本届论坛以“数据驱动医院运营管理”为主题&#xff0c;全国各地医疗机构信息主管和骨干围绕“数据驱动运营管理、运营数据中心建设、数据治理和数据安全”等话题展开深入研讨。…

FPGA:我的零基础学习路线(2022秋招已上岸)持续更新中~

可内推简历&#xff0c;丝我即可 前言 初次接触FPGA是在2022年3月左右&#xff0c;正处在研二下学期&#xff0c;面临着暑假找工作&#xff0c;周围的同学大多选择了互联网&#xff0c;出于对互联网的裁员形势下&#xff0c;我选择了FPGA&#xff0c;对于硬件基础知识我几乎是…

【数据结构】堆(Heap):堆的实现、堆排序、TOP-K问题

目录 堆的概念及结构 ​编辑 堆的实现 实现堆的接口 堆的初始化 堆的打印 堆的销毁 获取最顶的根数据 交换 堆的插入&#xff08;插入最后&#xff09; 向上调整&#xff08;这次用的是小堆&#xff09; 堆的删除&#xff08;删除根&#xff09; 向下调整&#xff08;这次用的…

2013年6月26日 Go生态洞察:Go Race Detector的探索

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

centos下安装mysql8版本

1、如果服务器没有wget&#xff0c;先下载wget工具 sudo yum install wget 2、下载指定mysql版本的tar包 sudo wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.21-1.el7.x86_64.rpm-bundle.tar 3、解压tar包 sudo tar -xvf mysql-8.0.21-1.el7.x86_64.rpm…

现代浴室:从硬朗到柔美

现代浴室不再是冰冷的地方&#xff0c;而是一个温馨的角落。它是我们日常生活中的庇护所&#xff0c;一个能够唤起宁静和舒适感的地方。如今&#xff0c;浴室的设计注重的是颜色、材质、光线和表面的精心搭配&#xff0c;以创造一个柔和、温馨的空间。 与过去的硬朗陶瓷、锋利…

全国犯罪人数大数据可视化平台【可视化项目案例-08】

🎉🎊🎉 你的技术旅程将在这里启航! 🚀🚀 本文选自专栏:可视化技术专栏100例 可视化技术专栏100例,包括但不限于大屏可视化、图表可视化等等。订阅专栏用户在文章底部可下载对应案例源码以供大家深入的学习研究。 🎓 每一个案例都会提供完整代码和详细的讲解,不…

工厂自动化中DCS软件

概述 Monitor.Analog是新一代运行监控系统&#xff0c;是物联网时代数据驱动的智能工厂的神经中枢。通过连接到阿自倍尔专有的在线故障预测系统&#xff08;该系统利用 AI&#xff08;人工智能&#xff09;&#xff09;以及利用来自各个智能设备的监控和诊断数据的系统&#x…

Spring Boot EasyPOI 使用指定模板导出Excel

相信大家都遇到过&#xff0c;用户提出要把界面上的数据导成一个Excel&#xff0c;还得是用户指定的Excel格式&#xff0c;用原生的POI&#xff0c;需要自己去实现&#xff0c;相信是比较麻烦的&#xff0c;所以我们可以使用开源的EasyPOI. 先上个图&#xff0c;看看是不是大家…

第三篇 基于JSP 技术的网上购书系统—— 数据库系统设计(网上商城、仿淘宝、当当、亚马逊)

目录 1.逻辑关系设计 2.物理设计 2.1管理员表 2.2留言表 2.3会员登录表 2.4会员表 2.5订单表 2.6订单商品表 2.7产品表 2.8产品货架表 2.9收藏表 2.10类别表 2.11新闻表 数据库系统是用来保存数据的软件系统&#xff0c;当今比较流行的数据库系统&#xff0c;如 MS…

Linux在线安装MySQL8.0.24安装、MySQL数据备份和恢复

一、 Linux在线安装MySQL8.0.24 如果机器上已经有MySQL5.7版本需要先卸载 首先&#xff0c;需要停止MySQL服务。可以通过以下命令来停止服务&#xff1a; sudo systemctl stop mysqld接下来&#xff0c;我们需要卸载MySQL5.7。可以通过以下命令来卸载&#xff1a; sudo yum…

为什么串行通信中停止位(停止bit、stop bit)通常使用高电平?

文章目录 基于高电平的停止位选择&#xff1a;理解其深层原因引言数据通信和停止位数据通信简介停止位的定义和作用 为什么选择高电平作为停止位&#xff1f;硬件的考虑误码率的影响 总结参考资料 基于高电平的停止位选择&#xff1a;理解其深层原因 引言 在数字通信中&#…

WPF小知识

在编写WPF程序遇到一些小问题&#xff0c;所以记录起来&#xff0c;查其他方便。 Label自动换行 网上搜的都不能自动换行&#xff0c;发现使用Run 就可以。在脚本中直接调用labTip.Text进行赋值就可以了。 <Label Foreground"#FF9E9E9E" FontSize"16"…

人工智能基础_机器学习035_多项式回归升维实战2_使用sklearn的PolynomialFeatures进行升维---人工智能工作笔记0075

我们再来做一个升维处理,这里我们不再自己去对数据进行比如,相乘操作,来给数据手动添加维度了, 这里我们用sklearn库提供的PolynomialFeatures来自动对数据进行升维. from sklearn.linear_model import LinearRegression # PolynowlalFeatures,多项式升维处理 from sklearn.…