NegMPNet

tum-nlp
Similitud de oraciones

Esta es una versión con conciencia de negación del modelo all-mpnet-base-v2. 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 agrupamiento o búsqueda semántica. Para más información, consulte nuestro artículo 'Esto no es correcto! Evaluación consciente de la negación de sistemas de generación de lenguaje'.

Como usar

Usar este modelo se vuelve fácil cuando tienes sentence-transformers instalado:

pip install -U sentence-transformers

Luego puedes usar el modelo así:

from sentence_transformers import SentenceTransformer
sentences = ["Esta es una oración de ejemplo", "Cada oración es convertida"]

model = SentenceTransformer("tum-nlp/NegMPNet")
embeddings = model.encode(sentences)
print(embeddings)

Conciencia de negación

Este modelo tiene una mejor sensibilidad hacia las negaciones en comparación con su modelo base. Puedes probarlo tú mismo:

from sentence_transformers import SentenceTransformer, util
import torch

base_model = SentenceTransformer("sentence-transformers/all-mpnet-base-v2")
finetuned_model = SentenceTransformer("tum-nlp/NegMPNet")

def cos_similarities(references: list, candidates: list, model: SentenceTransformer, batch_size=8) -> torch.Tensor:
    assert len(references) == len(candidates), "El número de referencias y candidatos debe ser igual"
    emb_ref = model.encode(references, batch_size=batch_size)
    emb_cand = model.encode(candidates, batch_size=batch_size)
    return torch.diag(util.cos_sim(emb_ref, emb_cand))

references = ["Ray Charles es legendario.", "Ray Charles es legendario"]
candidates = ["Ray Charles es una leyenda.", "Ray Charles no es legendario."]
print(cos_similarities(references, candidates, base_model))  # imprime tensor([0.9453, 0.8683]) -> sin conciencia de negación
print(cos_similarities(references, candidates, finetuned_model))  # imprime tensor([0.9585, 0.4263]) -> sensible a la negación

Uso (HuggingFace Transformers)

Sin sentence-transformers, puedes usar el modelo así: Primero, pasas tu entrada a través del modelo transformer, luego tienes que aplicar la operación de agrupamiento correcta en la parte superior de las incrustaciones de palabras contextualizadas.

from transformers import AutoTokenizer, AutoModel
import torch

#Agrupamiento medio - Tener 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 todas las incrustaciones de 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 incrustaciones de oraciones
sentences = ['Esta es una oración de ejemplo', 'Cada oración es convertida']

# Cargar modelo desde HuggingFace Hub
tokenizer = AutoTokenizer.from_pretrained("tum-nlp/NegMPNet")
model = AutoModel.from_pretrained("tum-nlp/NegMPNet")

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

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

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

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

Resultados de la evaluación

Para una evaluación automatizada de este modelo, vea el Sentence Embeddings Benchmark: https://seb.sbert.net

Funcionalidades

Versión con conciencia de negación del modelo all-mpnet-base-v2
Modelo de sentence-transformers
Mapea oraciones y párrafos a un espacio vectorial denso de 768 dimensiones
Adecuado para tareas como agrupamiento o búsqueda semántica

Casos de uso

Agrupamiento de oraciones
Búsqueda semántica
Evaluación de sistemas de generación de lenguaje con conciencia de negación