Регрессионный вывод SpaCy-трансформаторов - PullRequest
1 голос
/ 19 марта 2020

Я бы хотел получить регрессионный вывод вместо классификации. Например: вместо n классов я хочу получить выходное значение с плавающей запятой от 0 до 1.

Вот пример minimalisti c со страницы пакета github:

    import spacy
    from spacy.util import minibatch
    import random
    import torch

    is_using_gpu = spacy.prefer_gpu()
    if is_using_gpu:
        torch.set_default_tensor_type("torch.cuda.FloatTensor")

    nlp = spacy.load("en_trf_bertbaseuncased_lg")
    print(nlp.pipe_names) # ["sentencizer", "trf_wordpiecer", "trf_tok2vec"]
    textcat = nlp.create_pipe("trf_textcat", config={"exclusive_classes": True})
    for label in ("POSITIVE", "NEGATIVE"):
        textcat.add_label(label)
    nlp.add_pipe(textcat)

    optimizer = nlp.resume_training()
    for i in range(10):
        random.shuffle(TRAIN_DATA)
        losses = {}
        for batch in minibatch(TRAIN_DATA, size=8):
            texts, cats = zip(*batch)
            nlp.update(texts, cats, sgd=optimizer, losses=losses)
        print(i, losses)
    nlp.to_disk("/bert-textcat")

Есть ли простой способ заставить trf_textcat работать в качестве регрессора? Или это будет означать расширение библиотеки?

1 Ответ

0 голосов
/ 17 апреля 2020

Я нашел обходной путь: извлекать векторные представления из конвейера nlp следующим образом:

vector_repres = nlp('Test text').vector

После этого для всех текстовых записей вы получите фиксированное размерное представление текстов. Предполагая, что у вас есть непрерывные выходные значения, не стесняйтесь использовать любой оценщик, в том числе нейронную сеть с линейным выходом.

Обратите внимание, что векторное представление является средним векторным вложением всех слов в тексте - это может быть неоптимальным решением для вашего случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...