jzju/sbert-sv-lim2

jzju
Similitud de oraciones

Este modelo está entrenado a partir de KBLab/bert-base-swedish-cased-new con datos de sbx/superlim-2. Este es un modelo de sentence-transformers: mapea oraciones y párrafos a un espacio vectorial denso de 256 dimensiones y puede ser utilizado para tareas como agrupación o búsqueda semántica.

Como usar

Usar este modelo es fácil si 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 se convierte']
model = SentenceTransformer('jzju/sbert-sv-lim2')
embeddings = model.encode(sentences)
print(embeddings)

Código de entrenamiento:

from datasets import load_dataset, concatenate_datasets
from sentence_transformers import (SentenceTransformer, InputExample, losses, models, util, datasets)
from torch.utils.data import DataLoader
from torch import nn
import random
word_embedding_model = models.Transformer('KBLab/bert-base-swedish-cased-new', max_seq_length=256)
pooling_model = models.Pooling(word_embedding_model.get_word_embedding_dimension())
dense_model = models.Dense(in_features=pooling_model.get_sentence_embedding_dimension(), out_features=256, activation_function=nn.Tanh())
model = SentenceTransformer(modules=[word_embedding_model, pooling_model, dense_model])
def pair():
    def norm(x):
        x['label'] = x['label'] / m
        return x
    dd = []
    for sub in ['swepar', 'swesim_relatedness', 'swesim_similarity']:
        ds = concatenate_datasets([d for d in load_dataset('sbx/superlim-2', sub).values()])
        if 'sentence_1' in ds.features:
            ds = ds.rename_column('sentence_1', 'd1')
            ds = ds.rename_column('sentence_2', 'd2')
        else:
            ds = ds.rename_column('word_1', 'd1')
            ds = ds.rename_column('word_2', 'd2')
        m = max([d['label'] for d in ds])
        dd.append(ds.map(norm))
    ds = concatenate_datasets(dd)
    train_examples = []
    for d in ds:
        train_examples.append(InputExample(texts=[d['d1'], d['d2']], label=d['label']))
    train_dataloader = DataLoader(train_examples, shuffle=True, batch_size=64)
    train_loss = losses.CosineSimilarityLoss(model)
    model.fit(train_objectives=[(train_dataloader, train_loss)], epochs=10, warmup_steps=100)

def nli():
    ds = concatenate_datasets([d for d in load_dataset('sbx/superlim-2', 'swenli').values()])
    def add_to_samples(sent1, sent2, label):
        if sent1 not in train_data:
            train_data[sent1] = {0: set(), 1: set(), 2: set()}
        train_data[sent1][label].add(sent2)
    train_data = {}
    for d in ds:
        add_to_samples(d['premise'], d['hypothesis'], d['label'])
        add_to_samples(d['hypothesis'], d['premise'], d['label'])
    train_samples = []
    for sent1, others in train_data.items():
        if len(others[0]) > 0 and len(others[1]) > 0:
            train_samples.append(InputExample(texts=[sent1, random.choice(list(others[0])), random.choice(list(others[1]))]))
        train_samples.append(InputExample(texts=[random.choice(list(others[0])), sent1, random.choice(list(others[1]))]))
    train_dataloader = datasets.NoDuplicatesDataLoader(train_samples, batch_size=64)
    train_loss = losses.MultipleNegativesRankingLoss(model)
    model.fit(train_objectives=[(train_dataloader, train_loss)], epochs=1, warmup_steps=100)
pair()
nli()
model.save()

Funcionalidades

Transformador de oraciones a vectores densos
Espacio vectorial de 256 dimensiones
Utilizable para agrupación de datos
Busqueda semántica
Entrenado con datos suecos

Casos de uso

Agrupación de oraciones
Búsqueda semántica
Extracción de características
Inferencia de incrustaciones textuales