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

问题描述 投票:3回答:2

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

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

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

因此,我的培训数据中的一个示例可以嵌入如下:

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
2个回答
0
投票

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

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


0
投票

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

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