跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++AI算法

C++ 搜索引擎通用工具模块:文件读取与中文分词实现

分享 C++ 搜索引擎项目中通用工具模块的实现细节,涵盖文件读取优化与静态分词器设计。通过 FileUtil 类封装二进制文件流操作,确保读取安全;利用 JiebaUsutl 类的静态成员变量管理词典资源,避免重复初始化开销。代码包含完整头文件结构,适用于构建倒排索引前的预处理阶段。

DevOpsTeam发布于 2026/3/16更新于 2026/10/878 浏览
C++ 搜索引擎通用工具模块:文件读取与中文分词实现

在构建基于正倒排索引的搜索引擎时,预处理阶段的通用工具类至关重要。我们将文件读取、字符串处理及中文分词封装为 ns_util 命名空间下的模块,确保项目其他部分能高效复用。

1. FileUtil:文件读取封装

该类负责从指定路径读取文件内容并按行追加到输出字符串中。采用二进制输入模式打开文件,既能保证读取效率,又避免了对原文件的意外修改。若文件打开失败(如路径错误),会输出错误信息并返回 false。

class FileUtil {
public:
    static bool ReadFile(const std::string &file_path, std::string *out) {
        // 使用 std::ifstream 以二进制输入模式打开文件
        std::ifstream in(file_path, std::ios::in | std::ios::binary);
        
        if (!in.is_open()) {
            std::cout << "open file " << file_path << ": error" << std::endl;
            return false;
        }

        std::string line;
        // getline 重载了 bool 转换操作符,可直接用于循环判断
        while (std::getline(in, line)) {
            *out += line;
        }
        
        in.close();
        return true;
    }
};

2. JiebaUsutl:静态分词器设计

这里是对 cppjieba 库的封装。核心在于利用 static 成员变量管理词典资源。由于词典初始化成本较高且通常只需一个实例,使用静态成员可确保整个程序运行期间只初始化一次,避免重复创建对象带来的资源消耗。

同时,分词函数 CutString 设为静态成员,无需实例化类即可通过类名调用,简化了接口使用。

const char* const DICT_PATH = "test/cppjieba/dict/jieba.dict.utf8";
const char* const HMM_PATH = "test/cppjieba/dict/hmm_model.utf8";
 *  USER_DICT_PATH = ;
 *  IDF_PATH = ;
 *  STOP_WORD_PATH = ;

  {
:
    
     cppjieba::Jieba jieba;

:
    
    {
        jieba.(src, *out);
    }
};



;
const
char
const
"test/cppjieba/dict/user.dict.utf8"
const
char
const
"test/cppjieba/dict/idf.utf8"
const
char
const
"test/cppjieba/dict/stop_words.utf8"
class
JiebaUsutl
private
// 静态成员 jieba 仅在首次使用时初始化,全局共享
static
public
// 静态方法,直接通过类名调用
static void CutString(const std::string& src, std::vector<std::string>* out)
CutForSearch
// 类外初始化静态成员,传入词典路径
// 确保后续调用 CutString 时 jieba 已就绪
cppjieba::Jieba JiebaUsutl::jieba(DICT_PATH, HMM_PATH, USER_DICT_PATH, IDF_PATH, STOP_WORD_PATH)

3. 完整代码汇总

以下是 usuallytool 部分的完整头文件内容,整合了文件工具、字符串分割及分词功能,可直接引入项目使用。

#pragma once
#include <iostream>
#include <string>
#include <fstream>
#include <boost/algorithm/string.hpp>
#include "cppjieba/Jieba.hpp"

namespace ns_util {

class FileUtil {
public:
    static bool ReadFile(const std::string &file_path, std::string *out) {
        std::ifstream in(file_path, std::ios::in | std::ios::binary);
        if (!in.is_open()) {
            std::cout << "open file " << file_path << ": error" << std::endl;
            return false;
        }
        std::string line;
        while (std::getline(in, line)) {
            *out += line;
        }
        in.close();
        return true;
    }
};

class StringUtil {
public:
    // target 是要切分的目标,out 是结果容器,sep 是分隔符
    static void Split(const std::string& target, std::vector<std::string>* out, std::string sep) {
        boost::split(*out, target, boost::is_any_of(sep), boost::token_compress_on);
    }
};

const char* const DICT_PATH = "test/cppjieba/dict/jieba.dict.utf8";
const char* const HMM_PATH = "test/cppjieba/dict/hmm_model.utf8";
const char* const USER_DICT_PATH = "test/cppjieba/dict/user.dict.utf8";
const char* const IDF_PATH = "test/cppjieba/dict/idf.utf8";
const char* const STOP_WORD_PATH = "test/cppjieba/dict/stop_words.utf8";

class JiebaUsutl {
private:
    static cppjieba::Jieba jieba;
public:
    static void CutString(const std::string& src, std::vector<std::string>* out) {
        jieba.CutForSearch(src, *out);
    }
};

cppjieba::Jieba JiebaUsutl::jieba(DICT_PATH, HMM_PATH, USER_DICT_PATH, IDF_PATH, STOP_WORD_PATH);

}

目录

  1. 1. FileUtil:文件读取封装
  2. 2. JiebaUsutl:静态分词器设计
  3. 3. 完整代码汇总

更多推荐文章

查看全部
  • DFS 算法求解数组子集问题
  • OpenClaw 视觉自动化:无需接口,让 AI 直接操作软件界面
  • STL 源码剖析:深入理解 list 容器实现机制
  • PaperZZ 论文查重与 AIGC 检测工具评测
  • Python+AI 学习路线指南:从入门到实战
  • FlashRAG-Paddle:基于 PaddleNLP 的高效 RAG 开发与评测框架
  • 智能车竞赛惯导与视觉避障实战经验分享
  • Arcade:Python 轻量级 2D 游戏开发库入门与实战
  • 三维组合导航算法:INS与GNSS融合及卡尔曼滤波MATLAB实现
  • 知识库与智能体驱动的制造业 AI 预测性维护方案
  • 《Agent Runtime 工程化》Agent 为什么必须有 Token Budget?
  • 企业级私有化 AI 部署:从大模型原理到本地智能机器人实战
  • C 语言排序算法:快速排序详解与优化变式
  • AI 农业创业实践:基于 ViT 的轻量化作物病虫害检测系统
  • Whisper-large-v3 离线部署实战:摆脱 HuggingFace Hub 的网络依赖
  • 易语言子程序高级应用:递归、回调与参数设计实战
  • Kimi 高级用法教程:从入门到 AI 应用实战
  • Umi 脚手架创建项目实战指南
  • C++ 模板深入进阶:原理与实战技巧
  • LLaMA-Factory 微调 InternVL3 报错 Processor was not found 解决方案
  • 相关免费在线工具

    • 加密/解密文本

      使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

    • RSA密钥对生成器

      生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

    • Mermaid 预览与可视化编辑

      基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

    • 随机西班牙地址生成器

      随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

    • Gemini 图片去水印

      基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

    • Base64 字符串编码/解码

      将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online