使用word2vector数据训练SVM

时间:2019-02-19 09:53:51

标签: python-3.x nlp svm numpy-ndarray

输入文本数据被标记化:

data ['tokenised'] ['hasan','minhaj','responds','netflix','pulling','episode','comedy','show','saudi','arab']

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

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

100维的字向量称为:     embeddings_index = dict()     f =打开('glove.6B.100d.txt')     对于f中的行:         值= line.split()         字=值[0]         coefs = np.asarray(values [1:],dtype ='float32')         embeddings_index [word] =系数     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']是数据框的一列。

在火车测试中分割数据:     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)

在将SVM模型与2D numpy数组拟合时,出现以下错误:     型号= LinearSVC(C = 0.3)     model.fit(x_train,y_train)     ValueError:设置具有序列的数组元素。

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

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

1 个答案:

答案 0 :(得分:0)

您的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)大小的特征向量。我之所以提到这种可能性,是因为对单词嵌入进行平均以获得句子嵌入是一种非常粗糙但常用的基线技术(当然,这通常不适用于转换输入形状)。