KeyBERT 是一種最小且易於使用的關鍵字提取技術,它利用 BERT 嵌入來創建與文件最相似的關鍵字和關鍵字詞。
相應的媒體貼文可以在這裡找到。
回目錄
儘管已經有很多可用於關鍵字生成的方法(例如,Rake、YAKE!、TF-IDF 等),但我想創建一個非常基本但功能強大的方法來提取關鍵字和關鍵字詞。這就是KeyBERT發揮作用的地方!它使用 BERT 嵌入和簡單的餘弦相似度來尋找文件中與文件本身最相似的子短語。
首先,使用 BERT 提取文檔嵌入以獲得文檔級表示。然後,提取 N 元詞/短語的詞嵌入。最後,我們使用餘弦相似度來尋找與文件最相似的單字/片語。然後,最相似的單字可以被識別為最能描述整個文件的單字。
KeyBERT 絕不是獨一無二的,它是作為一種快速、簡單的創建關鍵字和關鍵字詞的方法而創建的。儘管有許多使用 BERT 嵌入的優秀論文和解決方案(例如 1、2、3),但我找不到不需要從頭開始訓練並且可以供初學者使用的基於 BERT 的解決方案(如果我錯了請糾正我!因此,目標是pip install keybert
和最多 3 行程式碼的使用。
回目錄
可以使用 pypi 完成安裝:
pip install keybert
您可能需要安裝更多,具體取決於您將使用的轉換器和語言後端。可能的安裝有:
pip install keybert[flair]
pip install keybert[gensim]
pip install keybert[spacy]
pip install keybert[use]
下面是提取關鍵字的最小範例:
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. It infers a
function from labeled training data consisting of a set of training examples.
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 )
注意:有關所有可能的變壓器模型的完整概述,請參閱句子變壓器。我建議對於英文文件使用"all-MiniLM-L6-v2"
,對於多語言文件或任何其他語言使用"paraphrase-multilingual-MiniLM-L12-v2"
。
為了使結果多樣化,我們採用與文件最相似的 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 )
[( '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 )]
為了使結果多樣化,我們可以使用最大邊距相關性(MMR)來建立同樣基於餘弦相似度的關鍵字/關鍵字詞。具有高度多樣性的結果:
>> > 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 支援許多可用於嵌入文件和單字的嵌入模型:
按此處查看所有支援的嵌入模型的完整概述。
句子變形金剛
您可以在此處從sentence-transformers
中選擇任何模型,並將其通過帶有model
的 KeyBERT 傳遞:
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 可以如下使用:
from keybert import KeyBERT
from flair . embeddings import TransformerDocumentEmbeddings
roberta = TransformerDocumentEmbeddings ( 'roberta-base' )
kw_model = KeyBERT ( model = roberta )
您可以選擇任何一個?變形金剛模型在這裡。
回目錄
借助KeyLLM
您可以使用大型語言模型 (LLM) 執行關鍵字提取。您可以在此處找到完整的文檔,但有兩個與此新方法常見的範例。在開始之前,請確保透過pip install openai
安裝 OpenAI 軟體包。
首先,我們可以直接要求OpenAI提取關鍵字:
import openai
from keybert . llm import OpenAI
from keybert import KeyLLM
# Create your LLM
client = openai . OpenAI ( api_key = MY_API_KEY )
llm = OpenAI ( client )
# Load it in KeyLLM
kw_model = KeyLLM ( llm )
這將查詢任何 ChatGPT 模型並要求它從文字中提取關鍵字。
其次,我們可以找到可能具有相同關鍵字的文檔,並僅提取這些文檔的關鍵字。這比詢問每個文件的關鍵字要有效得多。可能有一些文件具有完全相同的關鍵字。這樣做很簡單:
import openai
from keybert . llm import OpenAI
from keybert import KeyLLM
from sentence_transformers import SentenceTransformer
# Extract embeddings
model = SentenceTransformer ( 'all-MiniLM-L6-v2' )
embeddings = model . encode ( MY_DOCUMENTS , convert_to_tensor = True )
# Create your LLM
client = openai . OpenAI ( api_key = MY_API_KEY )
llm = OpenAI ( client )
# Load it in KeyLLM
kw_model = KeyLLM ( llm )
# Extract keywords
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 的多個資源,但最重要的是,這些都是用於創建令人印象深刻的關鍵字提取模型的驚人資源:
論文:
Github 儲存庫:
MMR :關鍵字/關鍵字詞的選擇是按照以下方式建模的:
注意:如果您發現一篇論文或 github 儲存庫具有易於使用的用於關鍵字/關鍵短語提取的 BERT 嵌入實現,請告訴我!我將確保添加對此存儲庫的引用。