前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >广告行业中那些趣事系列60:详解超好用的无监督关键词提取算法Keybert

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

作者头像
数据拾光者
发布2023-03-08 20:28:15
1.2K0
发布2023-03-08 20:28:15
举报
文章被收录于专栏:数据拾光者数据拾光者

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

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

01 背景介绍

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

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

图1 关键词抽取流程

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

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

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

02 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的对关键词抽取结果影响

03 实战Keybert

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

3.1 Keybert安装

代码语言:javascript
复制
pip install Keybert

3.2 Keybert使用

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

代码语言:javascript
复制
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函数,函数说明如下图所示:

图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

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

Sentence Transformer调用方法如下所示:

代码语言:javascript
复制
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

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

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

代码语言:javascript
复制
bert_model_path = “/data/chinese_roberta_L-2_H-128”
kw_model = Keybert(model= bert_model_path)

(3)使用Flair模型

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

代码语言:javascript
复制
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的安装

代码语言:javascript
复制
git clone https://github.com/deepdialog/ZhKeybert
cd ZhKeybert
python setup.py install –user

(2) ZhKeybert的实践

代码语言:javascript
复制
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决定了结果短句可以由多少个词语构成:

图17 ZhKeybert源码实践

(3) ZhKeybert优化项

ZhKeybert对Keybert的主要改进有:

  • 细化候选关键词的筛选,避免跨句组合等情况;
  • 调整超参数,寻找效果较优的组合(例如原始模型中use_maxsum的效果奇差);
  • 找出效率和效果均比较优秀的模型paraphrase-multilingual-MiniLM-L12-v2。

总结及反思

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

参考资料

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

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-01-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据拾光者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 01 背景介绍
  • 02 Keybert详解
    • 2.1 什么是Keybert
      • 2.2 Keybert提取关键词流程
        • 2.3 Keybert如何解决多样性问题
        • 03 实战Keybert
          • 3.1 Keybert安装
            • 3.2 Keybert使用
              • 3.3 Keybert效果影响
              • 总结及反思
              • 参考资料
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档