【问题标题】:How to represent ELMo embeddings as a 1D array?如何将 ELMo 嵌入表示为一维数组?
【发布时间】:2019-04-03 07:47:45
【问题描述】:

我正在使用语言模型 ELMo - https://allennlp.org/elmo 将我的文本数据表示为数字向量。该向量将用作简单情绪分析任务的训练数据。

在这种情况下,数据不是英文的,所以我从 - https://github.com/HIT-SCIR/ELMoForManyLangs 下载了一个自定义 ELMo 模型(我假设这个行为类似于官方的 allennlp repo)

要将文本文档转换为嵌入函数sents2elmo 的ELMo。如果我理解文档正确,则该参数是标记化句子的列表。

所以我的训练数据中的一个样本可以嵌入如下:

from elmoformanylangs import Embedder
embedder = Embedder('custom_language') 
embeddings = embedder.sents2elmo([['hello', 'world', 'how', 'are', 'you', '?'], 
                                  ['am', 'great', 'thanks', '!']])

这将返回一个由两个numpy数组组成的列表,每个句子一个,句子中的每个标记将表示为一个大小为1024的向量。由于sents2elmo(output_layer)的默认参数是-1,这个向量表示语言模型中 3 个内部层的平均值。

嵌入如何表示为一维数组?我应该对一个句子的所有词向量进行平均吗?然后平均所有的句子向量?

sentence_1 = np.mean(embeddings[0], axis=0)
sentence_2 = np.mean(embeddings[1], axis=0)
document = np.mean([sentence_1, sentence_2], axis=0)

这种方法会破坏任何信息吗?如果是这样,还有其他方法吗?

谢谢!

【问题讨论】:

    标签: machine-learning nlp classification text-classification word-embedding


    【解决方案1】:

    正如 Alex 所说,减少每个句子大小的方式是处理句子大小差异的常见方法,但我不知道为什么需要平均所有句子向量。没有必要,因为现在每个文档都有 1024 个特征空间,您可以使用 PCA 来减少维度。

    【讨论】:

      【解决方案2】:

      我相信最常见的解决方案是找到每个句子的标记的平均值,以便每个句子都有一个嵌入。你也可以对它们求和,但如果一个句子有很多标记,你可能会冒着爆炸向量的风险。

      或者,在嵌入所有数据后,您可以对整个数据集的嵌入特征进行规范化。如果您的应用程序在这样的流形上表现得更好,这将导致一切都位于高维球体中。

      【讨论】:

        猜你喜欢
        • 2010-11-29
        • 2011-02-28
        • 1970-01-01
        • 1970-01-01
        • 2019-11-18
        • 2020-10-28
        • 1970-01-01
        • 1970-01-01
        • 2016-12-16
        相关资源
        最近更新 更多