我正在处理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
的关系
答案 0 :(得分:1)
两件事:
vectorizer.fit_transform()
的输出为二维数组。将2-d数组存储在DataFrame的单个列中不好,会导致问题。
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)