在TF-Hub上加载预训练模型,以计算Gensim或spaCy上的单词移动距离(WMD)。

问题描述 投票:1回答:1

我想计算一下 词条搬运工的距离TensorFlow Hub上的通用句子编码器 嵌入。

我已经试过在 大规模杀伤性武器放松疗法但我找不到另一种方法来喂养其他嵌入物。

遗传因子,它似乎只接受 load_word2vec_format 文件 (file.bin)或 load 文件 (file.vec).

据我所知,有人写过一篇 基于pytorch的Bert到token嵌入。但它不能通用于tf-hub上的其他模型,请问有没有其他方法可以将tf-hub上的预训练模型转移到spaCy格式或word2vec格式?

有没有其他方法可以将tf-Hub上的预训练模型转移到spaCy格式或word2vec格式?

tensorflow nlp gensim spacy tensorflow-hub
1个回答
0
投票

你需要两个不同的东西。

首先,告诉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。


0
投票

是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")
...

© www.soinside.com 2019 - 2024. All rights reserved.