我想计算一下 词条搬运工的距离 与 TensorFlow Hub上的通用句子编码器 嵌入。
我已经试过在 大规模杀伤性武器放松疗法但我找不到另一种方法来喂养其他嵌入物。
在 遗传因子,它似乎只接受 load_word2vec_format
文件 (file.bin
)或 load
文件 (file.vec
).
据我所知,有人写过一篇 基于pytorch的Bert到token嵌入。但它不能通用于tf-hub上的其他模型,请问有没有其他方法可以将tf-hub上的预训练模型转移到spaCy格式或word2vec格式?
有没有其他方法可以将tf-Hub上的预训练模型转移到spaCy格式或word2vec格式?
你需要两个不同的东西。
首先,告诉SpaCy为您的文档、跨度或标记使用外部向量。这可以通过设置 user_hooks
:- user_hooks["vector"]
是指文件向量- user_span_hooks["vector"]
是为跨度矢量- user_token_hooks["vector"]
是指代币向量
考虑到你有一个函数可以从TF Hub中检索DocSpanToken的向量(所有的DocSpanToken都有属性 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.comMartinoMensiospacy-universal-sentence-encoder-tfhub。
喏 是WMD在spacy中的实现。你可以创建一个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")
...