使用Keras从lm_1b中生成字符-单词嵌入

18

我想在Keras NN模型中使用一些由Google在一篇非常著名的文章中发布的预训练词向量。他们提供了训练新模型的代码以及嵌入 这里

然而,文档不清楚如何通过一个简单的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任务的层?


1
http://mccormickml.com/2016/04/12/googles-pretrained-word2vec-model-in-python/ - scarecrow
我可以让常规的word2vec或glove向量工作,但这里的主要兴趣是使用卷积LSTM网络从字符中生成单词向量,以便通过基本上计算出飞行矢量来为OOV单词提供良好的估计矢量。我已经实现了字符向量,但他们的模型在大量GPU上进行了数周的训练,这并不是我能轻易重复的事情。 - chase
你是否有明确的目标?“检索嵌入向量”是什么意思?通常情况下,您只需保留模型开头的嵌入层。模型权重只是一个自动训练和保存的矩阵。您不可能从数据中伪造或组装它。要么您拥有经过训练的矩阵,要么您没有。 - Daniel Möller
lm_1b模型具有几种不同的输出模式,可以编码字符、单词、句子等。我希望创建一个简单的Python函数,使用他们的模型将文本句子转换为一系列单词向量(由于该模型是基于字符的,所以这些向量不会超出词汇表)。这就是问题的希望。代码似乎被设置为接收文件格式的文本并将其输出到另一个文件中,但将其从文件更改为变量中的文本比我想象的要更费力。 - chase
链接到他们的代码和嵌入已经失效,我们无法提供太多帮助。该论文没有注明他们存储工作的位置,因此我们将不得不阅读它,以期找到那个链接,这是不方便的。您的代码片段来自Keras嵌入:https://keras.io/layers/embeddings/,因此我可以在一般意义上澄清那些“??”。您的`input_length'应该是所有句子中单词数的最大值,其他所有句子都使用Tokenizer https://keras.io/preprocessing/text/填充一个虚拟令牌到该长度。Out_dim是每个嵌入的大小。Num_words =嵌入矩阵中的总单词数。 - prijatelj
2个回答

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

结果:嵌入层只选择输入单词的整数索引处的嵌入(权重矩阵的列),它不了解任何关于字符串的内容。这意味着你需要先将输入单词序列转换成索引序列,使用与从中获得嵌入的模型相同的词汇表。

0

对于与单词或文本编码相关的NLP应用,我会使用CountVectorizer或TfidfVectorizer。两者在以下参考资料中以简要方式针对Python进行了公告和描述: http://www.bogotobogo.com/python/scikit-learn/files/Python_Machine_Learning_Sebastian_Raschka.pdf

CounterVectorizer可以用于简单的应用,如SPAM-HAM检测器,而TfidfVectorizer则可以更深入地了解每个术语(单词)在文档中的频率以及出现在其中的文档数,从而得出一个有趣的指标来衡量被认为是歧视性的术语有多重要。这些文本特征提取器可能需要考虑去除停用词和词形还原,以提高特征表示。


感谢您的输入,Pablo。基本的tf-idf方法很有用;然而,对于这个问题,我更想了解如何将字符级特征融入到嵌入中,因为许多任务需要理解字符串“\t__BestFriend_;\t”与“Best-Friend”非常相似,而对于简单的tf-idf等方法(高度依赖于分词),这种相似性不会发生。虽然我现在正在创建类似于ELMo的嵌入,但我对使用Google类似的lm1b来计算所有输入单词的嵌入并在将它们提供给我的任务之前进行处理很感兴趣 - 最好是即时处理。 - chase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接