我正在尝试对一组训练文本进行分类,以便用于预测测试文本集中的相似文本。我使用的是单类SVM模型。’author_corpus’包含由单一作者撰写的文本列表,而’test_corpus’包含由其他作者和原作者撰写的文本列表。我试图使用单类SVM来识别测试文本中的作者。
def analyse_corpus(author_corpus, test_corpus): vectorizer = TfidfVectorizer() author_vectors = vectorizer.fit_transform(author_corpus) test_vectors = vectorizer.fit_transform(test_corpus) model = OneClassSVM(gamma='auto') model.fit(author_vectors) test = model.predict(test_vectors)
我遇到了如下值错误:
X.shape[1] = 2484 should be equal to 1478, the number of features at training time
考虑到训练集中只有单一作者,如何实现这个模型以准确预测测试集中文本的作者身份?任何帮助都将不胜感激。
供参考,这是单类SVM模型指南的链接:https://scikit-learn.org/stable/modules/generated/sklearn.svm.OneClassSVM.html#sklearn.svm.OneClassSVM
回答:
您应该在train
数据上fit
(训练)模型,并使用训练好的模型在test
数据上进行预测。
fit
:拟合(训练)模型fit_transform
:拟合模型然后进行预测transform
:进行预测
您犯的错误是
test_vectors = vectorizer.fit_transform(test_corpus)
样例用法
from sklearn.datasets import fetch_20newsgroupsfrom sklearn.feature_extraction.text import TfidfVectorizertrain = fetch_20newsgroups(subset='train', categories=['alt.atheism'], shuffle=True, random_state=42).datatest = fetch_20newsgroups(subset='train', categories=['alt.atheism', 'soc.religion.christian'], shuffle=True, random_state=42).datavectorizer = TfidfVectorizer()train_vectors = vectorizer.fit_transform(train)test_vectors = vectorizer.transform(test)model = OneClassSVM(gamma='auto')model.fit(train_vectors)test_predictions = model.predict(test_vectors)