切词

等待…

关键词提取

自动关键词抽取研究综述2017

特征驱动的关键词提取算法综述2018

关键词提取研究综述2021

概述

概念

关键词提取技术是一种自然语言处理技术,旨在从给定的文本中自动识别出最具代表性和重要性的关键词或短语

关键词通常是文本中具有特殊含义、能够概括文本主题或内容的词语或短语

使用场景

关键词提取技术的目标是对文本进行语义分析和内容抽取,从而提取出最能代表文本主题和内容的关键词

这些关键词可以用于文本分类、信息检索、文本摘要、主题建模、信息过滤等自然语言处理任务

经典方法

关键词提取技术通常结合了文本的语言统计特征、词频分布、词性、上下文关系、语义相似度等多种信息源,以识别并提取出最相关和具有区分度的关键词

常见的关键词提取方法包括基于词频、TF-IDF、文本图结构、语言模型、图模型、深度学习等多种技术手段

关键词提取技术在信息处理、文本挖掘、自动化文档处理等领域具有重要应用价值,能够帮助人们更快速、准确地理解和处理大量文本信息

分类

NLP中关键字提取方法总结和概述

基于统计

统计方法是最简单的。他们计算关键字的统计数据并使用这些统计数据对它们进行评分。一些最简单的统计方法是词频、词搭配和共现

也有一些更复杂的,例如TF-IDF和YAKE!

tf-idf

概述

TF-IDFterm frequency–inverse document frequency,会计算文档中单词相对于整个语料库(更多文档集)的重要性

它计算文档中每个词的频率,并通过词在整个语料库中的频率的倒数对其进行加权。最后,选择得分最高的词作为关键词,TF-IDF有两层意思

  • 词频: Term Frequency,缩写为TF,通常来说,一个分词出现的次数越多,代表越重要
  • 逆文档频率: Inverse Document Frequency,缩写为IDF,在现实生活中,出现次数最多的词是一些无意义的词,比如停用词,对搜索结果毫无帮助,必须通过分词器提前过滤掉的词

公式 - TF-IDF from scratch in python on a real-world dataset.

术语 t d N corpus
释义 term(word) document(set of words)
一篇文档中的词集合
count of corpus
语料数量
the total document set
总体文档集合

一个分词Term的相关性由tf*idf公式简化表达。tf-idf模型包含了二个简单事实:

  • 某个term分词在一个文档中出现次数(tf)越多,这个词与文档越相关
  • 某个索引中包含某个term分词的文档数量越少(idf),这个term分词越重要

例子

考虑一个包含100个单词的文档,其中Leon这个分词出现了10次。这个时候TF=(10/100)=0.1

并且假设Lucene索引中有1000W份文档数量,其中有1000份文档中出现了Leon这个分词,此时逆文档频率(IDF)计算为IDF=log(10,000,000/1,000)=4

因此,TD-IDF计算为TF*IDF=0.1 * 4=0.4

1
2
3
4
5
6
7
8
9
10
11
12
13
import jieba
import jieba.analyse

sentence = '中华蜜蜂原产于中国,是中国的土著蜂,适应中国各地的气候和蜜源条件,适于定地饲养且稳产,尤其是在南方山区,有着其他蜂种不可替代的地位'

seg_list = jieba.cut(sentence, cut_all=True)
print(", ".join(seg_list))
keywords = jieba.analyse.extract_tags(sentence, topK=20, withWeight=True, allowPOS=('n', 'nr', 'ns'))
print(keywords)

>>>
中华, 蜜蜂, 原产, 产于, 中国, ,, 是, 中国, 的, 土著, 蜂, ,, 适应, 中国, 各地, 的, 气候, 和, 蜜源, 条件, ,, 适于, 定, 地, 饲养, 且, 稳产, ,, 尤其, 是, 在, 南方, 方山, 山区, ,, 有着, 其他, 蜂, 种, 不可, 替代, 的, 地位
[('定地', 0.7969), ('蜂种', 0.7969), ('稳产', 0.7340), ('蜜源', 0.66725), ('中国', 0.60546), ('蜜蜂', 0.5859), ('土著', 0.55968), ('原产', 0.544705), ('替代', 0.484315), ('山区', 0.44390), ('气候', 0.38804), ('地位', 0.34710), ('条件', 0.32636)]

