【问题标题】:Sklearn+Gensim: How to use Gensim's Word2Vec embedding for Sklearn text classificationSklearn+Gensim:如何使用 Gensim 的 Word2Vec 嵌入进行 Sklearn 文本分类
【发布时间】:2019-08-22 23:59:03
【问题描述】:

我正在构建一个多标签文本分类程序,我正在尝试使用 OneVsRestClassifier+XGBClassifier 对文本进行分类。最初,我使用 Sklearn 的 Tf-Idf Vectorization 来对文本进行矢量化,它可以正常工作。现在我正在使用 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 是一个字符串列表(我正在尝试分类的文本描述)。

【问题讨论】:

    标签: python machine-learning scikit-learn gensim


    【解决方案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)
    
    

    【讨论】:

      猜你喜欢
      • 2019-12-28
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 2017-08-29
      • 2019-02-07
      • 1970-01-01
      相关资源
      最近更新 更多