Вам нужны две разные вещи.
Сначала скажите 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