优缺点

  • 速度快: TF-IDF的优点是速度快
  • 语言无关: TF-IDF与语言无关
  • 需要语料: 需要至少几十个文档的语料库
  • 不够全面: 缺点是单纯于词频来判断一个分词的重要性,不够全面
  • 无法捕获语义: 缺点是不能捕捉分词Term在文档中的位置

变种

TF-IDF 的4大常见变种
变种1: 对数函数变换 TF,解决TF现行增长问题
变种2: 对 TF 进行标准化,解决长短文档问题
变种3: 对数函数变换 IDF,解决IDF 现行增长问题
变种4: 查询词及文档向量标准化,解决长短文档问题

YAKE

2018ECIR的最佳短论文奖 A Text Feature Based Automatic Keyword Extraction Method for Single Documents

github Yet Another Keyword Extractor (Yake)

概述

YAKE(Yet Another Keyword Extractor)是一种关键字提取方法,它利用单个文档的统计特征来提取关键字

它通过五个步骤提取关键字,旨在从文本中自动提取最相关的关键词和关键短语

YAKE算法的工作原理如下:

  1. 文本预处理:将输入文本进行预处理,包括分词、去除停用词等
  2. 特征提取:使用词频、位置权重、长度等特征来衡量单词和短语的重要性
  3. 关键词候选生成:根据特征权重,生成候选关键词和关键短语
  4. 关键词权重计算:根据候选关键词的特征权重,计算它们的最终权重
  5. 关键词筛选:根据设定的阈值或排序方法,筛选出具有高权重的关键词和关键短语作为最终结果

YAKE算法与传统的基于统计和语言模型的关键词提取方法不同,它采用了基于特征权重的方法,使得算法更加灵活和可定制

此外,YAKE还支持多语言关键词提取,并能够处理领域特定的文本

总体而言,YAKE算法通过综合考虑单词和短语的特征权重,以及它们在文本中的频率和位置等信息,来提取与文本内容相关的关键词和关键短语

官方实现仅支持英文

基于图技术

TextRank

TextRank算法介绍及实现

TextRank是一种基于图的算法,用于关键词提取和文本摘要。它基于PageRank算法的思想,将文本表示为一个图,其中节点表示文本中的单词或短语,边表示它们之间的关系

通过计算节点之间的权重和连接关系,TextRank可以确定文本中最重要的单词或短语。

TextRank的步骤如下

  1. 分割文本:将文本分割成句子或单词
  2. 构建图:根据文本中的句子或单词构建一个图,其中每个句子或单词作为一个节点,边表示它们之间的关系。常见的关系可以是共现关系或语义关系
  3. 计算权重:为图中的每个节点计算权重。通常使用词频或TF-IDF作为初始权重
  4. 迭代计算:通过迭代计算节点之间的权重,更新每个节点的权重值。迭代过程中,节点的权重将考虑其相邻节点的权重值
  5. 排序节点:根据节点的权重值对节点进行排序,得到关键词或摘要

TextRank算法在关键词提取和文本摘要等任务中表现良好,它不需要依赖预训练模型,可以直接应用于各种领域的文本处理任务

PageRank

The PageRank Citation Ranking: Bringing Order to the Web 1999

关键词提取和摘要算法TextRank详解与实战

PageRank算法通过计算网页链接的数量和质量来粗略估计网页的重要性,算法创立之初即应用在谷歌的搜索引擎中,对网页进行排名。

