广告行业中那些趣事系列60:详解超好用的无监督关键词提取算法Keybert

导读:本文是“数据拾光者”专栏的第六十篇文章,这个系列将介绍在广告行业中自然语言处理和推荐系统实践。本篇从理论到实践介绍了超好用的无监督关键词提取算法Keybert,对于希望使用无监督学习算法抽取关键词的小伙伴可能有帮助。

欢迎转载,转载请注明出处以及链接,更多关于自然语言处理、推荐系统优质内容请关注如下频道。
知乎专栏:数据拾光者
公众号:数据拾光者

摘要:本篇从理论到实践介绍了超好用的无监督关键词提取算法Keybert。首先介绍了调研背景;然后重点介绍了什么是Keybert、KeyBERT提取关键词流程和如何通过MSS和MMR算法解决多样性问题;最后从实践的角度介绍了KeyBERT的安装、使用以及影响效果的因素。对于希望使用无监督学习算法抽取关键词的小伙伴可能有帮助。

下面主要按照如下思维导图进行学习分享:

1c7e9d5830cb640b84f043451601678e.jpeg

01 背景介绍

最近在做关键词抽取项目,需要将用户搜索query、资讯news、广告文案、用户点击title等不同场景下的文本数据提取关键词,然后作为特征提供给下游召回和推荐场景中使用。之前也分享过一篇关键词抽取的文章《广告行业中那些趣事系列31:关键词提取技术攻略以及BERT实践

关键词抽取流程主要分成获取候选词和候选词打分两个流程:

a94f6dbe00723315efef3762a4191219.png

图1 关键词抽取流程

对于获取候选词流程,中文场景下主要是分词,一方面我们主要通过jieba和哈工大pkuseg分词,另一方面还可以通过BERT进行分词;

对于候选词打分流程,主要通过无监督学习和有监督学习两大类进行打分。

最近调研到Keybert作为一种无监督学习的关键词抽取流程,效果不错,这里对Keybert进行调研并打算应用到广告场景中。

02 Keybert详解

2.1 什么是Keybert

Keybert是一种基于无监督学习的关键词抽取技术,不仅效果好,而且易于使用。Keybert主要通过Bert获取文档和候选词的embedding,然后使用余弦相似度计算得到文档中最相似的候选词作为关键词。

2.2 Keybert提取关键词流程

bfeeb2c90450c1ed376aae00717001c6.jpeg

图2 Keybert提取关键词流程

Keybert提取关键词流程如上图所示,主要包括三个流程:

第一步,使用Bert获取文档/候选词的embedding表示;

8f1ed18560c6b0bc91f0245489173baa.jpeg

图3 使用Bert获取文档的embedding表示

这里需要注意的是文档embedding质量的好坏会影响关键词抽取的结果。Keybert支持从sentence_transformers、Flair、Hugginface Transformers、spaCy等下载预训练模型对文档进行embedding编码;

第二步,使用词嵌入模型提取n-gram词或者关键词作为候选词,这里可以是sklearn中的CountVectorizer或者Tfidf等方法;

0bd956d1dfd2c758d7f723cf71f273a0.jpeg

图4 使用词嵌入模型CountVectorizer提取候选词

第三步,计算文档和候选词的余弦相似度,找到最能表示文档的关键词。

9d3c39a47191039d259f8e75676c54e2.jpeg

图5 使用余弦相似度找到最能表示文档的关键词

2.3 Keybert如何解决多样性问题

了解了Keybert提取关键词的流程后,下面通过一个实际的例子查看Keybert抽取效果,同时了解下作者是如何解决多样性问题。使用下面的英文文档:

a87dd596fd8ea43d7db1f3abcf11dfcf.jpeg

图6 英文文档

使用Keybert抽取top5的候选关键词结果如下:

83ce3679ab4c6f8c7cd25e5d0b5c8de3.png

图7 top5候选关键词结果

上面抽取的5个候选关键单词可以很好的代表文档内容即有监督学习定义。相比于单词,我们还可以抽取词组作为候选关键词,把n_gram_range设置成(3,3)则可以使用3个单词组成的词组作为候选关键词,抽取结果如下:

286df9ecbddaed8c448e03b4e7ef6886.jpeg

图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算法实现代码:

b332b8307e131fbce92a3117449af57b.jpeg

图9 MSS算法实现代码

通过MSS可以提升抽取关键词的多样性,当MSS中的nr_candidates设置过小时基本和余弦相似度结果类似,基本失去作用;但是当nr_candidates设置过大时则容易导致提取关键词不准。下面是MSS中的nr_candidates的对关键词抽取结果影响:

dc81e749816d8eabb65173bd51752661.jpeg

图10 MSS中的nr_candidates的对关键词抽取结果影响

2.3.2 Maximal Marginal Relevance算法

MMR最大边缘相关算法目的一方面是减少排序结果的冗余,另一方面保证结果的相关性。最早应用于文本摘要提取和信息检索等领域,在推荐场景下体现在给用户推荐相关商品的同时,保证推荐结果的多样性,即排序结果存在着相关性与多样性的权衡。MMR的核心思想是找到和文档Q最相似同时和其他候选关键词Dj最不相似的候选词Di作为关键词。下面是MMR的计算公式:

ccd6cecd4fc2e029a41cc2857cadf430.jpeg

图11 MMR计算公式

MMR算法实现代码如下:

0ff6e0d2f332a664cca5b240a01430b1.jpeg

图12 MMR算法实现代码

通过参数diversity来控制多样性,如果参数值设置过低则和相似度计算结果差不多。下面分别是设置diversity为0.2和0.7时关键词抽取效果:

d864cc204ca3da9d2cb87851dc6f468b.jpeg

图13 MMR中的diversity的对关键词抽取结果影响

03 实战Keybert

