Как классифицировать новый текст, используя классификационную модель, построенную в другом проекте? - PullRequest
0 голосов
/ 16 января 2020

В первом проекте я обучил и выбрал модель классификации, которая использует пакет слов с 2500 признаками, но в этом новом проекте я хочу фактически классифицировать новый текст.

Как классифицировать новый текст?

Вот что я делаю:

import pickle

# pickled TfidfVectorizer(max_features=2500)
vectorizer_in = open("vectorizer.pkl", "rb")
vectorizer = pickle.load(vectorizer_in)

# pickled RandomForestClassifier(n_estimators = 200, criterion = 'gini', class_weight="balanced")
classifier_in = open("classifier.pkl", "rb")
classifier = pickle.load(classifier_in)

# import libraries to clean the text
import re
import nltk
nltk.download('stopwords')
from nltk.corpus import stopwords
from nltk.stem import SnowballStemmer
stemmer = SnowballStemmer('italian')
stopwords_set = set(stopwords.words('italian'))

# clean the input string
def cleanRow(row):
    row = re.sub('[\n|\r]', ' ', row)
    # regex here ...
    row = row.split()
    row = [stemmer.stem(word) for word in row if not word in stopwords_set]
    row = ' '.join(row)
    return row

def classify(summary, description):
    corpus = cleanRow(summary + " " + description)
    X_test = vectorizer.fit_transform([corpus]).toarray()
    print(vectorizer.get_feature_names()) # ['cas', 'computer', 'cos', 'funzion', 'part', 'pc', 'pi', 'tav']
    y_pred = classifier.predict(X_test)
    # TODO map y_pred to the right label
    return y_pred

out = classify("il computer non parte", "Stavo facendo cose a caso e non mi funziona più il pc.")
print(out)

Это сгенерированная ошибка:

X has 8 features per sample; expecting 2500

Действительно

vectorizer.get_feature_names()
# ['cas', 'computer', 'cos', 'funzion', 'part', 'pc', 'pi', 'tav']

, но я хочу, чтобы исходные метки были в том же порядке, в котором модель была создана и обучена .

Должен ли я выбрать исходный массив функций и вручную перестроить новую таблицу пакетов слов для нового текста, который я хочу классифицировать?

1 Ответ

1 голос
/ 16 января 2020

Как сказано в комментарии: «в функции классификации вы должны использовать vectorizer.transform, а не fit_transform».

Использование

X_test = vectorizer.transform([corpus]).toarray()

решает проблему, так как он снова не соответствует модели, а только создает матрицу терминов в качестве входных данных классификации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...