摘要:本篇从理论到实践介绍了超好用的无监督关键词提取算法Keybert。首先介绍了调研背景;然后重点介绍了什么是Keybert、KeyBERT提取关键词流程和如何通过MSS和MMR算法解决多样性问题;最后从实践的角度介绍了KeyBERT的安装、使用以及影响效果的因素。对于希望使用无监督学习算法抽取关键词的小伙伴可能有帮助。
下面主要按照如下思维导图进行学习分享:
最近在做关键词抽取项目,需要将用户搜索query、资讯news、广告文案、用户点击title等不同场景下的文本数据提取关键词,然后作为特征提供给下游召回和推荐场景中使用。之前也分享过一篇关键词抽取的文章《》
关键词抽取流程主要分成获取候选词和候选词打分两个流程:
图1 关键词抽取流程
对于获取候选词流程,中文场景下主要是分词,一方面我们主要通过jieba和哈工大pkuseg分词,另一方面还可以通过BERT进行分词;
对于候选词打分流程,主要通过无监督学习和有监督学习两大类进行打分。
最近调研到Keybert作为一种无监督学习的关键词抽取流程,效果不错,这里对Keybert进行调研并打算应用到广告场景中。
2.1 什么是Keybert
Keybert是一种基于无监督学习的关键词抽取技术,不仅效果好,而且易于使用。Keybert主要通过Bert获取文档和候选词的embedding,然后使用余弦相似度计算得到文档中最相似的候选词作为关键词。
2.2 Keybert提取关键词流程
图2 Keybert提取关键词流程
Keybert提取关键词流程如上图所示,主要包括三个流程:
第一步,使用Bert获取文档/候选词的embedding表示;
图3 使用Bert获取文档的embedding表示
这里需要注意的是文档embedding质量的好坏会影响关键词抽取的结果。Keybert支持从sentence_transformers、Flair、Hugginface Transformers、spaCy等下载预训练模型对文档进行embedding编码;
第二步,使用词嵌入模型提取n-gram词或者关键词作为候选词,这里可以是sklearn中的CountVectorizer或者Tfidf等方法;
图4 使用词嵌入模型CountVectorizer提取候选词
第三步,计算文档和候选词的余弦相似度,找到最能表示文档的关键词。
图5 使用余弦相似度找到最能表示文档的关键词
2.3 Keybert如何解决多样性问题
了解了Keybert提取关键词的流程后,下面通过一个实际的例子查看Keybert抽取效果,同时了解下作者是如何解决多样性问题。使用下面的英文文档:
图6 英文文档
使用Keybert抽取top5的候选关键词结果如下:
图7 top5候选关键词结果
上面抽取的5个候选关键单词可以很好的代表文档内容即有监督学习定义。相比于单词,我们还可以抽取词组作为候选关键词,把n_gram_range设置成(3,3)则可以使用3个单词组成的词组作为候选关键词,抽取结果如下:
图8 使用3-gram抽取top5相似词组作为候选关键词
虽然使用3-gram词组相比于单个词来说更能代表关键词,但是存在的问题是词组之间十分相似。Keybert的作者认为词组之间比较相似主要原因在于这些词是最能代表文档的关键词, Keybert主要通过MSS(Max Sum Similarity)和MMR(Maximal Marginal Relevance)两种算法来提升关键词的多样性。
2.3.1 Max Sum Similarity算法
MSS算法思想是先找到topN相似的单词或词组作为候选词nr_candidates,然后从nr_candidates中找到最不像的topK作为候选关键词。MSS算法实现代码:
图9 MSS算法实现代码
通过MSS可以提升抽取关键词的多样性,当MSS中的nr_candidates设置过小时基本和余弦相似度结果类似,基本失去作用;但是当nr_candidates设置过大时则容易导致提取关键词不准。下面是MSS中的nr_candidates的对关键词抽取结果影响:
图10 MSS中的nr_candidates的对关键词抽取结果影响
2.3.2 Maximal Marginal Relevance算法
MMR最大边缘相关算法目的一方面是减少排序结果的冗余,另一方面保证结果的相关性。最早应用于文本摘要提取和信息检索等领域,在推荐场景下体现在给用户推荐相关商品的同时,保证推荐结果的多样性,即排序结果存在着相关性与多样性的权衡。MMR的核心思想是找到和文档Q最相似同时和其他候选关键词Dj最不相似的候选词Di作为关键词。下面是MMR的计算公式:
图11 MMR计算公式
MMR算法实现代码如下:
图12 MMR算法实现代码
通过参数diversity来控制多样性,如果参数值设置过低则和相似度计算结果差不多。下面分别是设置diversity为0.2和0.7时关键词抽取效果:
图13 MMR中的diversity的对关键词抽取结果影响
上面从理论方面详细介绍了Keybert算法,下面从代码实践的角度介绍Keybert。
3.1 Keybert安装
3.2 Keybert使用
通过下面的代码可以构建Keybert模型:
Keybert主要的参数是预训练模型,在0.4.0版本默认“paraphrase-MiniLM-L6-v2”,在0.6.0版本模型是“all-MiniLM-L6-v2”。需要注意的是0.6.0版本还支持Hugginface Transformers库的预训练模型。
抽取关键词的方法是extract_keywords函数,函数说明如下图所示:
图14 extract_keywords函数说明
extract_keywords主要有以下参数:
函数返回文档的前 n 个关键词及距离得分。
3.3 Keybert效果影响
3.3.1 编码器优化
影响Keybert效果的一个主要因素是编码器质量,编码器效果的好坏会影响相似度距离得分,从而影响排序,导致最终关键词抽取结果差别很大。Keybert支持以下多种模型作为编码器:
(1) 使用SentenceTransformers
图15 Sentence Transformers支持的预训练模型
Sentence Transformer调用方法如下所示:
如何选择Sentence Transformers预训练模型?如果需要高质量并且性能好的模型可以使用“paraphrase-mpnet-base-v2”;如果是英文场景则可以使用“paraphrase-MiniLM-L6-v2”;如果是多语言场景则可以使用“paraphrase-multilingual-MiniLM-L12-v2”。
(2) 使用Hugginface Transformers
Huggingface Transformers预训练模型地址如下:huggingface.co/models
图16 Hugginface Transformers支持的预训练模型
Hugginface Transformers调用方法如下图所示:
(3)使用Flair模型
Keybert还支持Flair模型调用,使用方式如下:
3.3.2 针对中文场景的ZhKeybert
ZhKeybert是针对中文场景进行优化的Keybert,ZhKeybert开源项目地址如下:
github.com/deepdialog/Z
(1) ZhKeybert的安装
(2) ZhKeybert的实践
ngram_range决定了结果短句可以由多少个词语构成:
图17 ZhKeybert源码实践
(3) ZhKeybert优化项
ZhKeybert对Keybert的主要改进有:
本篇从理论到实践介绍了超好用的无监督关键词提取算法Keybert。首先介绍了背景;然后重点介绍了什么是Keybert、KeyBERT提取关键词流程和如何通过MSS和MMR算法解决多样性问题;最后从实践的角度介绍了KeyBERT的安装、使用以及影响效果的因素。对于希望使用无监督学习算法抽取关键词的小伙伴可能有帮助。
[1] Keyword Extraction with BERT:https://grootendorst.netlify.app/blog/Keybert/