KeyBERT
KeyBERT 是一种简单易用的关键词提取技术,它利用 BERT 嵌入来创建与文档最相似的关键词和关键短语。
相关的中等文章可以在这里找到。
目录
1. 关于项目
虽然已经有许多可用的关键词生成方法(例如,Rake,YAKE!,TF-IDF 等),但我想创建一个非常基础但功能强大的方法来提取关键词和关键短语。这就是 KeyBERT 的由来!它使用 BERT 嵌入和简单的余弦相似度来找到文档中与整个文档最相似的子短语。
首先,使用 BERT 提取文档嵌入以获得文档级表示。然后,为 N-gram 词/短语提取词嵌入。最后,我们使用余弦相似度找到与文档最相似的词/短语。最相似的词可以被识别为最能描述整个文档的词。
KeyBERT 并非独一无二,它被创建为一种快速简便的方法来生成关键词和关键短语。虽然已经有许多优秀的论文和解决方案使用 BERT 嵌入(例如,1,2,3),但我找不到一个基于 BERT 的解决方案,它不需要从头开始训练,并且可以供初学者使用(如果我错了请纠正我!)。因此,目标是 pip install keybert
和最多 3 行代码就能使用。
2. 入门
2.1. 安装
可以使用 pypi 进行安装:
pip install keybert
根据您将使用的转换器和语言后端,您可能需要安装更多内容。可能的安装有:
pip install keybert[flair]
pip install keybert[gensim]
pip install keybert[spacy]
pip install keybert[use]
2.2. 用法
以下是提取关键词的最简单示例:
from keybert import KeyBERT
doc = """
监督学习是机器学习的一项任务,旨在学习一个函数,
该函数根据示例输入-输出对将输入映射到输出。它从
由一组训练示例组成的标记训练数据中推断出一个函数。
在监督学习中,每个示例都是一对,包括一个输入对象
(通常是向量)和一个期望的输出值(也称为监督信号)。
监督学习算法分析训练数据并产生一个推断函数,
该函数可用于映射新的示例。最佳情况下,算法将能够
正确确定未见实例的类别标签。这要求学习算法以
"合理"的方式从训练数据推广到未见情况(参见归纳偏差)。
"""
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)
[('学习', 0.4604),
('算法', 0.4556),
('训练', 0.4487),
('类别', 0.4086),
('映射', 0.3700)]
要提取关键短语,只需将 keyphrase_ngram_range
设置为 (1, 2) 或更高,具体取决于您希望结果短语中包含的词数:
>>> kw_model.extract_keywords(doc, keyphrase_ngram_range=(1, 2), stop_words=None)
[('学习算法', 0.6978),
('机器学习', 0.6305),
('监督学习', 0.5985),
('算法分析', 0.5860),
('学习函数', 0.5850)]
我们可以通过简单地设置 highlight
来突出显示文档中的关键词:
keywords = kw_model.extract_keywords(doc, highlight=True)
注意:有关所有可能的转换器模型的完整概述,请参见 sentence-transformer。
对于英文文档,我建议使用 "all-MiniLM-L6-v2"
,对于多语言文档或任何其他语言,建议使用 "paraphrase-multilingual-MiniLM-L12-v2"
。
2.3. 最大和距离
为了使结果多样化,我们选取与文档最相似的 2 x top_n 个词/短语。然后,我们从这 2 x top_n 个词中选取所有 top_n 组合,并提取彼此余弦相似度最低的组合。
>>> kw_model.extract_keywords(doc, keyphrase_ngram_range=(3, 3), stop_words='english',
use_maxsum=True, nr_candidates=20, top_n=5)
[('训练示例集', 0.7504),
('泛化训练数据', 0.7727),
('需要学习算法', 0.5050),
('监督学习算法', 0.3779),
('学习机器学习', 0.2891)]
2.4. 最大边际相关性
为了使结果多样化,我们可以使用最大边际相关性(MMR)来创建关键词/关键短语,这也是基于余弦相似度的。高度多样化的结果:
>>> kw_model.extract_keywords(doc, keyphrase_ngram_range=(3, 3), stop_words='english',
use_mmr=True, diversity=0.7)
[('算法泛化训练', 0.7727),
('未见实例标签', 0.1649),
('新示例最优', 0.4185),
('确定类别标签', 0.4774),
('监督学习算法', 0.7502)]
低度多样化的结果:
>>> kw_model.extract_keywords(doc, keyphrase_ngram_range=(3, 3), stop_words='english',
use_mmr=True, diversity=0.2)
[('算法泛化训练', 0.7727),
('监督学习算法', 0.7502),
('学习机器学习', 0.7577),
('学习算法分析', 0.7587),
('学习算法泛化', 0.7514)]
2.5. 嵌入模型
KeyBERT支持多种可用于嵌入文档和词语的嵌入模型:
- Sentence-Transformers
- Flair
- Spacy
- Gensim
- USE
点击这里查看所有支持的嵌入模型的完整概述。
Sentence-Transformers
你可以从这里选择任何sentence-transformers
模型,
并通过KeyBERT的model
参数传递:
from keybert import KeyBERT
kw_model = KeyBERT(model='all-MiniLM-L6-v2')
或者选择一个带有自定义参数的SentenceTransformer模型:
from keybert import KeyBERT
from sentence_transformers import SentenceTransformer
sentence_model = SentenceTransformer("all-MiniLM-L6-v2")
kw_model = KeyBERT(model=sentence_model)
Flair
Flair允许你选择几乎任何公开可用的嵌入模型。Flair可以如下使用:
from keybert import KeyBERT
from flair.embeddings import TransformerDocumentEmbeddings
roberta = TransformerDocumentEmbeddings('roberta-base')
kw_model = KeyBERT(model=roberta)
你可以在这里选择任何🤗 transformers模型。
3. 大型语言模型
通过KeyLLM
,你现在可以使用大型语言模型(LLM)进行关键词提取。你可以在这里找到完整文档,但这里有两个常见的使用这种新方法的例子。在开始之前,请确保通过pip install openai
安装OpenAI包。
首先,我们可以直接要求OpenAI提取关键词:
import openai
from keybert.llm import OpenAI
from keybert import KeyLLM
# 创建你的LLM
client = openai.OpenAI(api_key=MY_API_KEY)
llm = OpenAI(client)
# 将其加载到KeyLLM中
kw_model = KeyLLM(llm)
这将查询任何ChatGPT模型并要求它从文本中提取关键词。
其次,我们可以找到可能具有相同关键词的文档,并仅为这些文档提取关键词。 这比为每个单独的文档询问关键词要高效得多。很可能有些文档具有完全相同的关键词。这样做很简单:
import openai
from keybert.llm import OpenAI
from keybert import KeyLLM
from sentence_transformers import SentenceTransformer
# 提取嵌入
model = SentenceTransformer('all-MiniLM-L6-v2')
embeddings = model.encode(MY_DOCUMENTS, convert_to_tensor=True)
# 创建你的LLM
client = openai.OpenAI(api_key=MY_API_KEY)
llm = OpenAI(client)
# 将其加载到KeyLLM中
kw_model = KeyLLM(llm)
# 提取关键词
keywords = kw_model.extract_keywords(MY_DOCUMENTS, embeddings=embeddings, threshold=.75)
你可以使用threshold
参数来决定文档需要多相似才能获得相同的关键词。
引用
要在你的工作中引用KeyBERT,请使用以下bibtex引用:
@misc{grootendorst2020keybert,
author = {Maarten Grootendorst},
title = {KeyBERT: Minimal keyword extraction with BERT.},
year = 2020,
publisher = {Zenodo},
version = {v0.3.0},
doi = {10.5281/zenodo.4461265},
url = {https://doi.org/10.5281/zenodo.4461265}
}
参考文献
以下是用于创建KeyBERT的几个资源,但最重要的是,这些是创建令人印象深刻的关键词提取模型的优秀资源:
论文:
- Sharma, P., & Li, Y. (2019). Self-Supervised Contextual Keyword and Keyphrase Retrieval with Self-Labelling.
GitHub仓库:
- https://github.com/thunlp/BERT-KPE
- https://github.com/ibatra/BERT-Keyword-Extractor
- https://github.com/pranav-ust/BERT-keyphrase-extraction
- https://github.com/swisscom/ai-research-keyphrase-extraction
MMR: 关键词/关键短语的选择是仿照以下模型:
注意: 如果你发现有论文或GitHub仓库提供了易于使用的BERT嵌入实现用于关键词/关键短语提取,请告诉我!我会确保在这个仓库中添加引用。