PageRank算法的核心思想如下:

  • 链接数量:如果一个网页被越多的其他网页链接,说明这个网页越重要,即该网页的PR值(PageRank值)会相对较高

  • 链接质量:如果一个网页被一个越高权值的网页链接,也能表明这个网页越重要,即一个PR值很高的网页链接到一个其他网页,那么被链接到的网页的PR值会相应地因此而提高

PageRank算法计算公式

其中,是网页的重要性(PR值),是阻尼系数,一般为0.85,是整个互联网中所存在的有指同网页的链接的网页集合,是网页中存在的指向所有外部网页的链辖的集合,是该集合中元素的个数

例子

等待…

PageRank算法与TextRank算法的区别

  • PageRank算法根据网页之间的链接关系构造网络,TextRank算法根据词之间的共现关系构造网络
  • PageRank算法构造的网络中的边是有向无权边,TextRank算法构造的网络中的边是无向有权边

实现

基于Textrank4zh的TextRank算法实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
from textrank4zh import TextRank4Keyword, TextRank4Sentence
import jieba.analyse
from snownlp import SnowNLP
import pandas as pd
import numpy as np

#关键词抽取
def keywords_extraction(text):
tr4w = TextRank4Keyword(allow_speech_tags=['n', 'nr', 'nrfg', 'ns', 'nt', 'nz'])
# allow_speech_tags --词性列表,用于过滤某些词性的词
tr4w.analyze(text=text, window=2, lower=True, vertex_source='all_filters', edge_source='no_stop_words',
pagerank_config={'alpha': 0.85, })
# text -- 文本内容,字符串
# window -- 窗口大小,int,用来构造单词之间的边。默认值为2
# lower -- 是否将英文文本转换为小写,默认值为False
# vertex_source -- 选择使用words_no_filter, words_no_stop_words, words_all_filters中的哪一个来构造pagerank对应的图中的节点
# -- 默认值为`'all_filters'`,可选值为`'no_filter', 'no_stop_words', 'all_filters'
# edge_source -- 选择使用words_no_filter, words_no_stop_words, words_all_filters中的哪一个来构造pagerank对应的图中的节点之间的边
# -- 默认值为`'no_stop_words'`,可选值为`'no_filter', 'no_stop_words', 'all_filters'`。边的构造要结合`window`参数

# pagerank_config -- pagerank算法参数配置,阻尼系数为0.85
keywords = tr4w.get_keywords(num=6, word_min_len=2)
# num -- 返回关键词数量
# word_min_len -- 词的最小长度,默认值为1
return keywords

#关键短语抽取
def keyphrases_extraction(text):
tr4w = TextRank4Keyword()
tr4w.analyze(text=text, window=2, lower=True, vertex_source='all_filters', edge_source='no_stop_words',
pagerank_config={'alpha': 0.85, })
keyphrases = tr4w.get_keyphrases(keywords_num=6, min_occur_num=1)
# keywords_num -- 抽取的关键词数量
# min_occur_num -- 关键短语在文中的最少出现次数
return keyphrases

#关键句抽取
def keysentences_extraction(text):
tr4s = TextRank4Sentence()
tr4s.analyze(text, lower=True, source='all_filters')
# text -- 文本内容,字符串
# lower -- 是否将英文文本转换为小写,默认值为False
# source -- 选择使用words_no_filter, words_no_stop_words, words_all_filters中的哪一个来生成句子之间的相似度。
# -- 默认值为`'all_filters'`,可选值为`'no_filter', 'no_stop_words', 'all_filters'
# sim_func -- 指定计算句子相似度的函数

# 获取最重要的num个长度大于等于sentence_min_len的句子用来生成摘要
keysentences = tr4s.get_key_sentences(num=3, sentence_min_len=6)
return keysentences


def keywords_textrank(text):
keywords = jieba.analyse.textrank(text, topK=6)
return keywords


