Загрузите предварительно обученную модель на TF-Hub для расчета расстояния Word Mover's Distance (WMD) на Gensim или spaCy

Я хочу рассчитать расстояние перемещения Word с помощью Универсальный кодировщик предложений в TensorFlow Hub.

Я пробовал пример на spaCy for WMD-relax, который загружает модель 'en' из spaCy, но я не мог найти другого способа кормить другие вложения.

В gensim кажется, что это только принимает load_word2vec_format файл (file.bin) или load файл (file.vec).

Насколько мне известно, кто-то написал Bert token embeddings на основе pytorch, но это не распространяется на другие модели на tf-hub.

Есть ли другой подход для переноса предварительно обученных моделей на tf-hub в формат spaCy или формат word2vec?


person davislf2    schedule 09.09.2019    source источник


Ответы (2)


Вам нужны две разные вещи.

Сначала скажите SpaCy использовать внешний вектор для ваших документов, промежутков или токенов. Это можно сделать, установив user_hooks: - user_hooks["vector"] для вектора документа - user_span_hooks["vector"] для вектора диапазона - user_token_hooks["vector"] для вектора токена

Учитывая тот факт, что у вас есть функция, которая извлекает из TF Hub векторы для Doc / Span / Token (все они имеют свойство text):

import spacy
import tensorflow_hub as hub


model = hub.load(TFHUB_URL)
def embed(element):
    # get the text
    text = element.text
    # then get your vector back. The signature is for batches/arrays
    results = model([text])
    # get the first element because we queried with just one text
    result = np.array(results)[0]
    return result

Вы можете написать следующий компонент конвейера, который сообщает spacy, как получить пользовательское вложение для документов, промежутков и токенов:

def overwrite_vectors(doc):
    doc.user_hooks["vector"] = embed
    doc.user_span_hooks["vector"] = embed
    doc.user_token_hooks["vector"] = embed

# add this to your nlp pipeline to get it on every document
nlp = spacy.blank('en') # or any other Language
nlp.add_pipe(overwrite_vectors)

Для вашего вопроса, связанного с настраиваемым расстоянием, есть пользовательский крючок для этого:

def word_mover_similarity(a, b):
    vector_a = a.vector
    vector_b = b.vector
    # your distance score needs to be converted to a similarity score
    similarity = TODO_IMPLEMENT(vector_a, vector_b)
    return similarity

def overwrite_similarity(doc):
    doc.user_hooks["similarity"] = word_mover_similarity
    doc.user_span_hooks["similarity"] = word_mover_similarity
    doc.user_token_hooks["similarity"] = word_mover_similarity

# as before, add this to the pipeline
nlp.add_pipe(overwrite_similarity)

У меня есть реализация универсального кодировщика предложений TF Hub, который использует user_hooks следующим образом: https://github.com/MartinoMensio/spacy-universal-sentence-encoder-tfhub

person Martino Mensio    schedule 22.04.2020

Вот простая реализация WMD. Вы можете создать объект WMD и загрузить свои собственные вложения:

import numpy
from wmd import WMD
embeddings_numpy_array = # your array with word vectors
calc = WMD(embeddings_numpy_array, ...)

Или, как показано в этом примере. можете создать свой собственный класс:

import spacy
spacy_nlp = spacy.load('en_core_web_lg')

class SpacyEmbeddings(object):
    def __getitem__(self, item):
        return spacy_nlp.vocab[item].vector # here you can return your own vector instead

calc = WMD(SpacyEmbeddings(), documents)
...
...
calc.nearest_neighbors("some text")
...

person KLaz    schedule 29.06.2020