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

我正在考虑在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.


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

最佳答案

错误是由于以下这一行:

prediksi = klasifikasi.predict([test_vector])


大多数scikit估计器需要一个形状为[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')

07-24 09:38
查看更多