如何提取query或者文档的关键词?
一般有两种解决思路:
有监督的关键词提取分两种做法。
用一个树模型(如Xgboost)做分类模型,提取句子分词后各词的文本特征、统计特征、语言模型特征等,再把特征喂给分类模型,模型区分出各词的重要性得分,这样挑出topK个词就是提取的结果;分类模型的训练集是事先人工标注过的,每个词一个label。
特征工程可以参考:https://github.com/shibing624/pke_zh
训练样本形如:
邪御天娇 免费 阅读,3 1 1
重要度label共分4级:
比较朴素的思路是直接用深度模型做分类任务,取代人工提取特征,模型端到端产出分类预测label。
此处的深度模型可以是TextCNN、Fasttext、Transformer等,也可以是BERT预训练模型,适用于分类任务的模型都行。分类任务可以参考:https://github.com/shibing624/pytextclassifier
还有一种方法是Seq2Seq生成模型,基于query生成式给出关键词结果,或者生成句子摘要,代表性的模型有T5、Bart、Seq2Seq等。生成任务可以参考:https://github.com/shibing624/textgen
以上方法的实现可以参考我写的开源项目,此处不再赘述,本文重点介绍无监督方法。
无监督的关键词提取算法有:
经验来看,TFIDF是很强的baseline,有较强普适性,基本能应付大部分关键词抽取场景,简单有效,速度很快。TextRank虽然算法复杂些,但其应用效果不比TFIDF强,而且涉及网络构建和随机游走迭代,效率极低。
TF-IDF是一种很简单但却很有效的方法,计算文本中的每个term会考虑两个因素。一是term本身在文档中的词频TF,另一个是倒文本频率(Inverse Document Frequency)IDF,这个指标衡量的是有多少文本包含了该term。IDF主要用来惩罚那些在很多文本中都有出现的term,往往这些term都是一些无关紧要的停用词等。
TFIDF整个核心思想就是,term在一个文档的重要程度取决于该term在该文档的频率和在其它文档的出现的次数。意思是term在该文档出现了多次,而在其他文档不常出现,那么该term很能代表该文档的含义。这种思想也是TFIDF经常用来做文本分类任务的特征提取的原因。
小结
paper:A Text Feature Based Automatic Keyword Extraction Method for Single Documents
YAKE(Yet Another Keyword Extractor)是一种无监督的关键词提取算法,基于词语分散性的关键词提取算法。特征提取主要考虑五个因素(去除停用词后):
小结
PageRank算法
PageRank算法通过计算网页链接的数量和质量来粗略估计网页的重要性,算法创立之初即应用在谷歌的搜索引擎中,对网页进行排名。
PageRank算法的核心思想如下:
TextRank算法
paper:TextRank: Bringing Order into Texts
TextRank算法是一种基于图的用于关键词抽取和文档摘要的排序算法,由谷歌的网页重要性排序算法PageRank算法改进而来,它利用一篇文档内部的词语间的共现信息(语义)便可以抽取关键词,它能够从一个给定的文本中抽取出该文本的关键词、关键词组,并使用抽取式的自动文摘方法抽取出该文本的关键句。
TextRank算法的基本思想是将文档看作一个词的网络,该网络中的链接表示词与词之间的语义关系。
TextRank算法主要包括:关键词抽取、关键短语抽取、关键句抽取。
关键词抽取(keyword extraction)
关键词抽取是指从文本中抽取几个能描述该文本的词的过程。
对关键词抽取而言,用于构建顶点集的文本单元可以是句子中的一个或多个字(词);根据这些字之间的关系(比如:在一个框中同时出现)构建边。根据任务的需要,可以使用语法过滤器(syntactic filters)对顶点集进行优化。语法过滤器的主要作用是将某一类或者某几类词性(如名词、形容词)的词过滤出来作为顶点集。
关键短语抽取(keyphrase extration)
关键词抽取结束后,我们可以得到的N个关键词,在原始文本中相邻的关键词构成关键短语,然后分析关键词是否存在相邻的情况,最后确定哪些是关键短语。
关键句抽取(sentence extraction)
句子抽取任务主要针对的是自动摘要这个场景,将每一个sentence作为一个顶点,根据两个句子之间的内容重复程度来计算他们之间的“相似度”,以这个相似度作为联系,由于不同句子之间相似度大小不一致,在这个场景下构建的是以相似度大小作为edge权重的有权图。
小结
paper:CollabRank: Towards a Collaborative Approach to Single-Document Keyphrase Extraction
SingleRank是PageRank的变体,主要有两个变化:
小结
paper:TopicRank: Graph-Based Topic Ranking for Keyphrase Extraction
TopicRank把主题当做相似关键短语的簇,这些topics会根据在文档的重要性进行排序,然后选取topK个最相关的topics,每个topic选择一个最重要的关键短语来代表文档的核心关键词。
TopicRank算法的步骤如下:
小结
paper:Unsupervised Keyphrase Extraction with Multipartite Graphs
MultipartiteRank是一种基于多元关系的关键词提取算法。在TopicRank的基础上,在多部分图结构中对主题信息进行编码,并将关键词候选词和主题表示在一个图中,并利用它们之间的相互加强关系来提取关键词。
小结
paper:PositionRank: An Unsupervised Approach to Keyphrase Extraction from Scholarly Documents
PositionRank也是一种基于图结构的算法,与TextRank类似,是基于PageRank的图关系计算词的得分,根据词的位置和词频来计算每个词的权重值。算法主要两个部分组成:
该方法在迭代计算词权重的过程中融入了位置信息,融入方式有两种,一种是融入了该词出现的所有位置,另外一种是融入了该词出现的第一个位置。第一种融入方式效果好些。
实验结果:PositionRank优于目前一些主流的图方法和统计方法。
小结
paper:Keyword Extraction with BERT
是一种基于 Transformer 模型的关键词提取算法,利用了预训练的语言模型的能力来提取关键词。使用BERT的embedding表示层和简单余弦相似性来查找文档中与文档本身最相似的子短语。做法是:
实验结果:准确率最高,速度最慢。
小结
关键词提取(keyword extraction)技术
https://github.com/MaartenGr/KeyBERT
PositionRank等四种花式变体的算法思想与开源实现