上面从理论方面详细介绍了Keybert算法,下面从代码实践的角度介绍Keybert。

3.1 Keybert安装

pip install Keybert

3.2 Keybert使用

通过下面的代码可以构建Keybert模型:

from Keybert import Keybert
kw_model = Keybert(model="paraphrase-multilingual-MiniLM-L12-v2")
keywords = kw_model.extract_keywords(doc, keyphrase_ngram_range=(3, 3), 
stop_words='english',  use_mmr=True, diversity=0.7)

Keybert主要的参数是预训练模型,在0.4.0版本默认“paraphrase-MiniLM-L6-v2”,在0.6.0版本模型是“all-MiniLM-L6-v2”。需要注意的是0.6.0版本还支持Hugginface Transformers库的预训练模型。

抽取关键词的方法是extract_keywords函数,函数说明如下图所示:

9cb4231fbdaf04429a058f5e92d7e414.jpeg

图14 extract_keywords函数说明

extract_keywords主要有以下参数:

  • docs:要提取关键字/关键短语的文档

  • candidates:要使用的候选关键字/关键短语,而不是从文档中提取它们

  • keyphrase_ngram_range:提取的关键字/关键短语的长度(以字为单位)

  • stop_words:要从文档中删除的停用词

  • top_n:返回前 n 个关键字/关键短语

  • min_df:如果需要提取多个文档的关键字,则一个单词在所有文档中的最小文档频率

  • use_maxsum: 是否使用 Max Sum Similarity 来选择keywords/keyphrases

  • use_mmr:是否使用最大边际相关性(MMR)进行关键字/关键短语的选择

  • diversity:如果 use_mmr 设置为 True,结果的多样性在 0 和 1 之间

  • nr_candidates:如果 use_maxsum 设置为 True,要考虑的候选数

  • vectorizer:从 scikit-learn 传入你自己的 CountVectorizer

  • highlight:是否打印文档并突出显示其关键字/关键短语。注意:如果传递了多个文档,这将不起作用。

函数返回文档的前 n 个关键词及距离得分。

3.3 Keybert效果影响

3.3.1 编码器优化

影响Keybert效果的一个主要因素是编码器质量,编码器效果的好坏会影响相似度距离得分,从而影响排序,导致最终关键词抽取结果差别很大。Keybert支持以下多种模型作为编码器:

  • Sentence-Transformers

  • Flair

  • Spacy

  • Gensim

  • USE

(1) 使用SentenceTransformers

4fa32e50a8c1203776dd1307c340d73a.jpeg

图15 Sentence Transformers支持的预训练模型

Sentence Transformer调用方法如下所示:

from sentence_transformers import SentenceTransformer
model = SentenceTransformer(model='model_name')

如何选择Sentence Transformers预训练模型?如果需要高质量并且性能好的模型可以使用“paraphrase-mpnet-base-v2”;如果是英文场景则可以使用“paraphrase-MiniLM-L6-v2”;如果是多语言场景则可以使用“paraphrase-multilingual-MiniLM-L12-v2”。

(2) 使用Hugginface Transformers

Huggingface Transformers预训练模型地址如下:huggingface.co/models

876ed292765305590bcbb59791074982.jpeg

图16 Hugginface Transformers支持的预训练模型

Hugginface Transformers调用方法如下图所示:

bert_model_path = “/data/chinese_roberta_L-2_H-128”
kw_model = Keybert(model= bert_model_path)

(3)使用Flair模型

Keybert还支持Flair模型调用,使用方式如下:

from Keybert import Keybert
from flair.embeddings import TransformerDocumentEmbeddings
roberta = TransformerDocumentEmbeddings('roberta-base')
kw_model = Keybert(model=roberta)

3.3.2 针对中文场景的ZhKeybert

ZhKeybert是针对中文场景进行优化的Keybert,ZhKeybert开源项目地址如下:

github.com/deepdialog/Z

(1) ZhKeybert的安装

git clone https://github.com/deepdialog/ZhKeybert
cd ZhKeybert
python setup.py install –user

(2) ZhKeybert的实践

from zhKeybert import Keybert, extract_kws_zh
docs = """时值10月25日抗美援朝纪念日,《长津湖》片方发布了“纪念中国人民志愿军抗美援朝出国作战71周年特别短片”,再次向伟大的志愿军致敬!"""
kw_model = Keybert(model='paraphrase-multilingual-MiniLM-L12-v2')
extract_kws_zh(docs, kw_model)

ngram_range决定了结果短句可以由多少个词语构成:

9700b25a57fc2ac4bd4d191bdb0ce4a2.jpeg

图17 ZhKeybert源码实践

(3) ZhKeybert优化项

ZhKeybert对Keybert的主要改进有:

  • 细化候选关键词的筛选,避免跨句组合等情况;

  • 调整超参数,寻找效果较优的组合(例如原始模型中use_maxsum的效果奇差);

  • 找出效率和效果均比较优秀的模型paraphrase-multilingual-MiniLM-L12-v2。

总结及反思

本篇从理论到实践介绍了超好用的无监督关键词提取算法Keybert。首先介绍了背景;然后重点介绍了什么是Keybert、KeyBERT提取关键词流程和如何通过MSS和MMR算法解决多样性问题;最后从实践的角度介绍了KeyBERT的安装、使用以及影响效果的因素。对于希望使用无监督学习算法抽取关键词的小伙伴可能有帮助。

参考资料

[1] Keyword Extraction with BERThttps://grootendorst.netlify.app/blog/Keybert/

[2] https://github.com/deepdialog/ZhKeyBERT

[3] https://github.com/MaartenGr/KeyBERT

最新最全的文章请关注我的微信公众号或者知乎专栏:数据拾光者。

码字不易,欢迎小伙伴们点赞和分享。

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值