如何在sklearn中训练模型时使用预先训练过的单词嵌入?

时间:2018-03-12 13:13:34

标签: python machine-learning scikit-learn

像keras中的神经网络(NN)一样,如何在NN的训练中使用单词嵌入非常清楚,你可以简单地做一些像

这样的事情。
embeddings = ...
model = Sequential(Embedding(...),
                   layer1,
                   layer2,...)

但我不确定如何使用sklearn中的算法(如SVM,NB和逻辑回归)来完成此操作。我了解有一种Pipeline方法,其工作原理很简单(http://scikit-learn.org/stable/tutorial/text_analytics/working_with_text_data.html),如

pip = Pipeline([(Countvectorizer()), (TfidfTransformer()), (Classifier())])
pip.fit(X_train, y_train)

但是如何在此管道中包含加载的字嵌入?或者它应该以某种方式包含在管道之外?我无法在网上找到有关如何执行此操作的大量文档。

感谢。

2 个答案:

答案 0 :(得分:3)

您可以使用FunctionTransformer课程。 如果您的目标是使用一个带有索引矩阵并使用单词向量输出3d张量的变换器,那么这应该足够了:

# this assumes you're using numpy ndarrays
word_vecs_matrix = get_wv_matrix()  # pseudo-code
def transform(x):
    return word_vecs_matrix[x]
transformer = FunctionTransformer(transform)

请注意,与keras不同,单词vector 不会使用某种梯度下降进行微调

答案 1 :(得分:1)

通过Zeugma软件包,有任何简单的方法来获取单词嵌入转换器。

它处理预训练的嵌入的下载,并为嵌入返回“ Transformer接口”。

例如,如果要对句子表示使用GloVe嵌入的平均值,则只需编写:

    from zeugma.embeddings import EmbeddingTransformer
    glove = EmbeddingTransformer('glove')

这里glove是一种sklearn转换器,具有标准的转换方法,该方法将句子列表作为输入并输出设计矩阵,就像Tfidftransformer一样。您可以使用embeddings = glove.transform(['first sentence of the corpus', 'another sentence'])embeddings获得包含2 x N个矩阵的嵌入结果,其中N是所选嵌入的维数。请注意,您不必费心进行嵌入下载或本地加载(如果已经完成的话),Zeugma会透明地进行处理。

希望这会有所帮助