NegMPNet
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