if __name__ == "__main__":
text = "来源:中国科学报本报讯(记者肖洁)又有一位中国科学家喜获小行星命名殊荣!4月19日下午,中国科学院国家天文台在京举行“周又元星”颁授仪式," \
"我国天文学家、中国科学院院士周又元的弟子与后辈在欢声笑语中济济一堂。国家天文台党委书记、" \
"副台长赵刚在致辞一开始更是送上白居易的诗句:“令公桃李满天下,何须堂前更种花。”" \
"据介绍,这颗小行星由国家天文台施密特CCD小行星项目组于1997年9月26日发现于兴隆观测站," \
"获得国际永久编号第120730号。2018年9月25日,经国家天文台申报," \
"国际天文学联合会小天体联合会小天体命名委员会批准,国际天文学联合会《小行星通报》通知国际社会," \
"正式将该小行星命名为“周又元星”。"
#关键词抽取
keywords=keywords_extraction(text)
print(keywords)

#关键短语抽取
keyphrases=keyphrases_extraction(text)
print(keyphrases)

#关键句抽取
keysentences=keysentences_extraction(text)
print(keysentences)


>>>
[{'word': '小行星', 'weight': 0.05808}, {'word': '天文台', 'weight': 0.05721}, {'word': '命名', 'weight': 0.048517}, {'word': '中国', 'weight': 0.045716}, {'word': '中国科学院', 'weight': 0.037818}, {'word': '国家', 'weight': 0.03438}]
['小行星命名']
[{'index': 4, 'sentence': '2018年9月25日,经国家天文台申报,国际天文学联合会小天体联合会小天体命名委员会批准,国际天文学联合会《小行星通报》通知国际社会,正式将该小行星命名为“周又元星”', 'weight': 0.2281}, {'index': 3, 'sentence': '”据介绍,这颗小行星由国家天文台施密特CCD小行星项目组于1997年9月26日发现于兴隆观测站,获得国际永久编号第120730号', 'weight': 0.2106}, {'index': 1, 'sentence': '4月19日下午,中国科学院国家天文台在京举行“周又元星”颁授仪式,我国天文学家、中国科学院院士周又元的弟子与后辈在欢声笑语中济济一堂', 'weight': 0.20209}]

基于jieba的TextRank算法实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if __name__ == "__main__":
text = "来源:中国科学报本报讯(记者肖洁)又有一位中国科学家喜获小行星命名殊荣!4月19日下午,中国科学院国家天文台在京举行“周又元星”颁授仪式," \
"我国天文学家、中国科学院院士周又元的弟子与后辈在欢声笑语中济济一堂。国家天文台党委书记、" \
"副台长赵刚在致辞一开始更是送上白居易的诗句:“令公桃李满天下,何须堂前更种花。”" \
"据介绍,这颗小行星由国家天文台施密特CCD小行星项目组于1997年9月26日发现于兴隆观测站," \
"获得国际永久编号第120730号。2018年9月25日,经国家天文台申报," \
"国际天文学联合会小天体联合会小天体命名委员会批准,国际天文学联合会《小行星通报》通知国际社会," \
"正式将该小行星命名为“周又元星”。"

# 基于jieba的textrank算法实现
keywords=keywords_textrank(text)
print(keywords)


>>>
['小行星', '命名', '国际', '中国', '国家', '天文学家']

RAKE

RAKE和TextRank的主要区别在于RAKE考虑候选关键字内的共现而不是固定窗口。它使用更简单、更具统计性的评分程序。该算法对每个文档分别进行,因此不需要文档语料库来进行关键词提取

基于深度学习

深度学习的出现使基于嵌入的方法成为可能。研究人员开发了几种使用文档嵌入的关键字提取方法(例如Bennani等人)

这些方法主要查找候选关键字列表(例如,Bennani等人只考虑由名词和形容词组成的关键字)

他们将文档和候选关键字嵌入到相同的嵌入空间中,并测量文档和关键字嵌入之间的相似度(例如余弦相似度)。他们根据相似度度量选择与文档文本最相似的关键字

SIFRank

SIFRank: A New Baseline for Unsupervised Keyphrase Extraction Based on Pre-Trained Language Model 2019

