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,区别不大,根据个人喜好
