【问题标题】:How to make use of pre-trained word embeddings when training a model in sklearn?在 sklearn 中训练模型时如何利用预训练的词嵌入?
【发布时间】:2018-11-30 03:38:52
【问题描述】:

使用 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)

但是我怎样才能在这个管道中包含加载的词嵌入呢?还是应该以某种方式将其包含在管道之外?我在网上找不到太多关于如何执行此操作的文档。

谢谢。

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:

    您可以使用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 不同,词向量不会使用某种梯度下降进行微调

    【讨论】:

    • 而这个FunctionTransformer()可以传入Pipeline吗?
    • 是的,可以。这几乎就是它的全部目的
    【解决方案2】:

    使用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 会透明地处理。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2019-11-14
      • 2019-07-11
      • 2017-08-19
      • 2019-10-27
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      相关资源
      最近更新 更多