首页 > 解决方案 > 向量化 Pandas 列

问题描述

我正在处理一个带有文本描述列的 Pandas 数据框。此列需要转换为与支持向量机一起使用的内容,特别是sklearn SVC. 所以我想获取每个描述并用数字数据替换它,为此我使用 TfidfVectorizer。

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

这导致记录如下所示:

0         (0, 12)\t0.30879049244590173\n  (0, 333)\t0....

返回的内容很接近,但仍无法在 SVM 中使用。我怀疑我误解了如何sklearn处理Pandas

标签: pythonpandasscikit-learn

解决方案


两件事情:

  1. 的输出vectorizer.fit_transform()是一个二维数组。将二维数组存储在 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()

推荐阅读