1

我有文本变量中的单词列表及其标签。我喜欢制作一个可以预测新输入文本标签的分类器。

我正在考虑在 Python 中使用 scikit-learn 包来使用 SVM 模型。

我意识到需要将文本转换为矢量形式,所以我正在尝试 TfidfVectorizer 和 CountVectorizer。

到目前为止,这是我使用 TfidfVectorizer 的代码:

from sklearn import svm
from sklearn.feature_extraction.text import TfidfVectorizer

label = ['organisasi','organisasi','organisasi','organisasi','organisasi','lokasi','lokasi','lokasi','lokasi','lokasi']
text = ['Partai Anamat Nasional','Persatuan Sepak Bola', 'Himpunan Mahasiswa','Organisasi Sosial','Masyarakat Peduli','Malioboro','Candi Borobudur','Taman Pintar','Museum Sejarah','Monumen Mandala']

vectorizer = TfidfVectorizer(min_df=1)

X = vectorizer.fit_transform(text)
y = label

klasifikasi = svm.SVC()

klasifikasi = klasifikasi.fit(X,y) #training

test_text = ['Partai Perjuangan']
test_vector = vectorizer.fit_transform(test_text)

prediksi = klasifikasi.predict([test_vector]) #test

print(prediksi)

我也尝试使用上面相同的代码来使用 CountVectorizer。两者都显示相同的错误结果:

ValueError: setting an array element with a sequence.

如何解决这个问题呢?谢谢

4

1 回答 1

2

错误是由于这一行:

prediksi = klasifikasi.predict([test_vector])

大多数 scikit 估计器需要一个 shape 数组[n_samples, n_features]。TfidfVectorizer的test_vector输出已经准备好用于估计器的形状。您无需将其括在方括号 ([]) 中。包装使它成为一个不合适的列表。

尝试像这样使用它:

prediksi = klasifikasi.predict(test_vector)

但即使那样你也会出现 gt 错误。因为这条线:

test_vector = vectorizer.fit_transform(test_text)

在这里,您以与估计器所学的方式不同的方式拟合矢量化klasifikasi器。fit_transform()只是调用fit()(学习数据)然后调用它的快捷方式transform()。对于测试数据,始终使用transform()方法,从不fit()fit_transform()

所以正确的代码是:

test_vector = vectorizer.transform(test_text)
prediksi = klasifikasi.predict(test_vector)

#Output: array(['organisasi'],  dtype='|S10')
于 2017-06-14T08:08:36.040 回答