一、从需求出发:为什么需要KeyBERT
关键词提取是自然语言处理(Natural Language Processing,NLP)中的基础任务,被广泛应用于引擎、内容推荐、文档归档、RAG检索增强生成等场景。很多人实际使用关键词提取时,会发现一个共性问题:

如果你正在学习NLP、准备面试,或者需要在业务中落地关键词提取技术,那么
本文将从传统方法的痛点 → KeyBERT核心原理 → 代码实操 → 底层技术 → 面试考点,完整串讲这条技术链路。

二、痛点切入:传统关键词提取方法的局限
2.1 传统方法怎么做的?
在KeyBERT出现之前,业界常用的关键词提取方法主要有以下几种:
TF-IDF:基于词频和逆文档频率计算权重,选top-k作为关键词。实现简单,但纯统计方法无法理解语义——比如“苹果”在科技文章和水果文章中权重相同,无法区分上下文含义-。
TextRank:借鉴PageRank算法思想,将文本构建为词图,通过随机游走迭代计算词的重要性。问题在于涉及网络构建和迭代计算,速度慢,且效果并不比TF-IDF强-。
RAKE / YAKE:基于手工规则的关键词提取,依赖人工总结的规则(词位置、词频、上下文关系等) ,效果不稳定,泛化能力弱-。
2.2 传统方法的共性问题
无法理解语义上下文:统计方法只看词频,忽略词语之间的语义关系
依赖语料库:TF-IDF需要预先统计整个语料库的文档频率,不适用于单文档场景
规则依赖重:手工规则难以覆盖多样化的语言表达
效果上限明显:TextRank等图算法速度慢,且提取的关键词相关性不足
正是这些痛点的存在,催生了KeyBERT——一个基于BERT语义嵌入、无需训练、开箱即用的轻量级关键词提取工具-9。
三、核心概念讲解:什么是KeyBERT
KeyBERT(全称:Keyword extraction using BERT)是一个基于BERT嵌入(BERT Embeddings) 的最小化关键词提取技术,它利用余弦相似度(Cosine Similarity) 来找出文档中最能代表其主题的词语或短语-9。
3.1 通俗理解
把一篇文档想象成一个“知识星球”,每个候选词是这个星球上的一个“点位”。KeyBERT做的事情很简单:先用BERT把整个星球的“质心”算出来(文档向量),再把每个点位的坐标算出来(词向量),然后找出离质心最近的那些点位——它们就是最能代表这篇文档的关键词-34。
3.2 KeyBERT的核心优势
| 维度 | KeyBERT | 传统方法 |
|---|---|---|
| 语义理解 | ✅ 基于BERT,理解上下文 | ❌ 只看词频/统计 |
| 上手成本 | 3行代码,零配置 | 需分词、去停用词、构建特征 |
| 训练需求 | 无需训练,直接使用预训练模型 | TF-IDF需语料库,TextRank需建图 |
| 多语言支持 | ✅ 支持多语言预训练模型 | 需单独配置词表 |
四、KeyBERT的实现流程
KeyBERT提取关键词的核心流程可以概括为三个步骤-9-34:
第一步:文档嵌入
使用BERT模型将整篇文档编码成一个固定维度的向量(document embedding) ,这个向量代表了文档的语义信息。KeyBERT支持从Sentence-Transformers、Flair、Huggingface Transformers、spaCy等多种框架中下载预训练模型来完成这一步-34。
第二步:候选词嵌入
提取文档中的N-gram词/短语,并使用相同的BERT模型将它们分别编码为向量。N-gram的n-gram范围可以通过keyphrase_ngram_range参数控制——例如(1,1)表示只取单个词,(1,2)表示同时考虑单个词和双词短语-16。
第三步:余弦相似度计算
计算文档向量与每个候选词向量之间的余弦相似度,值越接近1表示语义越相近。选择相似度最高的top-K个候选词作为最终的关键词-9。
3.3 解决多样性问题
如果直接取相似度最高的N个候选词,可能会遇到一个问题:这些词虽然都很相关,但彼此语义高度相似,缺乏多样性-34。例如从一篇机器学习的文档中,可能提取出“学习”、“训练”、“算法”这三个高度相关的词——本质上说的是同一件事,缺乏信息量。
KeyBERT提供了两种算法来解决这个问题:
MSS(Max Sum Similarity) :先从全部候选词中筛选出top-N个最相似的候选词(N > K),然后从这个集合中选出彼此最不相似、但整体相关性依然高的K个词-34-52。
MMR(Maximal Marginal Relevance) :通过
diversity参数(取值范围0~1)来平衡“相关性”和“多样性”。diversity=0.2时优先保相关性,diversity=0.7时优先保多样性-16。
五、代码示例:从入门到进阶
5.1 极简入门示例
from keybert import KeyBERT 示例文档(监督学习定义) doc = """ 监督学习是一种机器学习任务,它通过学习从输入到输出的映射函数, 基于示例输入-输出对进行训练。它从一组标记的训练数据中推断出函数。 """ 初始化KeyBERT模型 kw_model = KeyBERT() 提取关键词 keywords = kw_model.extract_keywords(doc) print(keywords)
输出效果:[('学习', 0.4604), ('算法', 0.4556), ('训练', 0.4487)](具体分数值因模型而异)-16
5.2 常用参数配置
控制关键词长度:只提取单字词 single_words = kw_model.extract_keywords(doc, keyphrase_ngram_range=(1, 1)) 控制关键词长度:提取1~2个词组成的关键短语 keyphrases = kw_model.extract_keywords(doc, keyphrase_ngram_range=(1, 2)) 使用MMR平衡相关性与多样性(高多样性) high_diversity = kw_model.extract_keywords(doc, use_mmr=True, diversity=0.7)
5.3 自定义候选词 + 引导式提取(进阶)
import yake from keybert import KeyBERT 先用YAKE生成一批候选关键词 kw_extractor = yake.KeywordExtractor(top=50) candidates = [kw[0] for kw in kw_extractor.extract_keywords(doc)] 再用KeyBERT从这批候选中筛选最优结果 kw_model = KeyBERT() keywords = kw_model.extract_keywords(doc, candidates=candidates) 引导式提取:给定种子关键词,提取与之相关的关键词 seed_keywords = ["机器学习", "监督学习"] guided_keywords = kw_model.extract_keywords(doc, seed_keywords=seed_keywords)
六、底层原理与技术支撑
KeyBERT的底层核心技术依赖两个关键组件:
6.1 BERT与Transformer
BERT(Bidirectional Encoder Representations from Transformers)是Google于2018年提出的预训练语言模型。它的核心创新在于双向编码——在编码某个词时,同时利用该词的左侧和右侧上下文信息,这使得BERT能够真正“理解”词语在上下文中的含义,而非简单地统计词频。
KeyBERT使用的正是BERT预训练模型来生成文档和候选词的语义向量(embeddings)。这些向量将自然语言映射到高维语义空间,使得语义相近的词在空间中距离较近。
6.2 余弦相似度
余弦相似度是计算两个向量之间夹角的余弦值,取值范围为[-1, 1]。当两个向量方向完全一致时,余弦相似度为1。在KeyBERT中,文档向量和候选词向量的余弦相似度越高,表示该候选词在语义上越能代表整篇文档-9。
6.3 性能考量
需要说明的是,KeyBERT由于需要调用预训练模型对文档和所有候选词进行编码,速度相对较慢,但效果最好——在大规模应用场景中通常将其作为“精排”环节,而非“粗筛”环节-38。
七、高频面试题与参考答案
Q1:KeyBERT与传统关键词提取方法(如TF-IDF、TextRank)的核心区别是什么?
参考答案要点:
技术路线不同:TF-IDF、TextRank基于统计特征或图算法,只看词频和共现关系;KeyBERT基于BERT语义嵌入,理解上下文含义
语义理解能力:传统方法无法区分多义词在不同语境下的含义;KeyBERT能捕捉语义相似性
语料依赖:TF-IDF需要语料库支持,TextRank需要构建词图;KeyBERT直接使用预训练模型,开箱即用
效果对比:KeyBERT在大多数场景下效果最好,但速度也最慢-38
Q2:KeyBERT提取关键词的具体流程是什么?
参考答案要点:
文档嵌入:使用BERT对整篇文档编码,得到文档级向量
候选词嵌入:提取N-gram词/短语,使用相同模型编码得到候选词向量
相似度计算:计算文档向量与每个候选词向量的余弦相似度
选Top-K:选择相似度最高的K个候选词作为关键词
多样性优化(可选) :使用MSS或MMR算法平衡相关性和多样性-9
Q3:如何解决KeyBERT提取的关键词过于相似、缺乏多样性的问题?
参考答案要点:
设置
use_mmr=True并调节diversity参数,MMR算法平衡相关性与多样性,参数越高多样性越强设置
use_maxsum=True,MSS算法先选top-N个最相似的词,再从其中选出彼此最不相似的一个组合两种方式任选其一,或通过
candidates参数引入外部候选词-16
Q4:KeyBERT和KeyLLM有什么区别?如何结合使用?
参考答案要点:
KeyBERT:基于BERT嵌入+余弦相似度,关键词必须出现在原文中
KeyLLM:基于大语言模型(LLM)生成,可以产生不在原文中出现的概念性关键词
结合方式:KeyBERT生成初步关键词 + KeyLLM二次优化,兼顾效率和概念表达能力-19
Q5:KeyBERT在RAG系统中有什么应用价值?
参考答案要点:
元数据增强:用KeyBERT为文档生成关键词标签,作为RAG检索时的额外索引字段
检索优化:关键词辅助稀疏检索(如BM25),提升召回效果
查询扩展:对用户模糊查询进行关键词扩展,提升检索命中率-31-
八、结尾总结
回顾核心知识点
| 模块 | 核心内容 | 易错点/考点 |
|---|---|---|
| 痛点 | TF-IDF、TextRank的语义盲区 | 需能对比说明不同方法的优劣 |
| 原理 | BERT嵌入 + 余弦相似度 | 3步流程必须讲清楚 |
| 多样性 | MSS与MMR | 面试常考,注意参数含义 |
| 底层 | Transformer + 预训练模型 | 不要求源码,但需知道依赖关系 |
| 延伸 | KeyLLM、RAG增强 | 加分项,体现知识广度 |
重点强调
KeyBERT解决的是“语义级”关键词提取问题,区别于传统方法的“统计级”提取
效果最好,速度最慢——这是它的性能画像,设计系统时需权衡
MSS和MMR是面试高频考点,务必理解两种算法的设计思想差异
下篇预告
下一篇我们将深入讲解 KeyLLM + KeyBERT的组合用法,以及如何在大规模文档场景下通过聚类提升关键词提取效率。欢迎持续关注!
温馨提示:本文代码示例基于KeyBERT v0.8版本,实际使用时建议参考官方文档获取最新版本信息。