Модель SVM для одного класса для классификации текста (scikit-learn) - PullRequest
0 голосов
/ 29 февраля 2020

Я пытаюсь классифицировать набор текстов для прогнозирования похожих текстов в тестовом наборе текстов. Я использую модель one_class_svm. «author_corpus» содержит список текстов, написанных одним автором, а «test_corpus» содержит список текстов, написанных как другими авторами, так и оригинальным автором. Я пытаюсь использовать one_class_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

Как мне реализовать эту модель, чтобы точно предсказать авторство текстов в тестовом наборе, заданных одним автором в наборе поездов? Любая помощь приветствуется.

Для справки приведена ссылка на руководство по модели one_class_svm: https://scikit-learn.org/stable/modules/generated/sklearn.svm.OneClassSVM.html#sklearn .svm.OneClassSVM

1 Ответ

1 голос
/ 29 февраля 2020

Вы должны fit (обучить) модель на данных train и делать прогнозы, используя обученную модель на данных test.

  • fit: подходит (тренирует) модель
  • fit_transform: подходит для модели и затем делает прогнозы
  • transform: делает предсказания

Вы делаете ошибку:

test_vectors = vectorizer.fit_transform (test_corpus)

Пример использования

from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer

train = fetch_20newsgroups(subset='train', categories=['alt.atheism'], shuffle=True, random_state=42).data
test =  fetch_20newsgroups(subset='train', categories=['alt.atheism', 'soc.religion.christian'], shuffle=True, random_state=42).data

vectorizer = 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)
...