jgrosjean-mathesis/sentence-swissbert
jgrosjean-mathesis
Similitud de oraciones
El modelo SwissBERT se afinó mediante SimCSE auto-supervisado (Gao et al., EMNLP 2021) para incrustaciones de oraciones, utilizando ~1.5 millones de artículos de noticias suizas hasta 2023 (recuperados a través de Swissdox@LiRI). Siguiendo el enfoque de Sentence Transformers (Reimers y Gurevych, 2019), se utiliza el promedio de los últimos estados ocultos (pooler_type=avg) como representación de la oración. El modelo está desarrollado por Juri Grosjean y es una versión afinada del modelo SwissBERT. Apoyado en PyTorch y Transformers, es compatible con múltiples idiomas y ofrece un rendimiento comparable o superior a modelos multilingües mejor calificados.
Como usar
import torch
from transformers import AutoModel, AutoTokenizer
# Cargar swissBERT para incrustaciones de oraciones
model_name = "jgrosjean-mathesis/sentence-swissbert"
model = AutoModel.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
def generate_sentence_embedding(sentence, language):
# Configurar adaptador al idioma especificado
if "de" in language:
model.set_default_language("de_CH")
if "fr" in language:
model.set_default_language("fr_CH")
if "it" in language:
model.set_default_language("it_CH")
if "rm" in language:
model.set_default_language("rm_CH")
# Tokenizar la oración de entrada
inputs = tokenizer(sentence, padding=True, truncation=True, return_tensors="pt", max_length=512)
# Pasar la entrada tokenizada por el modelo
with torch.no_grad():
outputs = model(**inputs)
# Extraer incrustaciones de la oración mediante agrupación media
token_embeddings = outputs.last_hidden_state
attention_mask = inputs['attention_mask'].unsqueeze(-1).expand(token_embeddings.size()).float()
sum_embeddings = torch.sum(token_embeddings * attention_mask, 1)
sum_mask = torch.clamp(attention_mask.sum(1), min=1e-9)
embedding = sum_embeddings / sum_mask
return embedding
# Probarlo
sentence_0 = "Wir feiern am 1. August den Schweizer Nationalfeiertag."
sentence_0_embedding = generate_sentence_embedding(sentence_0, language="de")
print(sentence_0_embedding)
from sklearn.metrics.pairwise import cosine_similarity
# Definir dos oraciones
sentence_1 = ["Der Zug kommt um 9 Uhr in Zürich an."]
sentence_2 = ["Le train arrive à Lausanne à 9h."]
# Calcular incrustaciones para ambas
embedding_1 = generate_sentence_embedding(sentence_1, language="de")
embedding_2 = generate_sentence_embedding(sentence_2, language="fr")
# Calcular la similitud de coseno
cosine_score = cosine_similarity(embedding_1, embedding_2)
# Mostrar el puntaje
print("El puntaje de coseno para", sentence_1, "y", sentence_2, "es", cosine_score)
Funcionalidades
- SimCSE auto-supervisado para incrustaciones de oraciones
- Entrenado en ~1.5 millones de artículos de noticias suizas
- Utiliza el promedio de los últimos estados ocultos para representar oraciones
- Compatible con idiomas: alemán, francés, italiano y romanche
- Compatible con PyTorch y Transformers
- Provee incrustaciones de oraciones mediante agrupación media
Casos de uso
- Cálculo de similitud semántica entre oraciones
- Incrustaciones de oraciones para recuperación de documentos
- Clasificación de texto mediante enfoque de k-vecinos más cercanos
- Transferencia entre idiomas para textos traducidos