【问题标题】:How to get word vectors from pre-trained word2vec model downloaded from TFHub?如何从 TFHub 下载的预训练 word2vec 模型中获取词向量?
【发布时间】:2020-09-30 06:07:25
【问题描述】:

所以我使用 TFHub 的以下 word2vec 模型:

embed = hub.load("https://tfhub.dev/google/Wiki-words-250-with-normalization/2")

这个对象的类型是:

tensorflow.python.saved_model.load.Loader._recreate_base_user_object.<locals>._UserObject

虽然我可以使用该模型嵌入文本列表,但我不清楚如何访问词嵌入本身。

【问题讨论】:

    标签: tensorflow deep-learning nlp word2vec


    【解决方案1】:

    首先,让我们讨论一下embed到底是什么?根据official documentation,embed 对象是基于 TensorFlow 2 格式存储的 Skipgram 模型创建的 TextEmbedding。

    Skipgram 模型只是一个前馈神经网络,它将词汇表中单词的 one-hot encoding 表示作为输入,它计算词嵌入。因此,这些词嵌入没有存储在模型中,而是被计算出来的。

    因此,如果您想要单独单词的单词嵌入,那么您可以一次传递一个,如下所示:

    # word embedding of `apple`
    >>> apple_embedding = embed(["apple"])
    >>> apple_embedding.shape
    TensorShape([1, 250])
    
    >>> #concatenation of three different word embeddings
    >>> group = embed(["apple", "banana", "carrot"])
    >>> group.shape
    TensorShape([3, 250])
    

    【讨论】:

    • 是的,如果您有所有单词的列表,您可以这样做。但这是一件非常愚蠢的事情,必须自己创造。因此,您可以使用 embed.embeddings 从 embed 访问词嵌入。形状为 (1009375, 250)。那是 1M 代币!我找不到将单词映射到嵌入索引的实际字典。这正是我所需要的。
    • 好的,我找到了一个解决方案,虽然可能不是最佳解决方案。如果您从 TFHub 下载模型存档,则其中有一个名为 tokens.txt 的文件,位于 assets 文件夹中。该文件有 1009374 个标记,每行一个。我假设行号是标记在嵌入矩阵中的索引。我唯一不知道的是该索引中的 标记是 0 还是最终条目中的 0,但我可能很快就能弄清楚。
    猜你喜欢
    • 2017-11-25
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多