如何将ELMo嵌入表示为一维数组?

时间:2018-10-30 09:45:09

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

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

在这种情况下,数据不是英语的,所以我从-https://github.com/HIT-SCIR/ELMoForManyLangs下载了一个自定义的ELMo模型(我认为其行为与正式的allennlp回购类似)

要将文本文档转换为嵌入功能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)

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

谢谢!

2 个答案:

答案 0 :(得分:0)

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

或者,在嵌入所有数据之后,您可以在整个数据集中标准化嵌入功能。如果您的应用程序在类似的流形上表现更好,这将导致一切都位于高维范围内。

答案 1 :(得分:0)

正如亚历克斯所说,减少每个句子的大小的方法很常见,以处理句子大小的差异,但是我不知道为什么需要平均所有句子向量。不必要,因为每个文档现在都有1024个特征的空间,因此可以使用PCA减小尺寸。