Advertisement

tf计算矩阵维度_机器学习(5:unigram/tfidf矩阵的存储和调用)

阅读量:

弄了一天解决了

用过sklearn进行机器学习的小伙伴都清楚,sklearn的模型大多通过某一矩阵进行学习和预测,一旦新的数据同训练数据结构不同,则无法进行运算,那么在自然语言处理中就要保证训练集、测试集和开发集的unigram,tfidf矩阵维度相同,所以也需要sklearn得到的矩阵相同,昂,反正遇到过问题懂的自然懂,不懂的以后遇到了也会懂再回来看也不迟。

数据描述:

X为[('xxxxxx',cls),('xxxxxx',cls),......]形状的列表,其中'xxxxxx'为分词后的语料(以空格分割),cls为该样例的分类

建立并存储tfidf矩阵生成模型的代码如下:

from sklearn.feature_extraction.text import CountVectorizer,TfidfTransformer

from sklearn.externals import joblib

def getTfIdfMat(X):

X=[messageItem.tolist()[0] for messageItem in X]

#注意一定要加上decode_error="replace",用以覆盖之前特征

countModel= CountVectorizer(stop_words = 'english', decode_error="replace",max_df = 0.5)

xCount = countModel.fit_transform(X)#注意这里使用fit_transform

joblib.dump(countModel,"countMat/TMCountMat.model")#注意unigram保存的是模型不是矩阵

tfidfModel = TfidfTransformer().fit_transform(xCount)

joblib.dump(tfidfModel,"countMat/TMTfidfMat.model")#注意tfidf保存的是模型不是矩阵

return xTfidf

重新调用模型的代码如下:

from sklearn.externals import joblib

def predictFromSent(mySent):

print("-loading models ...")#读取模型

myModel=joblib.load("TMmodels/MBModel.model")

countModel=joblib.load("countMat/TMCountMat.model")

tfidfModel=joblib.load("countMat/TMTfidfMat.model")

print("-transforming tfidf matrix ...")

mySentArr=[mySent]

xCount=countModel.transform(mySentArr)#注意使用的是transform

xTfidf=tfidfModel.transform(xCount)#注意使用的是transform

#至此得到的xTfidf就是新的tfidf矩阵

#==================以下部分不用看===========

print("-predicting ...")

myResult=myModel.predict(xTfidf)

return myResult

注:

一、fit,fit_transform,transform

fit()仅训练,不预测,即能够训练出模型参数,但是无法返回需要的矩阵

transform()仅预测,不训练,即能返回矩阵,但无法训练出模型参数,因此在使用前需要保证模型已经fit

fit_transform先训练后预测,可返回矩阵也可训练处模型参数

二、存储和读取模型可使用pickle也可使用joblib,区别不大,根据个人喜好

全部评论 (0)

还没有任何评论哟~