KeyBERT é uma técnica de extração de palavras-chave mínima e fácil de usar que aproveita os embeddings de BERT para criar palavras-chave e frases-chave mais semelhantes a um documento.
A postagem média correspondente pode ser encontrada aqui.
Voltar ao ToC
Embora já existam muitos métodos disponíveis para geração de palavras-chave (por exemplo, Rake, YAKE!, TF-IDF, etc.), eu queria criar um método muito básico, mas poderoso, para extrair palavras-chave e frases-chave. É aqui que entra o KeyBERT ! Que usa incorporações de BERT e similaridade de cosseno simples para encontrar as subfrases em um documento que são mais semelhantes ao próprio documento.
Primeiro, os embeddings de documentos são extraídos com BERT para obter uma representação em nível de documento. Em seguida, os embeddings de palavras são extraídos para palavras/frases de N-gramas. Por fim, usamos a similaridade de cossenos para encontrar as palavras/frases mais semelhantes ao documento. As palavras mais semelhantes poderiam então ser identificadas como as palavras que melhor descrevem todo o documento.
KeyBERT não é de forma alguma único e foi criado como um método rápido e fácil para criar palavras-chave e frases-chave. Embora existam muitos artigos e soluções excelentes que usam embeddings BERT (por exemplo, 1, 2, 3, ), não consegui encontrar uma solução baseada em BERT que não precisasse ser treinada do zero e pudesse ser usada para iniciantes ( me corrija se eu estiver errado! ). Assim, o objetivo era um pip install keybert
e no máximo 3 linhas de código em uso.
Voltar ao ToC
A instalação pode ser feita usando pypi:
pip install keybert
Você pode querer instalar mais, dependendo dos transformadores e dos back-ends de linguagem que usará. As instalações possíveis são:
pip install keybert[flair]
pip install keybert[gensim]
pip install keybert[spacy]
pip install keybert[use]
O exemplo mais mínimo pode ser visto abaixo para extração de palavras-chave:
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 )
Você pode definir keyphrase_ngram_range
para definir o comprimento das palavras-chave/frases-chave resultantes:
>> > 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 )]
Para extrair frases-chave, basta definir keyphrase_ngram_range
como (1, 2) ou superior, dependendo do número de palavras que você gostaria nas frases-chave resultantes:
>> > 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 )]
Podemos destacar as palavras-chave no documento simplesmente definindo highlight
:
keywords = kw_model . extract_keywords ( doc , highlight = True )
NOTA : Para uma visão geral completa de todos os modelos de transformadores possíveis, consulte transformador de frase. Eu recomendaria "all-MiniLM-L6-v2"
para documentos em inglês ou "paraphrase-multilingual-MiniLM-L12-v2"
para documentos multilíngues ou qualquer outro idioma.
Para diversificar os resultados, pegamos as 2 x top_n palavras/frases mais semelhantes ao documento. Em seguida, pegamos todas as combinações top_n das palavras 2 x top_n e extraímos as combinações que são menos semelhantes entre si por similaridade de cosseno.
>> > 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 )]
Para diversificar os resultados, podemos usar Maximal Margin Relevance (MMR) para criar palavras-chave/frases-chave que também se baseiam na similaridade de cosseno. Os resultados com alta diversidade :
>> > 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 )]
Os resultados com baixa diversidade :
>> > 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 suporta muitos modelos de incorporação que podem ser usados para incorporar documentos e palavras:
Clique aqui para obter uma visão geral completa de todos os modelos de incorporação suportados.
Transformadores de frases
Você pode selecionar qualquer modelo de sentence-transformers
aqui e passá-lo pelo KeyBERT com model
:
from keybert import KeyBERT
kw_model = KeyBERT ( model = 'all-MiniLM-L6-v2' )
Ou selecione um modelo SentenceTransformer com seus próprios parâmetros:
from keybert import KeyBERT
from sentence_transformers import SentenceTransformer
sentence_model = SentenceTransformer ( "all-MiniLM-L6-v2" )
kw_model = KeyBERT ( model = sentence_model )
Talento
Flair permite que você escolha quase qualquer modelo de incorporação disponível publicamente. Flair pode ser usado da seguinte forma:
from keybert import KeyBERT
from flair . embeddings import TransformerDocumentEmbeddings
roberta = TransformerDocumentEmbeddings ( 'roberta-base' )
kw_model = KeyBERT ( model = roberta )
Você pode selecionar qualquer? modelo de transformadores aqui.
Voltar ao ToC
Com KeyLLM
você pode realizar a extração de palavras-chave com Large Language Models (LLM). Você pode encontrar a documentação completa aqui, mas há dois exemplos comuns a este novo método. Certifique-se de instalar o pacote OpenAI por meio de pip install openai
antes de começar.
Primeiro, podemos pedir diretamente à OpenAI para extrair palavras-chave:
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 )
Isso irá consultar qualquer modelo ChatGPT e solicitar que ele extraia palavras-chave do texto.
Em segundo lugar, podemos encontrar documentos que provavelmente tenham as mesmas palavras-chave e extrair apenas palavras-chave para eles. Isso é muito mais eficiente do que solicitar as palavras-chave para cada documento. Provavelmente existem documentos que possuem exatamente as mesmas palavras-chave. Fazer isso é simples:
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 )
Você pode usar o parâmetro threshold
para decidir quão semelhantes os documentos precisam ser para receber as mesmas palavras-chave.
Para citar KeyBERT em seu trabalho, use a seguinte referência 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 }
}
Abaixo, você pode encontrar vários recursos que foram usados para a criação do KeyBERT, mas o mais importante, esses são recursos incríveis para criar modelos impressionantes de extração de palavras-chave:
Artigos :
Repositórios do Github :
MMR : A seleção de palavras-chave/frases-chave foi modelada a partir de:
NOTA : Se você encontrar um repositório em papel ou github que tenha uma implementação fácil de usar de embeddings BERT para extração de palavras-chave/frases-chave, me avise! Certificarei-me de adicionar uma referência a este repositório.