赞
踩
导读:本文是“数据拾光者”专栏的第六十篇文章,这个系列将介绍在广告行业中自然语言处理和推荐系统实践。本篇从理论到实践介绍了超好用的无监督关键词提取算法Keybert,对于希望使用无监督学习算法抽取关键词的小伙伴可能有帮助。
欢迎转载,转载请注明出处以及链接,更多关于自然语言处理、推荐系统优质内容请关注如下频道。
知乎专栏:数据拾光者
公众号:数据拾光者
摘要:本篇从理论到实践介绍了超好用的无监督关键词提取算法Keybert。首先介绍了调研背景;然后重点介绍了什么是Keybert、KeyBERT提取关键词流程和如何通过MSS和MMR算法解决多样性问题;最后从实践的角度介绍了KeyBERT的安装、使用以及影响效果的因素。对于希望使用无监督学习算法抽取关键词的小伙伴可能有帮助。
下面主要按照如下思维导图进行学习分享:
最近在做关键词抽取项目,需要将用户搜索query、资讯news、广告文案、用户点击title等不同场景下的文本数据提取关键词,然后作为特征提供给下游召回和推荐场景中使用。之前也分享过一篇关键词抽取的文章《广告行业中那些趣事系列31:关键词提取技术攻略以及BERT实践》
关键词抽取流程主要分成获取候选词和候选词打分两个流程:
对于获取候选词流程,中文场景下主要是分词,一方面我们主要通过jieba和哈工大pkuseg分词,另一方面还可以通过BERT进行分词;
对于候选词打分流程,主要通过无监督学习和有监督学习两大类进行打分。
最近调研到Keybert作为一种无监督学习的关键词抽取流程,效果不错,这里对Keybert进行调研并打算应用到广告场景中。
Keybert是一种基于无监督学习的关键词抽取技术,不仅效果好,而且易于使用。Keybert主要通过Bert获取文档和候选词的embedding,然后使用余弦相似度计算得到文档中最相似的候选词作为关键词。
Keybert提取关键词流程如上图所示,主要包括三个流程:
第一步,使用Bert获取文档/候选词的embedding表示;
这里需要注意的是文档embedding质量的好坏会影响关键词抽取的结果。Keybert支持从sentence_transformers、Flair、Hugginface Transformers、spaCy等下载预训练模型对文档进行embedding编码;
第二步,使用词嵌入模型提取n-gram词或者关键词作为候选词,这里可以是sklearn中的CountVectorizer或者Tfidf等方法;
第三步,计算文档和候选词的余弦相似度,找到最能表示文档的关键词。
了解了Keybert提取关键词的流程后,下面通过一个实际的例子查看Keybert抽取效果,同时了解下作者是如何解决多样性问题。使用下面的英文文档:
使用Keybert抽取top5的候选关键词结果如下:
上面抽取的5个候选关键单词可以很好的代表文档内容即有监督学习定义。相比于单词,我们还可以抽取词组作为候选关键词,把n_gram_range设置成(3,3)则可以使用3个单词组成的词组作为候选关键词,抽取结果如下:
虽然使用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算法实现代码:
通过MSS可以提升抽取关键词的多样性,当MSS中的nr_candidates设置过小时基本和余弦相似度结果类似,基本失去作用;但是当nr_candidates设置过大时则容易导致提取关键词不准。下面是MSS中的nr_candidates的对关键词抽取结果影响:
2.3.2 Maximal Marginal Relevance算法
MMR最大边缘相关算法目的一方面是减少排序结果的冗余,另一方面保证结果的相关性。最早应用于文本摘要提取和信息检索等领域,在推荐场景下体现在给用户推荐相关商品的同时,保证推荐结果的多样性,即排序结果存在着相关性与多样性的权衡。MMR的核心思想是找到和文档Q最相似同时和其他候选关键词Dj最不相似的候选词Di作为关键词。下面是MMR的计算公式:
MMR算法实现代码如下:
通过参数diversity来控制多样性,如果参数值设置过低则和相似度计算结果差不多。下面分别是设置diversity为0.2和0.7时关键词抽取效果:
上面从理论方面详细介绍了Keybert算法,下面从代码实践的角度介绍Keybert。
pip install 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函数,函数说明如下图所示:
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.1 编码器优化
影响Keybert效果的一个主要因素是编码器质量,编码器效果的好坏会影响相似度距离得分,从而影响排序,导致最终关键词抽取结果差别很大。Keybert支持以下多种模型作为编码器:
Sentence-Transformers
Flair
Spacy
Gensim
USE
(1) 使用SentenceTransformers
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
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决定了结果短句可以由多少个词语构成:
(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
最新最全的文章请关注我的微信公众号或者知乎专栏:数据拾光者。
码字不易,欢迎小伙伴们点赞和分享。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。