我得到了以下代码,将文本转换为tf:
...
x_train, x_test, y_train, y_test = model_selection.train_test_split(dataset['documents'],dataset['classes'],test_size=test_percentil)
#Term document matrix
count_vect = CountVectorizer(ngram_range=(1, Ngram), min_df=1, max_features=MaxVocabulary)
x_train_counts = count_vect.fit_transform(x_train)
x_test_counts=count_vect.transform(x_test)
#Term Inverse-Frequency
tf_transformer = TfidfTransformer(use_idf=True).fit(x_train_counts)
lista=tf_transformer.get_params()
x_train_tf = tf_transformer.transform(x_train_counts)
x_test_tf=tf_transformer.transform(x_test_counts)
...
然后,我训练模型并使用泡菜将其保存。 当我在另一个程序中尝试预测新数据时,就会出现问题。 基本上,我得到了:
count_vect = CountVectorizer(ngram_range=(1, 1), min_df=1, max_features=None)
x_counts = count_vect.fit_transform(dataset['documents'])
#Term Inverse-Frequency
tf_transformer = TfidfTransformer(use_idf=True).fit(x_counts)
x_tf = tf_transformer.transform(x_train_counts)
model.predict(x_tf)
执行此代码时,输出为
ValueError:每个样本X具有8933个功能;期待7488
我知道这是TfIdf表示形式的问题,并且我听说我需要使用相同的tf_transformer和vectorizer来获得预期的输入形状,但是我不知道如何实现这一点。 我可以存储其他的转换器和矢量化器,但是我尝试使用不同的组合,但一无所获。
答案 0 :(得分:1)
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.externals import joblib
a = pd.Series(["hello, this is me", "hello this is me too"])
b = pd.Series(["hello, this is John", "hi it's Doe"])
tfidf = TfidfVectorizer().fit(a)
joblib.dump(tfidf, 'path_to/tfidf.pkl')
tfidf = joblib.load('path_to/tfidf.pkl')
tfidf.transform(b).todense()
答案 1 :(得分:0)
在另一个程序中,您将实例化一个新对象,该对象将不知道以前的数据有那么多列。
您需要以与保存模型相同的方式保存CountVectorizer
和TfidfTransformer
,并以相同的方式将它们加载到另一个程序中。
此外,您可以仅使用TfidfVectorizer而不是CountVectorizer + TfidfTransformer,因为它可以完成合并的工作,并且可以使您的工作(保存和加载它们更加容易)。
所以在训练过程中要这样做:
...
x_train, x_test, y_train, y_test = model_selection.train_test_split(dataset['documents'],dataset['classes'],test_size=test_percentil)
#Term document matrix
tf_vect = TfidfVectorizer(ngram_range=(1, Ngram), min_df=1, max_features=MaxVocabulary, use_idf=True)
x_train_tf = tf_vect.fit_transform(x_train)
x_test_tf = tf_vect.transform(x_test)
...