论文阅读笔记: SIFRank and BERT-KPE

github sunyilgdx/SIFRank_zh

SIFRank比较适合短文本的关键词抽取,而SIFRank+大幅增加了长文本的关键词抽取效果

步骤

  1. 人工标注:分词+标词性
  2. 获取候选关键词列表:利用正则表达式确定名词短语(例如:形容词+名词),将名词短语作为候选关键短语
  3. 通过预训练语言模型,得到关键词的embedding
  4. 同样地,得到句子或文档的embedding
  5. 计算3与4结果的余弦相似度,选取topN作为其最终提取的关键词

SIFRank模型架构图

NP chunker

在SIFRank方法中,NP chunker是一种用于识别和提取名词短语(Noun Phrase)的工具或组件。NP chunker的目标是从给定的文本中定位和提取出包含一个或多个名词的短语。名词短语通常由一个名词作为核心词,并可能包含其他修饰词或限定词

NP chunker使用一系列语法规则或机器学习模型来识别名词短语的边界,并将它们标记为一个单独的短语单元

这个过程有助于更好地理解文本的结构和语义,特别是在文本中涉及到名词短语的关键短语提取任务中。在SIFRank方法中,NP chunker用于提取候选关键短语,并为后续的关键短语排序和评分提供基础

SIF模型

句子嵌入模型SIF(Smooth Inverse Frequency)是一种用于将句子转换为连续向量表示的方法

它旨在捕捉句子的语义信息,并将句子表示为稠密的低维向量。SIF模型的关键思想结合词频信息来调整词向量的权重,以降低高频词的重要性,同时提高低频词的重要性。这样可以减轻一些常见词对句子表示的影响,使得句子表示更加注重那些在语义上更具区分度的词语。SIF模型通过简单的数学运算,如减法和加权平均,来计算句子的嵌入表示

它在自然语言处理任务中被广泛应用,如文本分类、情感分析和句子相似度计算等

sentence embedding的假设是:文章是由一个topic生成的,文章中的每个句子亦是如此,因此,句子的embedding应该与文章embedding的期望值(topic embedding)相近

Bert-KPE

Capturing Global Informativeness in Open Domain Keyphrase Extraction 2021

BERT-KPE是最近由thunlp提出的方法,在OpenKP和KP20K上都达到了state-of-the-art和良好的鲁棒性

有监督的方式

KeyBert

KeyBERT

Keyword Extraction with BERT

「关键词」提取都有哪些方案?

当我们想要从特定文档中了解关键信息时,通常会使用关键词提取。关键词提取是一种自动化的过程,用于提取与输入文本最相关的单词和短语

通过使用Rake和YAKE!等方法,我们已经可以使用易于使用的软件包来提取关键词和关键短语。然而,这些模型通常基于文本的统计特性而不是语义相似性进行工作

于是BERT登场。BERT是一个双向变换器模型,可以将短语和文档转化为能够捕捉其意义的向量

无监督文本关键词抽取流程图

使用BERT提取文档向量(嵌入)以获取文档级表示。然后,针对N元语法词/短语提取词向量。最后,我们使用余弦相似度来查找与文档最相似的词/短语。然后,可以将最相似的词识定义为最能描述整个文档的词

概述

什么是Keybert

Keybert是一种基于无监督学习的关键词抽取技术,不仅效果好,而且易于使用

Keybert主要通过Bert获取文档和候选词的embedding,然后使用余弦相似度计算得到文档中最相似的候选词作为关键词

多样性

在关键词提取中,多样性问题指的是关键词列表中存在大量相似或重复的关键词,缺乏多样性和代表性。这可能导致关键信息的丢失或重复,并降低关键词提取的效果

MSS

最大总距离(Max Sum Distance):通过将文档中最相似的关键词/短语与候选关键词/短语进行组合,找到彼此之间相似性最低的组合,这样可以确保关键词之间的差异性

MMR

