来自 Keras 中 lm_1b 的字符-词嵌入

Posted

技术标签:

【中文标题】来自 Keras 中 lm_1b 的字符-词嵌入【英文标题】:Character-Word Embeddings from lm_1b in Keras 【发布时间】:2017-10-31 15:13:43 【问题描述】:

我想在 Keras NN 模型中使用一些预训练的词嵌入,这些模型已由 Google 在 very well known article 中发布。他们提供了训练新模型的代码,以及嵌入 here。

但是,从文档中不清楚如何从简单的 python 函数调用中从给定的字符串(单词)中检索嵌入向量。大部分文档似乎都集中在将向量转储到一个文件中,以获取整个句子,大概是为了进行情感分析。

到目前为止,我已经看到您可以使用以下语法输入预训练的嵌入:

embedding_layer = Embedding(number_of_words??,
                            out_dim=128??,
                            weights=[pre_trained_matrix_here],
                            input_length=60??,
                            trainable=False)

但是,我不太清楚将不同的文件及其结构转换为 pre_trained_matrix_here

他们有几个 softmax 输出,所以我不确定哪个属于 - 以及如何将我输入中的单词与他们拥有的单词字典对齐。

是否有一种简单的方法可以在 keras 中使用这些词/字符嵌入和/或在 keras 中构建模型的字符/词嵌入部分,以便可以为其他 NLP 任务添加更多层?

【问题讨论】:

mccormickml.com/2016/04/12/… 我可以得到常规的 word2vec 或 glove 向量来工作,这里的主要兴趣是使用卷积 lstm 网络从字符中生成词向量,这样 OOV 词就会得到一个很好的估计向量本质上是即时计算矢量。我也实现了字符向量,但他们的模型在大量 GPU 上训练了数周,这不是我可以轻松重现的。 你有明确的目标吗?检索嵌入向量是什么意思?通常你只是将嵌入层保留在模型的开头。模型权重只是一个自动训练和保存的矩阵。您不可能从数据中伪造或组装它。要么你有训练好的矩阵,要么你没有。 lm_1b 模型有几种不同的输出模式,可以对字符、单词、句子等进行编码。我希望创建一个简单的 python 函数,使用他们的模型将句子转换为一系列词向量(不会超出词汇表,因为模型是基于字符的)。这是对问题的希望。代码似乎设置为接收文件格式的文本并将其输出到另一个文件,但事实证明,将其从文件更改为变量中的文本比我想象的要多。 链接到他们的代码和嵌入已经死了;我们无能为力。该论文没有脚注说明他们将工作存储在何处,因此我们将不得不阅读它以希望找到该链接,这很不方便。您的代码 sn-p 来自 keras 嵌入:keras.io/layers/embeddings 所以我可以澄清那些“??”在一般意义上。您的 `input_length' 应该是所有句子中的最大单词数,所有其他句子都使用 Tokenizer keras.io/preprocessing/text 填充到该长度的虚拟标记。 Out_dim 是每个嵌入的大小。 Num_words = 嵌入矩阵中的总字数。 【参考方案1】:

Embedding 层只为输入单词的整数索引提取嵌入(权重矩阵的列),它对字符串一无所知。这意味着您需要首先使用与从中获取嵌入的模型中使用的相同词汇表将输入的单词序列转换为索引序列。

【讨论】:

【参考方案2】:

对于与文字或文本编码相关的 NLP 应用程序,我会使用 CountVectorizer 或 TfidfVectorizer。两者都在以下参考中以 Python 的简要方式公布和描述:http://www.bogotobogo.com/python/scikit-learn/files/Python_Machine_Learning_Sebastian_Raschka.pdf

CounterVectorizer 可用作 SPAM-HAM 检测器的简单应用,而 TfidfVectorizer 可以更深入地了解每个术语(词)在文档中的频率以及出现此结果的文档数量方面的相关性以一个有趣的指标来衡量所考虑的术语的判别性。该文本特征提取器可能会考虑去除停用词和词形还原以增强特征表示。

【讨论】:

感谢您对巴勃罗的意见。基本的 tf-idf 方法很有用;然而,对于这个问题,我想更多地询问将字符级特征整合到嵌入中,因为许多任务需要理解字符串 "\t__BestFriend_;\t" 与 "Best-Friend" 高度相似,为此(高度取决于标记化)对于像 tf-idf 这样的简单方法不会发生。虽然我现在正在创建类似于 ELMo 的嵌入,但在这里我有兴趣使用 Google 的类似 lm1b 来计算我所有输入单词的嵌入,然后再将它们提供给我的任务 - 最好是在运行中

以上是关于来自 Keras 中 lm_1b 的字符-词嵌入的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Keras 中使用附加功能和词嵌入?

如何从 Keras 嵌入层获取词向量

在 Keras 中使用 GRU 实现 Seq2Seq

keras.tokenizer.texts_to_sequences 和词嵌入有啥区别

Keras 1d 卷积层如何处理词嵌入 - 文本分类问题? (过滤器、内核大小和所有超参数)

对不在训练集中的新词使用 keras 分词器