projecte-aina/ST-NLI-ca_paraphrase-multilingual-mpnet-base

projecte-aina
Similitud de oraciones

Este es un modelo de sentence-transformers: Mapea oraciones y párrafos a un espacio vectorial denso de 768 dimensiones y puede ser utilizado para tareas como la agrupación o la búsqueda semántica. Ha sido desarrollado mediante el entrenamiento adicional de un modelo multilingüe ajustado previamente, paraphrase-multilingual-mpnet-base-v2 utilizando datos de NLI. En concreto, se entrenó en dos conjuntos de datos de NLI en catalán: TE-ca y la traducción profesional de XNLI al catalán. El entrenamiento empleó la Pérdida de Rango de Negativos Múltiples con Negativos Duros, que aprovecha tripletes compuestos por una premisa, una hipótesis implicada y una contradicción. Es importante señalar que, dado este formato, las hipótesis neutrales de los conjuntos de datos de NLI no se utilizaron para el entrenamiento. Además, como una forma de aumento de datos, el conjunto de entrenamiento del modelo se amplió duplicando los tripletes, invirtiendo el orden de la premisa y la hipótesis implicada, resultando en un total de 18,928 tripletes.

Como usar

from sentence_transformers import SentenceTransformer, util

sentences = ["Esta es una oración de ejemplo", "Cada oración se convierte"]

model = SentenceTransformer('{MODEL_NAME}')
embeddings = model.encode(sentences)
print(embeddings)

Para ordenar una lista de oraciones por su similitud con una oración de referencia, se puede usar el siguiente código:

reference_sent = "Avui és un bon dia."
sentences = [
    "M'agrada el dia que fa.",
    "Tothom té un mal dia.",
    "És dijous.",
    "Fa un dia realment dolent",
]

reference_sent_embedding = model.encode(reference_sent)
similarity_scores = {}
for sentence in sentences:
    sent_embedding = model.encode(sentence)
    cosine_similarity = util.pytorch_cos_sim(reference_sent_embedding, sent_embedding)
    similarity_scores[float(cosine_similarity.data[0][0])] = sentence

print(f"Oraciones en orden de similitud con '{reference_sent}' (de mayor a menor):")
for i, (cosine_similarity, sent) in enumerate(dict(sorted(similarity_scores.items(), reverse=True)).items()):
    print(f"{i}) '{sent}': {cosine_similarity}")

Sin sentence-transformers, se puede usar el modelo así:

from transformers import AutoTokenizer, AutoModel
import torch

#Mean Pooling - Tomar en cuenta la máscara de atención para un promedio correcto
def mean_pooling(model_output, attention_mask):
    token_embeddings = model_output[0] #El primer elemento de model_output contiene todos los embeddings de los tokens
    input_mask_expanded = attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()
    return torch.sum(token_embeddings * input_mask_expanded, 1) / torch.clamp(input_mask_expanded.sum(1), min=1e-9)

# Oraciones para las que queremos embeddings de oraciones
sentences = ['Esta es una oración de ejemplo', 'Cada oración se convierte']

# Cargar el modelo desde HuggingFace Hub
tokenizer = AutoTokenizer.from_pretrained('{MODEL_NAME}')
model = AutoModel.from_pretrained('{MODEL_NAME}')

# Tokenizar oraciones
encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt')

# Calcular embeddings de tokens
with torch.no_grad():
    model_output = model(**encoded_input)

# Realizar pooling. En este caso, pooling promedio.
sentence_embeddings = mean_pooling(model_output, encoded_input['attention_mask'])

print("Embeddings de oraciones:")
print(sentence_embeddings)

Funcionalidades

Mapeo de oraciones y párrafos a un espacio vectorial de 768 dimensiones
Agrupación y búsqueda semántica
Entrenado adicionalmente con datos de NLI en catalán
Uso de Pérdida de Rango de Negativos Múltiples con Negativos Duros
Ampliación del conjunto de entrenamiento mediante la duplicación de tripletes

Casos de uso

Agrupación de oraciones
Búsqueda semántica
Identificación de paraphrasis
Evaluación de similitud de texto
Aumento de datos para modelos multilingües