Sklearn + Gensim:如何使用Gensim的Word2Vec嵌入进行Sklearn文本分类

时间:2019-08-21 21:14:47

标签: python machine-learning scikit-learn gensim

我正在构建一个多标签文本分类程序,并且尝试使用OneVsRestClassifier + XGBClassifier对文本进行分类。最初,我使用Sklearn的Tf-Idf矢量化对文本进行矢量化,而没有错误。现在,我正在使用 Gensim的Word2Vec 对文本进行矢量化处理。但是,当我将向量化的数据输入到OneVsRestClassifier + XGBClassifier中时,我在分割测试数据和训练数据的那一行上出现以下错误:

  

TypeError:单例数组array(,         dtype = object)不能视为有效集合。

我曾尝试将向量化的数据转换为特征数组(np.array),但这似乎不起作用。 下面是我的代码:

x = np.array(Word2Vec(textList, size=120, window=6, min_count=5, workers=7, iter=15))

vectorizer2 = MultiLabelBinarizer()
vectorizer2.fit(tagList)
y = vectorizer2.transform(tagList)

# Split test data and convert test data to arrays
xTrain, xTest, yTrain, yTest = train_test_split(x, y, test_size=0.20)

变量textListtagList是字符串列表(我要分类的文字描述)。

1 个答案:

答案 0 :(得分:1)

x成为gensim.models.word2vec.Word2Vec对象的一个​​numpy数组转换-返回的实际上不是textList的word2vec表示形式。

大概,您要返回的是文档中每个单词的对应向量(对于代表每个文档的单个向量,最好使用Doc2Vec)。

对于其中最冗长的文档包含n个单词的一组文档,则每个文档将由n * 120矩阵表示。

出于说明目的未优化的代码

import numpy as np

model = x = Word2Vec(textList, size=120, window=6, 
                               min_count=5, workers=7, iter=15)

documents = []
for document in textList:
    word_vectors = []
    for word in document.split(' '): # or your logic for separating tokens
        word_vectors.append(model.wv[word])
    documents.append(np.concatenate(word_vectors))

# resulting in an n * 120 -- that is, `Word2Vec:size`-- array
document_matrix = np.concatenate(documents)