最大边际相关性(Maximal Marginal Relevance,MMR):通过使用余弦相似度来创建关键词/短语,基于相似性的排序

然后,从排序后的结果中选择与文档最相关的关键词/短语,并选择与已选择关键词/短语最不相似的候选关键词/短语,这样可以确保结果具有高度的多样性

示例

KeyBert Quickstart

安装

1
2
3
4
5
6
7
8
# 默认hugging face
pip install keybert

# 其他后端
pip install keybert[flair]
pip install keybert[gensim]
pip install keybert[spacy]
pip install keybert[use]

基础KeyBERT

keyBert示例图

基础用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from keybert import KeyBERT

doc = """
Supervised learning is the machine learning task of learning a function that
maps an input to an output based on example input-output pairs.[1] It infers a
function from labeled training data consisting of a set of training examples.[2]
In supervised learning, each example is a pair consisting of an input object
(typically a vector) and a desired output value (also called the supervisory signal).
A supervised learning algorithm analyzes the training data and produces an inferred function,
which can be used for mapping new examples. An optimal scenario will allow for the
algorithm to correctly determine the class labels for unseen instances. This requires
the learning algorithm to generalize from the training data to unseen situations in a
'reasonable' way (see inductive bias).
"""
kw_model = KeyBERT()
keywords = kw_model.extract_keywords(doc)

# 设置keyphrase_ngram_range来确定生成的关键词/关键短语的长度范围
>>> kw_model.extract_keywords(doc, keyphrase_ngram_range=(1, 1), stop_words=None)
[('learning', 0.4604),
('algorithm', 0.4556),
('training', 0.4487),
('class', 0.4086),
('mapping', 0.3700)]

# 要提取关键短语,只需将keyphrase_ngram_range设置为(1, 2)或更高,具体取决于您希望在生成的关键短语中包含的单词数量
>>> kw_model.extract_keywords(doc, keyphrase_ngram_range=(1, 2), stop_words=None)
[('learning algorithm', 0.6978),
('machine learning', 0.6305),
('supervised learning', 0.5985),
('algorithm analyzes', 0.5860),
('learning function', 0.5850)]

# 设置highlight来在文档中突出显示关键词
keywords = kw_model.extract_keywords(doc, highlight=True)

关键词多样化

默认情况下,KeyBERT仅基于余弦相似度比较文档和候选关键词/关键短语。然而,这可能导致非常相似的单词出现在最准确的关键词/关键短语列表中

为了确保它们更加多样化,我们可以采取两种方法来微调输出结果,即最大总距离(Max Sum Distance)和最大边际相关性(Maximal Marginal Relevance)

  1. 最大总距离: 为了使结果多样化,我们选取文档中与前top_n个最相似的单词/短语。然后,我们从这2 x top_n个单词中选取所有top_n个组合,并提取彼此之间最不相似的组合,通过余弦相似度进行比较

    1
    2
    3
    4
    5
    6
    7
    >>> kw_model.extract_keywords(doc, keyphrase_ngram_range=(3, 3), stop_words='english',
    use_maxsum=True, nr_candidates=20, top_n=5)
    [('set training examples', 0.7504),
    ('generalize training data', 0.7727),
    ('requires learning algorithm', 0.5050),
    ('supervised learning algorithm', 0.3779),
    ('learning machine learning', 0.2891)]
  2. 最大边际相关性: 为了使结果多样化,我们可以使用最大边际相关性(Maximal Marginal Relevance,MMR)来创建关键词/关键短语,它也基于余弦相似度

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # 具有高多样性的结果
    kw_model.extract_keywords(doc, keyphrase_ngram_range=(3, 3), stop_words='english',
    use_mmr=True, diversity=0.7)
    [('algorithm generalize training', 0.7727),
    ('labels unseen instances', 0.1649),
    ('new examples optimal', 0.4185),
    ('determine class labels', 0.4774),
    ('supervised learning algorithm', 0.7502)]

    # 具有低多样性的结果
    >>> kw_model.extract_keywords(doc, keyphrase_ngram_range=(3, 3), stop_words='english',
    use_mmr=True, diversity=0.2)
    [('algorithm generalize training', 0.7727),
    ('supervised learning algorithm', 0.7502),
    ('learning machine learning', 0.7577),
    ('learning algorithm analyzes', 0.7587),
    ('learning algorithm generalize', 0.7514)]

