像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)
但是如何在此管道中包含加载的字嵌入?或者它应该以某种方式包含在管道之外?我无法在网上找到有关如何执行此操作的大量文档。
感谢。
答案 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会透明地进行处理。
希望这会有所帮助