我使用语言模型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)
这种方法是否会破坏任何信息?如果是这样,还有其他方法吗?
谢谢!
我相信最常见的解决方案是找到每个句子的标记的平均值,每个句子有一个嵌入。您也可以对它们求和,但如果一个句子有许多令牌,您可能会冒险爆炸向量。
或者,在嵌入所有数据之后,您可以在整个数据集中规范化嵌入功能。如果您的应用程序在类似的流形上表现更好,这将导致所有内容都位于高维空间中。
正如亚历克斯所说,减少每个句子大小的方式,处理句子大小的差异是很常见的,但我不知道为什么你需要平均所有句子向量。没有必要,因为现在每个文档有1024个功能空间,您可以使用PCA来减小尺寸。