矢量化熊猫专栏

时间:2019-01-01 15:47:28

标签: python pandas scikit-learn

我正在处理Pandas数据框,其中包含一列文字描述。需要将该列转换为支持向量机(特别是c)可以使用的内容。因此,我想使用每个描述并将其替换为数值数据,为此,我正在使用TfidfVectorizer。

sklearn SVC

这将导致记录如下所示:

vectorizer = TfidfVectorizer()
df['description'] = vectorizer.fit_transform(df['description'])

这返回的内容很接近,但仍无法在SVM中使用。我怀疑我误会了0 (0, 12)\t0.30879049244590173\n (0, 333)\t0.... sklearn的关系

2 个答案:

答案 0 :(得分:1)

两件事:

  1. vectorizer.fit_transform()的输出为二维数组。将2-d数组存储在DataFrame的单个列中不好,会导致问题。

  2. vectorizer.fit_transform()的输出是一个稀疏二维数组,以节省内存。由于词汇量很大,并且大多数文档仅包含整个词汇量中的某些单词,因此实际的输出数组包含大量零值元素。稀疏矩阵是处理这些问题的一种方法。

    pandas通常不适用于稀疏数组。它将其视为单个对象。因此,当您这样做时:

    df['description'] = vectorizer.fit_transform(df['description'])
    

    会将单个对象(我们的稀疏矩阵)广播到该指定列的每个位置(行)。所以这是不正确的。

如果可以使用稀疏矩阵,则应按照@AI_Learning所述进行进一步处理。

如果您出于显示或保存目的而绝对需要将tf-idf值存储到DataFrame中,则正确的方法是创建一个新的DataFrame:

sparse_out = vectorizer.fit_transform(df['description'])
tfidf_df = pd.DataFrame(data = sparse_out.toarray(),
                        columns = vectorizer.get_feature_names())

tfidf_df.head()

答案 1 :(得分:0)

熊猫不能很好地存储 tf-idf vectorizer 的输出。因此,请分别保存(transformed_text),然后将其输入svm。

vectorizer = TfidfVectorizer()
transformed_text = vectorizer.fit_transform(df['description'])

model=svm.SVC()
model.fit(transformed_text)