如何使用在不同项目中构建的分类模型对新文本进行分类?

Posted

技术标签:

【中文标题】如何使用在不同项目中构建的分类模型对新文本进行分类?【英文标题】:How do I classify new text using a classification model built in a different project? 【发布时间】:2020-05-03 01:46:56 【问题描述】:

在第一个项目中,我训练并腌制了一个分类模型,该模型使用具有 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']

但我希望原始特征标签的顺序与创建和训练模型时的顺序相同

我是否应该腌制原始特征数组并为我要分类的新文本手动重建一个新的词袋表?

【问题讨论】:

在分类函数中,你必须使用 vectorizer.transform 而不是 fit_transform.. @qaiser 这解决了问题。没错,没必要再“合身”了 【参考方案1】:

正如评论中所说:“在分类函数中,您必须使用vectorizer.transform 而不是fit_transform”。

使用

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

解决了这个问题,因为它不再拟合模型,而只是创建术语矩阵作为分类的输入。

【讨论】:

以上是关于如何使用在不同项目中构建的分类模型对新文本进行分类?的主要内容,如果未能解决你的问题,请参考以下文章

使用 sklearn DBSCAN 模型对新条目进行分类

如何在 Weka Explorer 中应用分类器?

文本分类/分类算法[关闭]

MATLAB:使用 fitctree 训练的分类器对新数据进行标签预测

尝试使用带有 Weka 的 Java 对新实例进行分类时出错 - 未定义输出实例格式

使用新数据测试文本分类 ML 模型失败