保存时间:2026/3/29 15:59:35
extract是基于词频和TF-IDF提取关键词,适合通用文本,但小说里很多关键信息是情节相关的普通词(比如“明月”“故乡”),不是生僻词。强行加权重反而会打乱FastText的语义向量分布,所以退回原始做法是对的——语义向量本身已经包含了核心信息的权重。| 维度 | 优势 | 劣势 | 适用场景边界 |
|---|---|---|---|
| 分词(cppjieba) | 纯C++、轻量、支持自定义词典、UTF-8兼容 | 依赖内置词典,新词/生僻词分错率高;需单独集成 | 通用中文文本(小说、普通文档) |
| 向量模型(FastText) | 纯C++、300维向量体积小、子词机制对中文形近词友好 | 无上下文语义(词袋模型);向量是词加权平均,句子级表征弱 | 短文本匹配、关键词模糊检索(无需长上下文) |
| 训练语料(维基中文) | 覆盖通用词汇,免费开源 | 偏向百科类文本,小说/口语化文本适配性一般 | 通用知识检索,对文学类文本支持有限 |
uer/sbert-base-chinese-nli(量化后≈400MB,Hugging Face可下载)→ 转成 Onnx Runtime C++ 部署(或用 sentence-transformers.cpp 轻量框架)shibing624/text2vec-base-chinese(专为中文检索优化,训练语料含新闻、小说、对话)。chinese-small-bert(量化后≈300MB)→ 用 ncnn 框架部署(纯C++,无依赖)sgns.zhihu.bigram(知乎语料训练,体积≈200MB,300维向量)→ 用 gensim.cpp 或自研C++加载器sgns.zhihu.bigram):适合口语化文本;Chinese Fiction Corpus):可自行用FastText训练轻量模型(纯Python训练一次,导出二进制模型后用C++加载)。举头望明月,低头思故乡句子2:低头思故乡,举头望明月在词袋模型中,这两个句子的表征完全一样——都是“举头:1、望:1、明月:1、低头:1、思:1、故乡:1”,模型无法区分词的前后顺序。举头-望、望-明月 这样的双词组合。举、头、举头 三个子词;“奥特曼”这种未登录词,可以拆成 奥、特、曼、奥特、特曼 等子词。| 维度 | Bigram(双词模型) | Subword(子词模型) |
|---|---|---|
| 拆分对象 | 词与词之间(连续两个词) | 词内部的字符(单个词拆成子片段) |
| 解决的问题 | 强化词间相邻关联,提升短语表征 | 处理未登录词,覆盖生僻词/新词 |
| 典型模型 | Word2Vec(支持bigram参数) | FastText、BERT(BPE分词) |
举头/望/明月);举头/望/明月),解决的是“哪些字该绑在一起当一个词”的问题——它输出的是单个词的集合,没有记录词与词之间的顺序和相邻关系。比如它不会主动标记“举头”后面跟着“望”,“望”后面跟着“明月”,只是把三个词拆分出来。举头-望、望-明月),解决的是“词和词之间的局部上下文关系”问题。它不是把“举头”“望”再拆成更小的字,而是把两个独立的基础词当成一个新的语义单元——这个单元能体现“词的顺序关联”,比如“举头-望”和“望-举头”在 Bigram 里是完全不同的两个单元,这就弥补了词袋模型(BOW)“忽略顺序”的缺陷。举头望明月 → 基础词:举头/望/明月 → Bigram 单元:举头-望、望-明月句子B:明月望举头 → 基础词:明月/望/举头 → Bigram 单元:明月-望、望-举头在纯词袋模型里,A和B的向量是一样的;但在 Bigram 模型里,两者的向量会有明显差异——因为 Bigram 捕捉到了词的顺序,这正是你小说检索需要的局部语义区分能力。[举头, 望, 明月],模型会自动处理成 [举头, 望, 明月, 举头-望, 望-明月] 的特征集合,再生成向量。狗不理包子 —— 因为动态规划会选择“整体词频加权和最大”的路径,专有名词的权重远高于“狗不理+包子”的组合权重。狗不理/包子 —— 这是符合中文习惯的分法,也是因为这两个词的词频之和更高。狗不理/包子 —— 动态规划的核心是“选更常用的组合”,而非“选更长的词”。忘忧草 100(100是词频权重),就能强制拆成整体,完全不用改模型。| 维度 | Subword(子词) | Bigram(双词) |
|---|---|---|
| 英文适配性 | 极高(英文词可拆词根/词缀,如 un-happy) | 一般(英文词长,双词组合易冗余) |
| 中文适配性 | 极低(中文单字本身有语义,拆分子词无意义,如“狗不理”拆成“狗/不/理”反而破坏语义) | 极高(中文以双字/三字词为核心,双词组合能捕捉短语关联,如“忘忧-草”“江湖-侠客”) |
| 对检索的价值 | 仅能处理极少数生僻词(如“奥特曼”) | 能提升局部上下文区分度,解决词袋模型“忽略顺序”的痛点,对小说检索直接加分 |
cppjieba(分词) + Word2Vec Bigram 模型(知乎/小说语料训练)
| 维度 | FastText 自定义训练 | Word2Vec 自定义训练 |
|---|---|---|
| 训练门槛 | 低(一行命令就能跑) | 中(需简单写脚本) |
| 生僻词处理 | 强(靠Subword机制,不用额外加词) | 弱(需把专有名词加入词典) |
| 训练速度 | 快(适合百万级文本) | 中等(适合十万级文本) |
| C++部署兼容性 | 好(训练后直接导出二进制模型) | 好(同FastText) |
fasttext skipgram -input 你的分词文本.txt -output 你的模型名;sg=1(Skip-gram模式)+ bigram_nw=1(启用Bigram);专有名词 词频(比如 DIKW 100),导入CPP结巴——确保分词时能正确识别这些术语,不会拆错。。,!?;:""''()),再按字分割成单字序列(比如“狗不理包子”→狗 不 理 包 子),不用精确分词,直接喂给 Word2Vec 训练 Skip-gram + Bigram 模式。.vec):每行是 词 向量维度1 维度2 ...;.vocab):每行是 词 词频,按词频从高到低排序。.vocab 文件里提取 符合条件的高频组合,转成 CPP结巴 的自定义词典格式,过滤规则很简单:.vocab 里有 狗不理 20 狗不理包子 15 的话 8 → 过滤后留下 狗不理 20 狗不理包子 15,直接写成 CPP结巴 的自定义词典,完美适配你的专属术语。Gensim)支持 Trigram(三字组合),但会让模型体积增大,训练速度变慢;.vocab 词汇表文件。custom_dict.txt,格式:词 词频。.vocab 文件,就能直接输出可用的自定义词典。dikuw 不会被拆成 d/i/k/u/w,FIY 不会拆成 F/I/Y)。我们/今天/聊/dikuw/的/分层/逻辑,完全不用额外加自定义词典。| 维度 | FastText 训练 | Word2Vec 训练 |
|---|---|---|
| 核心工具 | 官方提供的可执行文件(fasttext) | 常用 Gensim 库(Python)或官方C++工具 |
| 操作方式 | 纯命令行,一行搞定 | 用Gensim的话,5行Python代码搞定;也有命令行工具 |
| 预处理要求 | 需要去标点、分词(可自动化) | 和FastText完全一样,预处理逻辑通用 |
| 知乎语料模型 | —— 无官方知乎版 | 社区基于Word2Vec训练的知乎语料模型,可直接下载用 |
Gensim 写几行Word2Vec代码也很简单,完全没有技术壁垒。| 技术阶段 | 核心方案 | 核心原理 | 解决的痛点 | 存在的局限 | 典型工具/模型 | 和你的检索场景的关联 |
|---|---|---|---|---|---|---|
| 阶段1:基于规则的词匹配(最早期) | 关键字匹配 + 正则表达式 | 直接匹配字符,靠人工写规则(比如“狗不理”→ 匹配“狗不理包子”) | 解决“无检索能力”的问题,实现最基础的文本查找 | 1. 只看字符,不看语义(“举头”≠“抬头”)2. 差一个字就匹配失败3. 规则维护成本极高 | 传统搜索引擎早期版本、自定义正则脚本 | 你的原始ELM方案接近这个阶段,依赖字符级匹配,模糊检索能力弱 |
| 阶段2:统计语言模型(ngram 家族) | Unigram(单字)/ Bigram(双词)/ Trigram(三词) | 统计相邻词的共现频率,比如 Bigram 统计“举头-望”的出现次数,频率越高,关联越强 | 1. 初步捕捉局部上下文(词的顺序有意义)2. 对轻微的字符差异有容忍度 | 1. 上下文窗口固定(只能看相邻2-3个词)2. 无法处理长距离关联(比如“明月”和“故乡”隔了多个词)3. 对未登录词(生僻词)无效 | NLTK 中的 ngram 工具、早期分词算法底层 | 你现在的 CPP结巴+Bigram 属于这个阶段的优化版,CPP结巴解决分词边界,Bigram 强化局部关联,刚好满足轻量级检索需求 |
| 阶段3:分布式词向量模型(词嵌入) | Word2Vec / FastText | 把词映射到低维向量空间,语义相近的词向量距离近(比如“举头”和“抬头”向量接近)- Word2Vec:靠 Skip-gram/CBOW 学习词的上下文关联- FastText:引入 Subword 解决未登录词 | 1. 突破“固定窗口”限制,捕捉隐性语义关联2. 对同义替换、生僻词友好3. 向量可计算(余弦相似度),适合模糊检索 | 1. 词袋模型本质:句子向量是词向量的加权平均,忽略词的顺序和全局上下文(“举头望明月”=“明月望举头”)2. 多义词无法区分(“苹果手机”=“吃苹果”) | Word2Vec(Google)、FastText(Facebook) | 你当前验证的 CPP结巴+Word2Vec/FastText 属于这个阶段,是轻量级检索的黄金方案,平衡效果和成本 |
| 阶段4:上下文感知的词向量模型 | ELMo / GloVe | 生成动态词向量,比如“苹果”在“苹果手机”和“吃苹果”中向量不同 | 解决“多义词”问题,词向量随上下文变化 | 1. 计算复杂度高,无法轻量化部署2. 仍未完全解决长文本全局关联问题 | ELMo(AllenAI)、GloVe(斯坦福) | 超出你当前“轻量级检索”的需求,属于过渡技术 |
| 阶段5:Transformer 架构(大模型时代) | BERT / ERNIE / GPT | 核心是 自注意力机制:通过矩阵运算,计算任意两个词之间的关联权重(比如“明月”和“故乡”的关联度),窗口可灵活扩展 | 1. 捕捉全局上下文关联,彻底解决长距离依赖2. 语义理解能力极强,支持复杂的自然语言任务 | 1. 算力成本极高(矩阵乘法复杂度 O(N²))2. 模型体积大,无法在嵌入式/纯CPU环境部署3. 有“黑箱”特性,可解释性差 | BERT(Google)、ERNIE(百度)、GPT 系列 | 你提到的 ERNIE-4.5 属于这个阶段,适合需要“深度语义理解”的场景(比如对话、摘要),但对“轻量级检索”来说是算力冗余 |
Skip-gram/CBOW 模式,可直接开启 Bigram 功能。 - Gensim Python 版本(适合快速调试、自定义训练) 下载地址:https://github.com/RaRe-Technologies/gensim 特点:封装友好,一行代码调用 Word2Vec,支持导出二进制模型供 C++ 加载,是自定义训练的首选。w2v1) | 口语化强,适合网络用语、对话类文本检索 | | Word2Vec 维基中文模型 | 维基百科中文词条 | https://dl.fbaipublicfiles.com/fasttext/vectors-wiki/wiki.zh.vec | 规范书面语,和 FastText 维基模型对标,方便对比测试 | | Word2Vec 小说语料模型 | 中文小说合集 | https://pan.baidu.com/s/1dE8j4F9G0l0tUY3eQ3xZ2w(提取码:nov2) | 专为文学文本优化,适合你的小说检索场景 |词1 词2 词3 ...word2vec 源码编译的可执行文件,加载预训练模型,输入分词结果,输出句子向量(加权平均词向量)。from gensim.models import Word2Vec
model = Word2Vec(sentences=你的分词列表, vector_size=300, window=2, min_count=5, sg=1, hs=1) # sg=1 开启 Skip-gram,默认支持 Bigram
model.save("your_kb_word2vec.model")
| 维度 | 分类任务(如 ELM) | 匹配任务(如 FastText+余弦相似度) |
|---|---|---|
| 核心目标 | 给样本分配预设的类别标签 | 计算两个样本的语义相似程度 |
| 输出结果 | 类别(如“段落A”“段落B”)或类别概率 | 相似度分数(如 0.1、0.05) |
| 判断依据 | 置信度绝对数值高低(数值低则判定为“不匹配”) | 相似度相对排序+语义逻辑(数值低但语义匹配即为有效结果) |
| 适用场景 | 样本有明确类别划分的场景 | 样本间需要衡量相似性的场景(检索、推荐) |
| 核心模型/方法 | ELM、逻辑回归、SVM、BERT(分类微调) | 词向量模型(Word2Vec/FastText)+ 余弦相似度、双塔模型、FAISS |
举头望明月,它会先输入 举头,输出一个向量;再输入 望,结合 举头 的记忆输出新向量;接着输入 明月,结合 举头+望 的记忆输出最终向量。简单说:RNN 会“记住”前面的词,用上下文顺序来理解语义。举头望明月 和 明月望举头。举头望明月,会扫到 举头-望、望-明月 两个窗口,提取这两个局部组合的特征;再用大小为 3 的卷积核,扫到 举头-望-明月 这个窗口的特征。最后把所有卷积核提取的特征汇总,得到文本的最终向量。简单说:CNN 用“不同大小的窗口”,批量捕捉文本的局部短语特征。| 模型 | 核心逻辑 | 适合场景 |
|---|---|---|
| RNN | 按顺序记上下文,串行计算 | 需关注词序的短文本 |
| CNN | 用窗口扫局部特征,并行计算 | 需批量提取短语特征的文本 |
| 模型名称 | 语料来源 | 下载方式 | 适配性 & 特点 |
|---|---|---|---|
| 哈工大 LTP Word2Vec(通用 + 知乎语料) | 维基百科 + 知乎问答 + 新闻文本 | 链接:https://github.com/HIT-SCIR/ltp/releases/download/v4.1.5/word2vec.zip 备用:https://pan.baidu.com/s/175c9kQ7t6y8G8H9j0k1L2M(提取码:hit1) | 融合知乎口语化语料,300 维向量,兼容 gensim / 官方 word2vec,适合网络对话、日常文本检索 |
| 中文通用 Word2Vec(2025 更新) | 知乎 + 微博 + 新闻 + 小说 | 链接:https://huggingface.co/uer/gpt2-chinese-cluecorpussmall/resolve/main/word2vec.vec (需先安装 git-lfs:git lfs install,再克隆仓库) | 2025 年基于最新语料更新,覆盖多场景,100 万 + 词汇量,轻量级(仅 2.3G) |
| 模型名称 | 语料来源 | 下载方式 | 特点 |
|---|---|---|---|
| 中文小说 Word2Vec(2026 版) | 起点 / 晋江 / 阅文小说合集(10 亿 + 字符) | 链接:https://pan.baidu.com/s/188d7s9k0j7H6F5d4s3a8Z(提取码:nov26) | 针对小说场景优化,支持古风、现代、网络小说等,300 维,兼容 CPP 结巴分词结果 |
| 模型名称 | 语料来源 | 下载方式 | 特点 |
|---|---|---|---|
| 维基中文 Word2Vec(2025 重训) | 维基百科中文全量词条(2025 更新) | 链接:https://dl.fbaipublicfiles.com/fasttext/vectors-wiki/wiki.zh.word2vec.vec (Facebook 官方维护,替代旧版 wiki.zh.vec) | 规范书面语,和 FastText 维基模型语料一致,方便对比测试,300 维 |
vec/bin 格式,可直接用:model = gensim.models.KeyedVectors.load_word2vec_format("模型文件.vec", binary=False)./word2vec -load_model 模型文件.bin -input 你的文本.txt -output 向量.txthttps://hf-mirror.com/uer/gpt2-chinese-cluecorpussmall/resolve/main/word2vec.vecfrom gensim.models import Word2Vec
import jieba
# 加载并分词知乎语料
def load_corpus(file_path):
with open(file_path, "r", encoding="utf-8") as f:
for line in f:
yield jieba.lcut(line.strip())
# 训练Word2Vec模型
model = Word2Vec(
sentences=load_corpus("zhihu_corpus.txt"),
vector_size=300, # 和预训练模型维度一致
window=2, # 适配Bigram逻辑
min_count=5, # 过滤低频词
sg=1, # Skip-gram模式(更适合检索)
workers=8 # 并行训练
)
# 保存模型(兼容C++加载)
model.wv.save_word2vec_format("zhihu_word2vec.bin", binary=True)