使用 word2vector 数据训练 SVM

Posted

技术标签:

【中文标题】使用 word2vector 数据训练 SVM【英文标题】:Training SVM with word2vector data 【发布时间】:2019-07-12 18:49:46 【问题描述】:

输入文本数据被标记化:

数据['标记化'] ['hasan', 'minhaj', 'responds', 'netflix', 'pulling', 'episode', 'comedy', 'show', 'saudi', 'arab']

数据用 0 填充以使所有标记化的文本长度相等(在本例中为 51):

len(data['tokenised'][0])
51

100维的词向量称为: embeddings_index = dict() f = open('glove.6B.100d.txt') 对于 f 中的行: 值 = line.split() 字=值[0] coefs = np.asarray(values[1:], dtype='float32') embeddings_index[word] = coefs f.close()

输入数据标记被转换成它们的向量形式:

def word2vec(tokens,max_size,dim):
    print(tokens)
    vec = np.zeros((max_size,dim))
    for ind,tok in enumerate(tokens):
        if(tok==0):
            vec[ind] = vec[ind]
        else:
            try:
                print(ind)
                vec[ind] = embeddings_index[tok]
            except KeyError:
                continue
return vec


data['w2v'][0]
array([[-0.41133001, -0.20108999, -0.54119998, ..., -0.67202002,
     0.14799   , -0.055051  ],
   [ 0.049478  ,  0.26212001, -0.78268999, ..., -0.14226   ,
    -0.32286   ,  0.13525   ],
   [-0.14078   ,  0.6573    ,  0.44602001, ..., -0.55290002,
     0.19839001,  0.39563   ],
   ...,
   [ 0.        ,  0.        ,  0.        , ...,  0.        ,
     0.        ,  0.        ],
   [ 0.        ,  0.        ,  0.        , ...,  0.        ,
     0.        ,  0.        ],
   [ 0.        ,  0.        ,  0.        , ...,  0.        ,
     0.        ,  0.        ]])

现在我有每个长度为 51 个单词的文本,每个单词由 100 维向量表示(如 data['w2v'] 所示)。 数据['w2v'][0].shape (51, 100) 所有数组的维度相同,即 (51,100),并且所有数组元素都是浮点类型。

data['w2v'] 是一列数据框。

在 train-test 中拆分数据: x_train,x_test,y_train,y_test =

train_test_split(data['w2v'],data['class'],test_size=0.2,stratify=data['class'])

x_train.shape    #series data type
(10248,)

x_train[7].shape   #2D array
(51, 100)

在使用 2D numpy 数组拟合 SVM 模型时,出现以下错误: 模型 = 线性 SVC(C=0.3) model.fit(x_train,y_train) ValueError: 使用序列设置数组元素。

注意: 所有 numpy 数组的形状都相同 (51,100)。

请建议如何处理此错误? 我应该如何修改 x_train 以便可以训练模型?

【问题讨论】:

【参考方案1】:

您的x_train 目前是三维的。到目前为止,您所做的导致每个训练示例 x_train[i] 是一个 (51,100) 数组,即 x_train 的形状是 (n_samples, 51, 100)。

当您调用fit 方法时,x_train 需要具有(n_samples, n_features) 的形状(直接来自docs)。因此,您需要将每个输入的 51x100 数组减少为一维数组/向量。您可以通过 -

只需将 (51,100) 形状的数组重新整形为 (5100) 大小的向量,以便您的 x_train 的形状为 (n_samples, 5100),或者 通过以某种方式组合嵌入,例如平均它们或获得较少数量的特征。例如,您可以对每个 (51,100) 形状的数组求和/平均,以获得 (51) 大小的特征向量。我提到这种可能性是因为平均词嵌入来获得句子嵌入是一种非常粗糙但常用的基线技术(这当然通常不适用于转换输入形状)。

【讨论】:

感谢您的帮助。将尺寸减少到 51 个大小的向量(第二个选项)有效,但准确度仅为 76%。需要找到更好的降维方法。

以上是关于使用 word2vector 数据训练 SVM的主要内容,如果未能解决你的问题,请参考以下文章

word2vector

前沿系列--Word2Vector[基础须知-附代码]

tutorial on word2vector

Word2vector---------学习笔记

Word2vector原理

项目小结训练BERT模型加入到深度学习网络层中——keras_bert库使用填坑指南