其他关键词算法生成的候选关键词

在某些情况下,您可能希望使用其他关键词算法生成的候选关键词或从可能的关键词/关键短语列表中检索的候选关键词

在KeyBERT中,您可以轻松使用这些候选关键词进行关键词提取

1
2
3
4
5
6
7
8
9
10
11
import yake
from keybert import KeyBERT

# Create candidates
kw_extractor = yake.KeywordExtractor(top=50)
candidates = kw_extractor.extract_keywords(doc)
candidates = [candidate[0] for candidate in candidates]

# Pass candidates to KeyBERT
kw_model = KeyBERT()
keywords = kw_model.extract_keywords(doc, candidates=candidates)

Guided KeyBERT

Guided KeyBERT(引导式KeyBERT)与引导式主题建模类似,它试图将训练引导到一组种子术语上。当应用KeyBERT时,它会自动提取与特定文档最相关的关键词。然而,有时利益相关者和用户正在寻找特定类型的关键词。例如,当通过contentful在您的网站上发布一篇文章时,您通常已经了解与该文章相关的全局关键词。但是,文章中可能存在您希望通过关键词提取出来的特定主题。为了实现这一点,我们只需给KeyBERT提供一组相关的种子关键词(可以是单个关键词),并搜索与文档和种子关键词都相似的关键词

Guided KeyBERT示例图

使用这个功能非常简单,只需定义一个种子关键词列表并将其传递给KeyBERT即可

1
2
3
4
5
6
from keybert import KeyBERT
kw_model = KeyBERT()

# Define our seeded term
seed_keywords = ["information"]
keywords = kw_model.extract_keywords(doc, seed_keywords=seed_keywords)

当你有一个大型数据集,并且想要微调诸如多样性之类的参数时,每次更改参数时重新计算文档和单词嵌入可能需要很长时间。相反,我们可以预先计算这些嵌入,并将它们传递给.extract_keywords,这样我们只需计算一次即可

1
2
3
4
from keybert import KeyBERT

kw_model = KeyBERT()
doc_embeddings, word_embeddings = kw_model.extract_embeddings(docs)

然后,你可以使用这些嵌入并将它们传递给.extract_keywords来加快模型的调整

1
keywords = kw_model.extract_keywords(docs, doc_embeddings=doc_embeddings, word_embeddings=word_embeddings)

.extract_embeddings中有几个参数定义了如何生成候选关键词/关键短语的列表:

  • candidates
  • keyphrase_ngram_range
  • stop_words
  • min_df
  • vectorizer

这些参数的值在.extract_embeddings和.extract_keywords中需要完全相同,换句话说,以下内容将起作用,因为它们使用相同的参数子集

1
2
3
4
5
6
7
from keybert import KeyBERT

kw_model = KeyBERT()
doc_embeddings, word_embeddings = kw_model.extract_embeddings(docs, min_df=1, stop_words="english")
keywords = kw_model.extract_keywords(docs, min_df=1, stop_words="english",
doc_embeddings=doc_embeddings,
word_embeddings=word_embeddings)

然而,以下内容将抛出错误,因为我们没有为min_df和stop_words使用相同的值

1
2
3
4
5
6
7
from keybert import KeyBERT

kw_model = KeyBERT()
doc_embeddings, word_embeddings = kw_model.extract_embeddings(docs, min_df=3, stop_words="dutch")
keywords = kw_model.extract_keywords(docs, min_df=1, stop_words="english",
doc_embeddings=doc_embeddings,
word_embeddings=word_embeddings)

摘要提取

等待…

生成式 + 抽取式