SIMILARIDAD DE NLP: use incrustaciones de palabras preentrenadas para la búsqueda de similitud semántica con BERT

Este artículo describe cómo usar incrustaciones de palabras preentrenadas para medir la similitud del documento y realizar una búsqueda de similitud semántica. Primero, recibe una introducción sobre las ventajas y los diferentes casos de uso de las incrustaciones. Finalmente, le presentaré un marco que puede usar para la búsqueda de similitud semántica. Al final encontrarás un fragmento para construir tu propio consultas de búsqueda similares como en la imagen de abajo.

Foto de visuales en Unsplash

¿Qué son las incrustaciones?

Las incrustaciones son una técnica avanzada de PNL que supera a los métodos tradicionales como TF/IDF. Las incrustaciones de palabras son una forma de representar palabras como vectores de números en un espacio de alta dimensión. Estos vectores capturan el significado y el contexto de una palabra de una manera que les permite usarse como entrada para modelos de aprendizaje automático. La siguiente imagen muestra una representación simple de incrustaciones:

incrustaciones de palabras

Ventajas sobre métodos tradicionales como TF-IDF:

¿Qué se puede hacer con las incrustaciones?

Cómo usar incrustaciones preentrenadas:

Hay varias fuentes de incrustaciones de palabras previamente entrenadas que puede usar en sus proyectos. Estos son algunos de los más populares:

Es importante tener en cuenta que las incrustaciones preentrenadas se entrenan en diferentes corpus y con diferentes arquitecturas, por lo que es mejor usar la que mejor se adapte a su tarea.

https://www.sbert.net/docs/usage/semantic_textual_similarity.html
from sentence_transformers import SentenceTransformer, util
model = SentenceTransformer('all-MiniLM-L6-v2')

# Two lists of sentences
sentences1 = ['The cat sits outside',
'A man is playing guitar',
'The new movie is awesome']

sentences2 = ['The dog plays in the garden',
'A woman watches TV',
'The new movie is so great']

#Compute embedding for both lists
embeddings1 = model.encode(sentences1, convert_to_tensor=True)
embeddings2 = model.encode(sentences2, convert_to_tensor=True)

#Compute cosine-similarities
cosine_scores = util.cos_sim(embeddings1, embeddings2)

#Output the pairs with their score
for i in range(len(sentences1)):
print("{} tt {} tt Score: {:.4f}".format(sentences1[i], sentences2[i], cosine_scores[i][i]))

Output:

The cat sits outside The dog plays in the garden Score: 0.2838
A man is playing guitar A woman watches TV Score: -0.0327
The new movie is awesome The new movie is so great Score: 0.8939

Búsqueda semántica para mostrar consultas de búsqueda similares.

from sentence_transformers import SentenceTransformer, util
import torch

embedder = SentenceTransformer('all-MiniLM-L6-v2')

# Corpus with example sentences
corpus = ['is tiktok getting banned.',
'is tiktok shutting down.',
'is tiktok banned in us.',
'is tiktok getting deleted.',
'is tiktok a competitor for instagram.',
'is instagram a useful app',
'something unrelevant'
]
corpus_embeddings = embedder.encode(corpus, convert_to_tensor=True)

# Query sentences:
queries = ['is tiktok']

# Find the closest 5 sentences of the corpus for each query sentence based on cosine similarity
top_k = min(7, len(corpus))
for query in queries:
query_embedding = embedder.encode(query, convert_to_tensor=True)

# We use cosine-similarity and torch.topk to find the highest 5 scores
cos_scores = util.cos_sim(query_embedding, corpus_embeddings)[0]
top_results = torch.topk(cos_scores, k=top_k)

print("nn======================nn")
print("Query:", query)
print("nTop 5 most similar sentences in corpus:")

for score, idx in zip(top_results[0], top_results[1]):
print(corpus[idx], "(Score: {:.4f})".format(score))

Output:

Query: is tiktok

Top 5 most similar sentences in corpus:
is tiktok banned in us. (Score: 0.7735)
is tiktok getting banned. (Score: 0.7716)
is tiktok getting deleted. (Score: 0.7651)
is tiktok a competitor for instagram. (Score: 0.7560)
is tiktok shutting down. (Score: 0.7308)
is instagram a useful app (Score: 0.1481)
something unrelevant (Score: 0.0925)

Deja un comentario si tienes alguna duda, recomendación o algo que no te quede claro e intentaré responderte lo antes posible.

No se olvide de aplaudir, si lo encuentra útil:

Me gusta — Compartir — Comentar — Seguir

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *